说明
RC4算法的详细说明在这里!
在上机实验知道要求实现RC4算法的时候,就看了一下老师发的RC4相关资料,然后整个人都是懵的……随后找到了大佬的博客跟老师的指导资料共同作为参考写出了简易的python实现代码。
代码
废话不多说,直接上代码
说明参考,可以借鉴大佬的博客https://www.cnblogs.com/gambler/p/9075415.html
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Description: RC4对称加密、解密
# Author: Afeng
# Date: 2019/11/2
# Reference: https://www.cnblogs.com/gambler/p/9075415.html
"""
RC4加密、解密算法
# 说明:
* 依照如上链接思想实现对明文进行RC4加密、解密操作
# 实现说明:
* 在本代码中,通过ord()将用户的输入转化为ascii码值,而后由该码值进行RC4加解密操作
"""
# RC4加密(与用户输入进行交互)
def encrypt(tmp, message):
tmp = list(map(lambda x: ord(x), tmp))
message = list(map(lambda x: ord(x), message))
# ###初始状态向量S(256字节)### #
S = list(range(0, 256))
key = [] # 存储秘钥流
T = [] # 临时向量T
# ###按照用户数据填充T### #
while len(T) < 256:
T.extend(tmp)
while len(T) != 256:
T.pop()
# ###对状态向量S进行置换操作### #
j = 0
for i in range(0, 256):
j = (j + S[i] + T[i]) % 256
S[i], S[j] = S[j], S[i]
# ###秘钥流的生成### #
i, j = 0, 0
for i in range(len(message)):
i = (i + 1) % 256
j = (j + S[i]) % 256
S[i], S[j] = S[j], S[i]
t = (S[i] + S[j]) % 256
key.append(S[t])
# ###对明文加密(异或运算)### #
secretary = list(map(lambda x, y: x ^ y, message, key))
return secretary, key
# RC4解密(使用key与密文进行异或解密)
def decrypt(secretary, key):
message = list(map(lambda x, y: chr(x ^ y), secretary, key))
return ''.join(message)
if __name__ == '__main__':
t = list(input("请输入初始秘钥:"))
m = list(input("请输入需要加密的明文:"))
s, k = encrypt(t, m)
print('经过加密解密后得到的明文:', decrypt(s, k))