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

前言

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算法的有效性和合理性;

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

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

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SM2是一种国密算法,用于数字签名和加密。在Python中,可以使用pycryptodome库来实现SM2算法。以下是一个简单的示例代码,说明如何使用pycryptodome库来进行SM2数字签名和验证。 首先,需要安装pycryptodome库。可以使用pip命令来安装: ``` pip install pycryptodome ``` 接下来,可以使用以下代码来进行SM2数字签名和验证: ```python from Crypto.PublicKey import ECC from Crypto.Hash import SHA256 from Crypto.Signature import DSS from Crypto.Util.Padding import pad, unpad from binascii import hexlify, unhexlify # 生成SM2密钥对 key = ECC.generate(curve='sm2') private_key = key.export_key(format='DER') public_key = key.public_key().export_key(format='DER') # 明文消息 message = b'hello world' # 计算消息的哈希值 hash_obj = SHA256.new(message) # 使用私钥对消息进行签名 signer = DSS.new(key, 'fips-186-3') signature = signer.sign(hash_obj) # 使用公钥对签名进行验证 verifier = DSS.new(key.public_key(), 'fips-186-3') try: verifier.verify(hash_obj, signature) print("Signature is valid.") except ValueError: print("Signature is invalid.") ``` 在上面的代码中,首先使用ECC.generate()函数生成SM2密钥对,然后计算明文消息的哈希值,并使用私钥对消息进行签名。最后,使用公钥对签名进行验证,如果验证通过,则说明签名是有效的。 需要注意的是,SM2算法使用的密钥长度较长,因此计算速度较慢。在实际应用中,需要根据具体情况来选择合适的密钥长度和算法。另外,由于SM2算法是一种国密算法,因此需要遵守相关的法律法规。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值