RC4加密

基本原理

对称密码中的流密码,即逐字节加密

密钥长度可变,面向字节操作

它以一个足够大的表S为基础,对表进行非线性变换,产生密钥流

线性变换,类似于x通过ax+b得到y,函数图形是直线,这个就是线性

加密过程

  • 初始化S表

    1.对S表进行线性填充,一般为256个字节

    即s[0]=0 s[1]=1……s[255]=255

    2.用种子密钥对另一个256字节的k表进行填充

    密钥长度可变指的就是这个种子密钥

    如果种子密钥长度为256就刚刚好赋值给k

    如果种子密钥长度小于256就循环使用,直到把k填满

    3.用k表对s表进行初始置换

    置换函数

    j=0
    for i in range(0,256):
        j=(j+s[i]+k[i])%256
        s[j],s[i]=s[i],s[j]
    

    s[j]和s[i]的值进行交换

    这个k[i]在实际过程中就是用密钥对此进行填充

    key='aaaa'
    k=list(range(256))
    for i in range(0,256):
        k[i]=key[i%len(key)]
    

    在实际使用过程中可以更简洁

  • 密钥流的生成(为每个待加密的字节生成一个伪随机数,用来异或)

    一旦s表初始化完成,种子密钥就不再被使用

    找伪随机数的函数

    text="xxx"#明文
    s=[1,2,3]
    k=[]
    i=j=0
    for r in (text):
        i=(i+1)%256
        j=(j+s[i])%256
        s[i],s[j]=s[j],s[i]
        t=(s[i]+s[j])%256
        k[r]=s[t]
    

    k为伪随机数数组,然后使用这个数组的元素与明文对应的下标一个个进行异或,就可以得到密文

    完整脚本

    import base64
    
    
    def rc4_main(key='init_key',message='init_message'):
        s_box=init_box(key)
        encrypt=rc4_encrypt(message,s_box)
        return encrypt
    
    def init_box(key):
       s_box=list(range(256))#对s表进行线性填充
       j=0
       for i in range(0,256):
           j=(j+s_box[i]+ord(key[i % len(key)])) % 256
           s_box[j],s_box[i]=s_box[i],s_box[j]
       return s_box
    
    def rc4_encrypt(message,s_box):
        result=[]
        i=j=0
        for s in (message):
            i=(i+1) % 256
            j=(j+s_box[i]) % 256
            s_box[i],s_box[j]=s_box[j],s_box[i]
            t=(s_box[i]+s_box[j])%256
            k=s_box[t]
            res=chr(ord(s)^k)
            result.append(res)
        cipher=''.join(result)
        # 由于加密后的字符有些不可见,所以使用base64编码一次,也可以url编码
        return str(base64.b64encode(cipher.encode('utf-8')),'utf-8')
    
    key='v2ish1yan'
    message=input('请输入要加密的字符串')
    rc4_res=rc4_main(key,message)
    print(rc4_res)
    
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

v2ish1yan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值