python - 我如何解决这个 rc4 加密
问题描述
def get_prg(plaintext_size, k):
j = 0
S = list(range(32))
for i in range(32):
j = (j + S[i] + ord(k[i % len(k)])) % 32
S[i], S[j] = S[j], S[i]
return S
def fake_rc4(plaintext, keystream):
i = 0
j = 0
i = (i + 1) % 32
j = (j + keystream[i]) % 32
keystream[i], keystream[j] = keystream[j], keystream[i]
t = (keystream[i] + keystream[j]) % 32
return t
我最后需要返回一个密文。在fake_rc4
我返回密钥流的索引。在另一个函数中,我如何在纯文本上使用 xor 对文本进行编码?
由于锻炼,我使用 mod 32 而不是 256。
这是练习:
编写流密码 fake-RC4:实现一个函数 encrypt 给定一个明文和一个 32 字节的密钥
k
,返回一个用我们在这里描述的 RC4 的弱变体加密的密文。首先,实现 fake-RC4 伪随机生成器 (PRG):
它以 , 开头
i = j = 0
,并在密钥流中生成下一个字节:
- 以 1 为增量
i
(模 32),j
按键的 第 th 个字符递增i
(模 32),i
将键的第 th 字符与其 第 th 字符交换j
,- 添加
i
键的第 th 个字符及其j
第 th 个字符,取模32
,并返回该索引处的键的字符。因此,例如,如果
i
键的第 th 个字符是'a'
(其 ASCII 值为97
),并且其j
第 th 个字符是'3'
(其 ASCII 值为51
),则它们的总和为148
。对密钥的长度取模,结果将为148 % 32 = 20
,因此伪随机生成器将返回20
密钥的第 th 个字符作为下一个字节。一旦你让伪随机生成器工作,剩下的就很简单了:
- 遍历明文
- 将每个字符与伪随机生成器的密钥流的下一个字节进行异或
- 以密文形式返回结果!
解决方案
推荐阅读
- api - 用于在服务之间发送文件的 REST API
- c++ - . 链表 , 反向 函数 , 数据 结构 ;
- xml - 当标签的url部分时如何提取Oracle XML
- javascript - ReactJS:错误:超过最大更新深度
- python - 无法使用 Django-cron 进行函数调用
- excel - Excel 创建新工作簿并复制现有工作簿表
- reactjs - 当访问正确的 url 并且用户未登录时,如何使我的 React 组件挂载?
- linux - 共享库符号冲突和静态链接(在 Linux 上)
- python - 不明白 x != " " 的用法
- python - 使用 PyInstaller 在 MSYS2/MinGW 中编译 GTK 软件的问题