我有两条使用相同的部分密钥加密的邮件。例如:
C1 = RC4(M1, "(VARIABLE_DATA)XXXXYYYY")
C2 = RC4(M2, "(VARIABLE_DATA)XXXXYYYY")
是否可以使用RC4,如果已知C1和C2至少恢复“XXXXYYYY”的部分键,因为它永远不会改变?
答案 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。
答案 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.c
和make rc4_pa
,而不要像这样使用
$ ./rc4_pa $(echo L1Gd8F5g | base64 -d) $(echo MFuD8FVg | base64 -d) hello
希望其他人可能会有所帮助。