基本原理
对称密码中的流密码,即逐字节加密
密钥长度可变,面向字节操作
它以一个足够大的表S为基础,对表进行非线性变换,产生密钥流
线性变换,类似于x通过ax+b得到y,函数图形是直线,这个就是线性
加密过程
-
初始化S表
1.对S表进行线性填充,一般为256个字节
即s[0]=0 s[1]=1……s[255]=255
2.用种子密钥对另一个256字节的k表进行填充
密钥长度可变指的就是这个种子密钥
如果种子密钥长度为256就刚刚好赋值给k
如果种子密钥长度小于256就循环使用,直到把k填满
3.用k表对s表进行初始置换
置换函数
j=0 for i in range(0,256): j=(j+s[i]+k[i])%256 s[j],s[i]=s[i],s[j]
s[j]和s[i]的值进行交换
这个k[i]在实际过程中就是用密钥对此进行填充
key='aaaa' k=list(range(256)) for i in range(0,256): k[i]=key[i%len(key)]
在实际使用过程中可以更简洁
-
密钥流的生成(为每个待加密的字节生成一个伪随机数,用来异或)
一旦s表初始化完成,种子密钥就不再被使用
找伪随机数的函数
text="xxx"#明文 s=[1,2,3] k=[] i=j=0 for r in (text): i=(i+1)%256 j=(j+s[i])%256 s[i],s[j]=s[j],s[i] t=(s[i]+s[j])%256 k[r]=s[t]
k为伪随机数数组,然后使用这个数组的元素与明文对应的下标一个个进行异或,就可以得到密文
完整脚本
import base64 def rc4_main(key='init_key',message='init_message'): s_box=init_box(key) encrypt=rc4_encrypt(message,s_box) return encrypt def init_box(key): s_box=list(range(256))#对s表进行线性填充 j=0 for i in range(0,256): j=(j+s_box[i]+ord(key[i % len(key)])) % 256 s_box[j],s_box[i]=s_box[i],s_box[j] return s_box def rc4_encrypt(message,s_box): result=[] i=j=0 for s in (message): i=(i+1) % 256 j=(j+s_box[i]) % 256 s_box[i],s_box[j]=s_box[j],s_box[i] t=(s_box[i]+s_box[j])%256 k=s_box[t] res=chr(ord(s)^k) result.append(res) cipher=''.join(result) # 由于加密后的字符有些不可见,所以使用base64编码一次,也可以url编码 return str(base64.b64encode(cipher.encode('utf-8')),'utf-8') key='v2ish1yan' message=input('请输入要加密的字符串') rc4_res=rc4_main(key,message) print(rc4_res)