RC4
1、初始化状态向量 S(256 个字节,用来作为密钥流生成种子 1)按照升序给每个字节赋值
2、初始密钥由用户输入,长度任意,如果长度小于 256 字节则进行轮转,直到填满,例如密钥是 12345,则填入的是 12345123451234512345…. 这个轮转过程得到的 256 个字节的向量 T 用来作为密钥流生成种子 2
3、密钥流的生成:假设明文长度 datalen = 1024 个字节则:
1 | i=0; |
例题
hgame-week2 notRC4
题目:
1 | #!/usr/bin/env python3 |
writeup:
虽然题目变量名改的乱七八糟的,但是看 OO0o 还是能看出来这是 RC4 加密,OO0o 就是生成 k 的那个过程,最后返回的结果也是 k,O0 就是初始化状态向量 S,在题目的最后把 S 和密文打印了出来
因为 RC4 是异或加密的,明文与密文长度是一致的,密钥的长度也是一致的,flag 最后一个应该是“{”,所以可以通过 “{“ ^ “W” 来得到最后一轮的 k,看一下它在 S 中的位置就得到了 t,又因为 i 表示循环的此时,所以 i 也是已知的
根据 t=(S[i] + S[j]) mod 256; 可以推算出来 j = (t - S[i]) mod 256,这样交换 S[i] 和 S[j] 就把一部分 S 变回上一轮加密的样子了,
根据 j=(j+S[i]) mod 256; 得到上一轮的 j = (j - S[i]) mod 356,同时 i 的值只是减了个 1
这样我们有了 i、j,就能再确定上一轮的 t 的值了
1 | enc=b'\x14\xe3s,\xcbq\xa8\xd1\x86\x12\xba\x9f\x88\xa9J}\xf5\xd8BF\x93x\x94\x8a\xdc\xdb\xa0\xb9O0SeJ^\xc7\xce\xcf\xe3\x1c\x10s\xe2\xb6\xceA\xfd\xd6\x87\x95W' |