rc4密钥恢复(2条消息,相同的部分密钥)

时间:2012-12-06 14:36:46

标签: stream encryption rc4-cipher

我有两条使用相同的部分密钥加密的邮件。例如:

   C1 = RC4(M1, "(VARIABLE_DATA)XXXXYYYY")
   C2 = RC4(M2, "(VARIABLE_DATA)XXXXYYYY")

是否可以使用RC4,如果已知C1和C2至少恢复“XXXXYYYY”的部分键,因为它永远不会改变?

3 个答案:

答案 0 :(得分:3)

我认为你的问题有些混乱。流密码的工作方式是生成一个密钥流,该密钥流(通常)与消息进行异或。你是正确的,如果你使用相同的密钥和IV,因此使用相同的密钥流,这会泄漏有关消息的信息。

这里,K是RC4生成的密钥流:

  

C1 = K ^ M1

     

C2 = K ^ M2

通过重新排列:

  

C1 ^ C2 =(K ^ M1)^(K ^ M2)

密钥流在这里取消,你就离开了

  

C1 ^ C2 = M1 ^ M2

由于攻击者知道两个密文值,他可以计算两个消息的差异。如果攻击者知道其中一个输入(可能是固定的头),他就可以计算第二个消息。

  

M2 =(C1 ^ C2)^ M1

如果消息是自然语言,还有一些使用婴儿床的统计测试。

要回答您的问题,RC4应在相关密钥下生成完全不同的密钥流,因此此攻击无效。还有其他attacks against the key scheduling algorithm,并且有很多理由喜欢替代RC4。

如果您要求从密钥流中恢复初始密钥,请are a few

答案 1 :(得分:0)

一般来说,不妥协的加密技术的密钥只能使用暴力破解,这反过来又需要一些验证解密成功的方法。

答案 2 :(得分:0)

试图解决这个确切的问题,我偶然发现了几个几乎相同的问题和完全相同的答案的线程……这对我不起作用。但!答案是绝对正确的,并且@mfanto可以非常准确地描述需要执行的操作(尽管括号在您的代码中没有意义)!

这是为我工作的C代码:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[])
{
    if(argc != 4)
    {
        printf("usage: ./rc4_pa cipher1 cipher2 message1\n");
        return 1;
    }
    char *c1 = argv[1]; 
    char *c2 = argv[2];
    char *m1 = argv[3];

    int len_c1 = strlen(c1);
    int len_m1 = strlen(m1);
    char m2[len_m1 + 1];
    m2[len_m1] = '\0';

    for(int i = 0; i < len_m1; i++)
    {
        m2[i] = c1[i] ^ m1[i] ^ c2[i];
    } 
    printf("decrypted: %s\n", m2);
}

为什么我的代码无法立即使用?我从网络服务器上获得了密文,通常密文的一些字符实际上不是可打印的。进一步传递它们的唯一方法是再次编码。在我的情况下是base64。

将代码保存到rc4_pa.cmake rc4_pa,而不要像这样使用

$ ./rc4_pa $(echo L1Gd8F5g | base64 -d) $(echo MFuD8FVg | base64 -d) hello

希望其他人可能会有所帮助。