# 1.初始化S表
s = list(range(256))
# 2.用种子密钥来填充k表
k = []
# 输入种子密钥,填充K表
seed = input("请输入连续数字的种子密钥:")
key_seed = [int(c) for c in seed]
length_ks = len(key_seed)
if length_ks >= 255:
for i in range(0, 256):
k.append(key_seed[i])
else:
for i in range(0, 256):
# 如果长度大于255
if i < length_ks:
k.append(key_seed[i])
else:
# 如果种子长度小于255,需要循环进行填充
k.append(key_seed[i % length_ks])
# 用K表对S表进行置换
j = 0
for i in range(0, 256):
j = (j + s[i] + k[i]) % 256
# 交换S表中两个位置的变量
s[i], s[j] = s[j], s[i]
# 密钥形成了,下一步形成流密钥
def ral_key(length):
"""
用来形成最后真正的流密钥
:param length: 需要加密的明文长度
:return: rk[]需要异或的真正的流密码
"""
global s # 使用全局的S盒
rk = [] # 记录真正的流密钥
i = j = 0
# 将s盒进行复制,防止操作修改全局S盒,因为python是引用传递
s_copy = s.copy()
for r in range(0, length):
i = (i + 1) % 256
j = (j + s_copy[i]) % 256
# 交换i与j之间的s表值
s_copy[i], s_copy[j] = s_copy[j], s_copy[i]
t = (s_copy[i] + s_copy[j]) % 256
rk.append(s_copy[t])
return rk
def RC4(text):
"""
加密函数,使用密钥流对明文进行异或
:param text: 加密的明文字符串
:return: 密文
"""
# 明文转字节列表
text_bytes = [ord(c) for c in text]
# 生成等长流密钥
rk = ral_key(len(text_bytes))
# 异或加密
mi_text = []
for i in range(len(text_bytes)):
mi_text.append(text_bytes[i] ^ rk[i]) # 修正:异或操作,用append
return mi_text
def De_RC4(mi_text):
"""
解密函数
:param rk: 加密的流密钥
:param mi_text: 密文
:return: 明文
"""
# 生成相同流密钥(需要相同的初始S盒,所以real_key会复制S盒)
rk = ral_key(len(mi_text))
# 异或解密(与加密相同操作)
ming_text = []
for i in range(len(mi_text)):
ming_text.append(mi_text[i] ^ rk[i])
# 字节转字符串
return ''.join(chr(b) for b in ming_text)
if __name__ == "__main__":
print("\n" + "="* 50)
# 输入明文
plaintext = input("请输入要加密的明文:")
# 加密
cipher = RC4(plaintext)
print(f"\n加密完成!")
print(f"密文长度:{len(cipher)} 字节")
print(f"密文(hex):", ''.join(f'{b:02x}' for b in cipher))
print(f"密文(数字):{cipher}")
# 加密
print("\n" + "-"*50)
decryted = De_RC4(cipher)
print(f"解密完成!")
print(f"解密结果:{decryted}")
# 验证
if decryted == plaintext:
print("\n√ 验证成功:解密结果与原文一致!")
else:
print("\n× 验证失败!")
|