我有两条使用相同部分密钥加密的消息。例如:
C1 = RC4(M1, "(VARIABLE_DATA)XXXXYYYY")
C2 = RC4(M2, "(VARIABLE_DATA)XXXXYYYY")如果C1和C2已知至少可以恢复"XXXXYYYY“的部分密钥,那么使用RC4是可能的吗?因为它永远不会改变。
发布于 2012-12-07 03:07:54
我想你的问题有些混乱。流密码的工作方式是生成一个(通常)与消息进行异或运算的密钥流。您是正确的,如果您使用相同的密钥和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
发布于 2012-12-06 23:38:24
一般而言,未被攻破的加密技术的密钥只能使用暴力破解才能恢复,这反过来又需要某种方法来验证解密是否成功。
发布于 2019-07-09 22:16:47
为了解决这个确切的问题,我偶然发现了几个几乎相同的问题和完全相同的答案……这对我不起作用。但!答案绝对正确,@mfanto to非常准确地描述了需要做什么(尽管括号没有任何意义,就像你在我的代码中看到的那样)!
下面是我的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);
}为什么我的代码不能开箱即用?我从web服务器上得到了我的密文,通常密文中的一些字符是无法打印的。进一步传递它们的唯一方法是再次编码。在我的例子中,就是base64。
将代码保存到rc4_pa.c和make rc4_pa,然后像这样使用它
$ ./rc4_pa $(echo L1Gd8F5g | base64 -d) $(echo MFuD8FVg | base64 -d) hello希望其他人能发现它有帮助。
https://stackoverflow.com/questions/13745862
复制相似问题