今天來學習對稱式加密的資料串流加密演算法-RC4
此演算法的金鑰可成可短,首先先初始化一個S盒,然後透過偽隨機生成算法,不斷透過交換S盒的元素並計算K值來計算偽隨機密鑰流
def KSA(key):
"""密鑰調度算法 (KSA) - 初始化S盒"""
key_length = len(key)
S = list(range(256))
j = 0
for i in range(256):
j = (j + S[i] + key[i % key_length]) % 256
S[i], S[j] = S[j], S[i] # 交换S[i]和S[j]
return S
def PRGA(S, length):
"""偽隨機生成算法 (PRGA) - 生成偽隨機密鑰流"""
i = 0
j = 0
keystream = []
for _ in range(length):
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i] # 交换S[i]和S[j]
k = S[(S[i] + S[j]) % 256]
keystream.append(k)
return keystream
使用RC4演算法對給定的明文進行加密。它透過產生偽隨機金鑰流,然後將明文與金鑰流進行XOR運算,以產生密文
反之,將密文與金鑰進行XOR運算,便可解密出明文
def RC4(key, plaintext):
"""RC4加密"""
S = KSA(key)
keystream = PRGA(S, len(plaintext))
ciphertext = []
for i in range(len(plaintext)):
ciphertext_byte = plaintext[i] ^ keystream[i]
ciphertext.append(ciphertext_byte)
return bytes(ciphertext)
def RC4_decrypt(key, ciphertext):
"""RC4解密"""
return RC4(key, ciphertext) # RC4加密和解密使用相同的算法
if __name__ == "__main__":
key = b"hahaha" # 密鑰(二進制)
plaintext = "Hello" # 要加密的明文
ciphertext = RC4(key, plaintext.encode())
print("密文:", ciphertext)
decrypted_text = RC4_decrypt(key, ciphertext)
print("明文:", decrypted_text.decode())
密文: b'3\x13\x16\x06\\'
明文: Hello
心得:雖然這個加密方法後來被廢掉了...但還是流行了一段時間,教師節快樂~~