密码学课程设计之流密码RC4

本文深入解析RC4流加密算法,涵盖其工作原理、安全性分析、实际应用及代码实现。RC4因其灵活性和效率,在SSL/TLS和WEP/WPA协议中广泛应用。

前言

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;所以算法正确性得到了验证;

FINa2F.png

安全性分析

设计流密码的一个重要步骤就是设计密钥流生成器,主要安全要求就是:

1.密钥流的周期要足够大;

2.还要使得密钥流具有随机统计特性;

3.密钥流的部分暴露时,序列不可被推算出来,就是序列的线性不可预测性大;

一般来说,密钥序列的随机特性越好,加密的安全性也就越高;RC4的密钥生成随机特性良好,周期足够大;至今对RC4的攻击都停留在理论上,在实践上并不能对RC4构成威胁;

有效性和合理性分析

由于RC4具有良好的随机特性和抵抗各种分析的能力,密钥流随机特性较好,因此在众多领域里RC4都得到了广泛的运用;例如:无线局域网标准的WEP协议就是利用RC4对数据进行加密,保障了无线通信信号的完整性和保密性,防止了不法分子对网络的非授权访问;这样的现实应用直接证实了RC4算法的有效性和合理性;

算法编写过程中遇到的问题及解决

编写过程中一开始解密不对,经过学习发现是一个简单的错误,那就是序列密码是对称加密算法,加密解密需要用到相同的密钥,所以每次如果明文和种子密钥不一样的话,解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值