前言
RC4比较简单,放篇实验报告水一波(滑稽脸)
正文
序列密码之RC4算法
简述
在密码学中,RC4是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。RC4软件容易实现,密钥长度可变,简单,但也很有效果。RC4 算法广泛应用于 SSL/TLS 协议和 WEP/WPA 协议。
代码分析
RC4主要分为三个步骤,初始化 S 和 T 数组,初始化置换 S,生成密钥流。
初始化S盒和T向量(初始化S和T)
先初始化S,同时建立一个临时数组向量T,如果种子密钥的长度为256字节,则直接将K赋值给T,否则若种子密钥K的长度小于256,则将K的值赋给T的前|K|个元素,并不断重复加载K的值直到T被填满。将S和T分别存储在列表S1和T1里;
def init_S_T(s1,t1,k1):
"""初始化S,T"""
for i in range(256):
s1.append(i)
t1.append(k1[i%len(k1)])
KSA密钥调度算法(置换S)
用来打乱S盒的初始排列顺序;
def update_s(s2,t2):
"""更新S"""
j=0
for i in range(256):
j=(j+s2[i]+t2[i])%256
s2[i],s2[j]=s2[j],s2[i]
PRGA伪随机生成算法(生成密钥流)
生成密钥流存储在flow1列表中;
def secret_flow(s3,p1,flow1):
"""生成密钥流"""
i=0
j=0
for x in range(len(p1)):
i=(i+1)%256
j=(j+s3[i])%256
s3[i],s3[j]=s3[j],s3[i]
t=(s3[i]+s3[j])%256
flow1.append(s3[t])
加密
将密钥流与明文字节异或得出密文
def plain_flow(p2,flow2,c):
"""生成密文"""
for i in range(len(p2)):
temp=(flow2[i]^ord(p2[i]))
temp1=hex(temp)
c.append(temp1[2:])
解密
将密钥流与密文字节异或得出明文
def decode_rc4(c1,flow3,p_flow):
"""解密"""
for i in range(len(c1)):
temp2=int("0x"+c1[i],16)
p_flow.append(chr(flow3[i]^temp2))
完整代码
# -*- coding: utf-8 -*-
def init_S_T(s1,t1,k1):
"""初始化S,T"""
for i in range(256):
s1.append(i)
t1.append(k1[i%len(k1)])
def update_s(s2,t2):
"""更新S"""
j=0
for i in range(256):
j=(j+s2[i]+t2[i])%256
s2[i],s2[j]=s2[j],s2[i]
def secret_flow(s3,p1,flow1):
"""生成密钥流"""
i=0
j=0
for x in range(len(p1)):
i=(i+1)%256
j=(j+s3[i])%256
s3[i],s3[j]=s3[j],s3[i]
t=(s3[i]+s3[j])%256
flow1.append(s3[t])
def plain_flow(p2,flow2,c):
"""生成密文"""
for i in range(len(p2)):
temp=(flow2[i]^ord(p2[i]))
temp1=hex(temp)
c.append(temp1[2:])
def decode_rc4(c1,flow3,p_flow):
"""解密"""
for i in range(len(c1)):
temp2=int("0x"+c1[i],16)
p_flow.append(chr(flow3[i]^temp2))
def main():
print 8*"*"+" Encrypt Input "+8*"*"
k=raw_input("Please enter the key:")
key=k.split(" ")
key=[int(key[i]) for i in range(len(key))]
plain=raw_input("Please enter the plain:")
s=[]
t=[]
k_flow=[]
c_flow=[]
p_flow=[]
init_S_T(s,t,key)
update_s(s,t)
secret_flow(s,plain,k_flow)
plain_flow(plain,k_flow,c_flow)
print 8*"*"+" Encryption "+8*"*"
# print("置乱后的s盒:")
# print(s)
print("密钥流:")
print(k_flow)
print("Cipher:")
# print c_flow
print"".join(c_flow) #加密后输出密文
decode_rc4(c_flow,k_flow,p_flow) #解密后输出明文
print "\n"+8*"*"+" Decryption "+8*"*"
print("Plain:")
print"".join(p_flow)
if __name__ == '__main__':
main()
运行结果及正确性
输入8个字符的明文化成ASCII码,再转化为比特流,与得到的密钥比特流进行逐位异或,结果化成16进制得到如下密文;将密文化为比特流再与原来的密钥流进行异或,得到明文比特流,继续转化为字符得到原来的字符hellocumt;所以算法正确性得到了验证;
安全性分析
设计流密码的一个重要步骤就是设计密钥流生成器,主要安全要求就是:
1.密钥流的周期要足够大;
2.还要使得密钥流具有随机统计特性;
3.密钥流的部分暴露时,序列不可被推算出来,就是序列的线性不可预测性大;
一般来说,密钥序列的随机特性越好,加密的安全性也就越高;RC4的密钥生成随机特性良好,周期足够大;至今对RC4的攻击都停留在理论上,在实践上并不能对RC4构成威胁;
有效性和合理性分析
由于RC4具有良好的随机特性和抵抗各种分析的能力,密钥流随机特性较好,因此在众多领域里RC4都得到了广泛的运用;例如:无线局域网标准的WEP协议就是利用RC4对数据进行加密,保障了无线通信信号的完整性和保密性,防止了不法分子对网络的非授权访问;这样的现实应用直接证实了RC4算法的有效性和合理性;
算法编写过程中遇到的问题及解决
编写过程中一开始解密不对,经过学习发现是一个简单的错误,那就是序列密码是对称加密算法,加密解密需要用到相同的密钥,所以每次如果明文和种子密钥不一样的话,解