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)

运行结果为:

 

posted @ 2022-04-19 20:59  Ciel_12356  阅读(322)  评论(0编辑  收藏  举报