本文最后更新于438 天前,其中的信息可能已经过时,如有错误可以直接在文章下留言
附上我bilibili看的视频,讲的很好。
RC4加密算法的过程 代入例子计算_哔哩哔哩_bilibili
这篇文章也是按照这个视频的内容来写的,不过是依据我自己的理解。
首先RC4加密算法执行有一个S盒,T表,一个密钥K,和一个被加密的明文。
RC4加密算法的第一步就是初始化S盒和T表,我们假设给出的密钥K为19034530,那么初始化赋值的C语言代码如下:
for(i=0;i<256;i++)
{
S[i]=i
T[i]=K[i%strlen(key)]
}
嗯这里倒是很好理解,S盒显然是0到255的所有数字,T表则是密钥一直循环排布,它的长度显然也是0到255
如上面那个视频,如图
第二步则是一个初始的置换,其C语言代码如下:
j=0
for(i=0;i<256;i++)
{
j=(j+S[i]+T[i])%256
swap=(S[i],S[j])
}
因为密钥是独特的,T表是独特的,那么这个步骤就可以根据T表打乱出一个独特的S盒来,这个不好演示。
最后一步则是得到密钥流k,再让明文与密钥流异或得到密文。密钥和密钥流是两个不同的概念,我简单问了一下AI,如图
得到密钥的C语言代码如下:
i=j=0
for(h=0;h<datalen;h++)
{
i=(i+1)%256
j=(j+S[i])%256
swap(S[i],S[j])
t=(S[i]+S[j])%256
k=S[t]
D[h]^=k
}
这一步显然,就是边打乱S盒,边加密。上面的datelen指的是待加密明文的长度,D表示明文。
RC4加密算法是可逆的,可以通过密文得到其明文,那么我们就要思考解密过程为什么是可以实现的
在只知道密文和密钥的情况下,S盒是固定的,而根据密钥得到的T表也是唯一的,所以我们还是可以的到在加密时与明文异或的密钥流k,异或运算可逆,那么在进行异或运算即可得到明文。
下面是解出密文的一个脚本
from Crypto.Cipher import ARC4
mingwen=[]
arrBytes=bytes(mingwen)
key=b''
enc=ARC4.new(key)
flag=enc.decrypt(arrBytes)
print(flag)
或者在Cyberchef里面也是可以解密的。
下面是一道例题