首页 > 解决方案 > 我如何解决这个 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 个字符作为下一个字节。

一旦你让伪随机生成器工作,剩下的就很简单了:

  • 遍历明文
  • 将每个字符与伪随机生成器的密钥流的下一个字节进行异或
  • 以密文形式返回结果!

标签: pythonencryptionrc4-cipher

解决方案


推荐阅读