• RC4加密算法


    RC4Ron Rivest在1987年设计的密钥长度可变的流加密算法。它加解密使用相同的密钥,因此也属于对称加密算法。RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一。由于RC4算法存在弱点,RFC 7465规定禁止在TLS中使用RC4加密算法[1]

    RC4由伪随机数生成器和异或运算组成。RC4的密钥长度可变,范围是[1,255]。RC4一个字节一个字节地加解密。给定一个密钥,伪随机数生成器接受密钥并产生一个S盒。S盒用来加密数据,而且在加密过程中S盒会变化。

    由于异或运算对合性,RC4加密解密使用同一套算法。

    伪随机数生成器:

    初始化长度为256的S盒。第一个for循环将0到255的互不重复的元素装入S盒。第二个for循环根据密钥打乱S盒。

    def rc4_init(sBox, key, length):
        '''
        param1: 一个256长度的str数组,
        param2: 密钥,可以随便定义,长256
        param3: 密钥的长度,
        '''
        i, j = 0, 0
        k = [0] * 256
        temp = 0
        for i in range(256):
            sBox[i] = i
            k[i] = key[i%length]
        for i in range(256):
            j = (j + sBox[i] + k[i])%256
            temp = sBox[i]
            sBox[i] = sBox[j]
            sBox[j] = temp
    
        return

    在初始化的过程中,密钥的主要功能是将S-box搅乱,i确保S-box的每个元素都得到处理,j保证S-box的搅乱是随机的。而不同的S-box在经过伪随机子密码生成算法的处理后可以得到不同的子密钥序列,将S-box和明文进行xor运算,得到密文,解密过程也完全相同。

    def rc4_crypt(sBox, data, length):
        '''
        param1: 被搅乱的S-box
        param2: 需要加密的数据
        param3: data的长度
        '''
        for k in range(length):
            i = (i + 1) % 256
            j = (j + sBox[i]) % 256
            temp = sBox[i]
            sBox[i] = sBox[j] #交换s[i] 和 s[j]
            sBox[j] = temp
            t = (s[i] + s[j]) % 256
            data[k] ^= s[t] #与或运算
        return

    此算法保证每256次循环中S盒的每个元素至少被交换过一次。

    参考文献:

    维基百科:http://zh.wikipedia.org/wiki/RC4

  • 相关阅读:
    (4.24~4.30)
    (4.17~4.23)
    (4.10~4.16)
    FFT题集
    kd树的构造与搜索
    schtasks命令
    关于[WinError 10054] 远程主机强迫关闭了一个现有的连接。
    数据去重复
    将ppt文档转换成pdf
    mvc上传
  • 原文地址:https://www.cnblogs.com/maverick-fu/p/4347209.html
Copyright © 2020-2023  润新知