2017-12-27 314 views
-1

我的代碼引發此錯誤:如何爲python 3實現RC4加密?

Error :  
    j = (j + S[i] + k[i % keyLen]) % 256 
    IndexError: list index out of range 

我的代碼:

#!/usr/bin/python3 
key = 242 

def main(): 

    initializeS(key) 

#Key-Scheduling algorithm used to initialize a permutation in array S 
#Keylength is the number of bytes in the key it can vary from 0 - 256 bytes 
def initializeS(k): 

    k = str(k).encode('utf-8') 
    print(k) 
    keyLen = len(k) 
    S = [] 
    j = 0 

    for i in range(0, 256): 
     j = (j + S[i] + k[i % keyLen]) % 256 
     S[i], S[j] = S[j], S[i] 
return S 

main() 
+1

提供您的代碼並解釋問題是什麼以及您嘗試了什麼,IOW a [mcve],這意味着樣本輸入和輸出,錯誤和錯誤消息。 – zaph

+0

道歉,我已經添加了代碼。謝謝 – Nick

+1

提示:使用中間變量而不是複合語句,如'(j + S [i] + k [i%keyLen])%256'。這樣你就可以確切地知道是什麼導致了錯誤。 – zaph

回答

0

S被初始化爲空列表,所以當S[i]執行該行上,它會因爲列表中有0失敗元素。將S初始化爲至少包含256個元素的列表,因此S[i]對於[0,256)之間的整數i始終有效,並且不會再出現錯誤。

+0

謝謝你的回答! 如果我: 'S = [0] * 256'(I將得到一個陣列充滿256個零) 如果我做: 'S = [] 在範圍C(256): S.append (c)' 我將得到數組'S =(0,1,2,3,.... 255)' 哪一個是正確的? 謝謝 – Nick

+1

兩者都會使代碼執行,但S應該是從0到255的整數列表(包括0和255)。 'S = list(range(256))'是最簡單的方法。 –