RC4算法及python实现

学习来源: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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。