学习来源:https://www.cnblogs.com/gambler/p/9075415.html
RC4原理
RC4算法包括初始化算法(KSA)和伪随机子密码生成算法(PRGA)两大部分。
初始化状态向量S(256个字节,用来作为密钥流生成的种子1)
s=[x for x in range(256)]
初始化状态向量T并填充(256个字节,用来作为密钥流生成的种子2)
根据初始密钥Key,进行轮转
for i in range(256):
T.append(ord(key[i%len(key)]))
打乱初始种子1(对状态向量S进行置换操作)
j=0
for i in range(256):
j=(j+S[i]+T[i])%256
S[i],S[j]=S[j],S[i]
生成密钥流并加密/解密
i=0
j=0
for x in range(38):
i=(i+1)%256
j=(j+S[i])%256
S[i],S[j]=S[j],S[i]
t=(S[i]+S[j]%256)%256
flag+=chr(m[x]^S[t])
这里是逐个进行异或的,也可以把生成的密钥流保存在列表里,最后再与密文进行异或
图解
889809-20160418145446757-1328061961.png
图片来源:https://www.cnblogs.com/zibility/p/5404478.html
929265-20160620213652444-560250478.jpg
图片来源:https://www.cnblogs.com/block2016/p/5601925.html
BUU EasyProgram
题目
get buf unsign s[256]
get buf t[256]
we have key:whoami
we have flag:????????????????????????????????
for i:0 to 256
set s[i]:i
for i:0 to 256
set t[i]:key[(i)mod(key.lenth)]
for i:0 to 256
set j:(j+s[i]+t[i])mod(256)
swap:s[i],s[j]
for m:0 to 38
set i:(i + 1)mod(256)
set j:(j + S[i])mod(256)
swap:s[i],s[j]
set x:(s[i] + (s[j]mod(256))mod(256))
set flag[m]:flag[m]^s[x]
fprint flagx to file
从给出的txt,可以看出这是一个RC4解密,但我在解密时输出的时候遇到error
'utf-8' codec can't decode byte 0xba in position 1: invalid start byte
在网上查了一下,一直以为是编码的问题,后来发现只要把读取文本文件改为二进制文件就可以了
解题
from Crypto.Util.number import long_to_bytes
S=[x for x in range(256)]
key='whoami'
T=[]
flag=""
mread=open('file.txt',"rb")
m=mread.read()
for i in range(256):
T.append(ord(key[i%len(key)]))
j=0
for i in range(256):
j=(j+S[i]+T[i])%256
S[i],S[j]=S[j],S[i]
i=0
j=0
for x in range(38):
i=(i+1)%256
j=(j+S[i])%256
S[i],S[j]=S[j],S[i]
t=(S[i]+S[j]%256)%256
flag+=chr(m[x]^S[t])
print(flag)
mread.close()