RC4流密码设计
原文链接:https://blog.csdn.net/weixin_44033675/article/details/115983896
一、RC4的定义:
在密码学中,RC4(来自Rivest Cipher4的缩写)是一种流加密算法,密钥长度可变。它加解密使用相同的密钥,因此也属于对称加密算法。RC4是有线等效加密(WEP)中采用的加密算法,从明文输入流逐位或逐字节产生密文。(百科)
流密码结构:
流密码类似于”一次一密”,不同的是”一次一密”使用的是真正的随机数流,而流密码使用的是伪随机数流。
设计流密码的主要因素:
1、加密序列的周期要长,若出现重复的周期过短,容易被破解.
2、密钥流应该尽可能地接近真正随机数流的特征.
3、密钥长度要长,以避免琼穷举攻击.
二、RC4 包含两个主要的算法
1.密钥调度算法KSA
• 将一个随机密钥变换成一个初始置换,然后伪随机数生成算法利用该初始置换生成一个伪随机输出流 。
for i=0 to 255 do {undefined
S[i]=i;
K[i]=Key[i mod L];
}
j=0;
for i=0 to 255 do {undefined
j=(j+S[i]+ K[i mod L]) mod 256 ;
swap(S[i],S[j]);
}
2.伪随机数生成算法PRGA
• 主要完成密钥流的生成
• 密钥流的生成是从S[0]到S[255],对每个S[i],根据当前的值,将S[i]与S中的另一字节置换 i=0; j=0;
while(true) {undefined
i=(i+1)mod 256;
j=(j+S[i])mod 256;
swap(S[i],S[j]);
t=(S[i]+S[j])mod 256;
k=S[t];
}
三、RC4的Python实现
1. 实验目的
通过编程实现流密码算法——RC4算法,加深对流密码体制的了解。
2. 实验内容
根根据流密码RC4的实现原理,实现加密和解密的程序。
(1)设计加密程序:能够根据用户输入明文字节流的内容产生加密的密文字节流并输出
(2)设计解密程序:能够对输入的密文字节流内容解密并输出得到其对应的明文字节流。
3. 实验代码为:
#-*- coding: UTF-8 -*-t import base64 ''' RC4:对称流密码 @author WQ @time 2020/11/25 ''' class RC4(): def __init__(self,key): self.key=key #key密钥 self.keylen=len(self.key) def rc4_init(self): """ 初始化用作加解密的s盒 """ self.sbox_crypto=list(range(256)) self.sbox_decrypto=list() k=[] j=0 #初始化S盒并且用于加密 for i in range(256): k.append(self.key[i%self.keylen]) for i in range(256): j=(j+self.sbox_crypto[i]+ord(k[i]))%256 temp=self.sbox_crypto[i] self.sbox_crypto[i]=self.sbox_crypto[j] self.sbox_crypto[j]=temp #赋值解密S盒 for i in self.sbox_crypto: self.sbox_decrypto.append(i) def rc4_crypt(self,sbox,text): """ args={ sbox:用于加解密的s盒 text:密文或明文 } """ i=j=0 product_text='' datalen=len(text) for k in range(datalen): i=(i+1)%256 j=(j+sbox[i])%256 sbox[i],sbox[j]=sbox[j],sbox[i] t=(sbox[i]+sbox[j])%256 product_text+=(chr(ord(text[k])^sbox[t])) return product_text if __name__ == '__main__': key=input("请输入密钥:") test=RC4(key) test.rc4_init() plaintext=input("请输入加密的数据:") ciphertext=test.rc4_crypt(test.sbox_crypto,plaintext) print("加密后:",ciphertext) #print("解密") plaintext=test.rc4_crypt(test.sbox_decrypto,ciphertext) print("解密后:",plaintext)
运行结果为: