RC4加密算法

RC4Ron Rivest在1987年設計的密鑰長度可變的流加密算法。它加解密使用相同的密鑰,所以也屬於對稱加密算法。RC4是有線等效加密(WEP)中採用的加密算法,也曾經是TLS可採用的算法之一。因爲RC4算法存在弱點,RFC 7465規定禁止在TLS中使用RC4加密算法[1] 算法

RC4由僞隨機數生成器和異或運算組成。RC4的密鑰長度可變,範圍是[1,255]。RC4一個字節一個字節地加解密。給定一個密鑰,僞隨機數生成器接受密鑰併產生一個S盒。S盒用來加密數據,並且在加密過程當中S盒會變化。 數組

因爲異或運算對合性,RC4加密解密使用同一套算法。 加密

僞隨機數生成器: spa

初始化長度爲256的S盒。第一個for循環將0到255的互不重複的元素裝入S盒。第二個for循環根據密鑰打亂S盒。設計

def rc4_init(sBox, key, length):
    '''
    param1: 一個256長度的str數組,
    param2: 密鑰,能夠隨便定義,長256
    param3: 密鑰的長度,
    '''
    i, j = 0, 0
    k = [0] * 256
    temp = 0
    for i in range(256):
        sBox[i] = i
        k[i] = key[i%length]
    for i in range(256):
        j = (j + sBox[i] + k[i])%256
        temp = sBox[i]
        sBox[i] = sBox[j]
        sBox[j] = temp

    return

在初始化的過程當中,密鑰的主要功能是將S-box攪亂,i確保S-box的每一個元素都獲得處理,j保證S-box的攪亂是隨機的。而不一樣的S-box在通過僞隨機子密碼生成算法的處理後能夠獲得不一樣的子密鑰序列,將S-box和明文進行xor運算,獲得密文,解密過程也徹底相同。code

def rc4_crypt(sBox, data, length):
    '''
    param1: 被攪亂的S-box
    param2: 須要加密的數據
    param3: data的長度
    '''
    for k in range(length):
        i = (i + 1) % 256
        j = (j + sBox[i]) % 256
        temp = sBox[i]
        sBox[i] = sBox[j] #交換s[i] 和 s[j]
        sBox[j] = temp
        t = (s[i] + s[j]) % 256
        data[k] ^= s[t] #與或運算
    return

此算法保證每256次循環中S盒的每一個元素至少被交換過一次。htm

參考文獻:blog

維基百科:http://zh.wikipedia.org/wiki/RC4ip

相關文章
相關標籤/搜索