首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rc4密钥恢复(2条消息,相同部分密钥)

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

Stack Overflow用户
提问于 2012-12-06 22:36:46
回答 3查看 3.7K关注 0票数 1

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

代码语言:javascript
复制
   C1 = RC4(M1, "(VARIABLE_DATA)XXXXYYYY")
   C2 = RC4(M2, "(VARIABLE_DATA)XXXXYYYY")

如果C1和C2已知至少可以恢复"XXXXYYYY“的部分密钥,那么使用RC4是可能的吗?因为它永远不会改变。

EN

回答 3

Stack Overflow用户

发布于 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

票数 4
EN

Stack Overflow用户

发布于 2012-12-06 23:38:24

一般而言,未被攻破的加密技术的密钥只能使用暴力破解才能恢复,这反过来又需要某种方法来验证解密是否成功。

票数 0
EN

Stack Overflow用户

发布于 2019-07-09 22:16:47

为了解决这个确切的问题,我偶然发现了几个几乎相同的问题和完全相同的答案……这对我不起作用。但!答案绝对正确,@mfanto to非常准确地描述了需要做什么(尽管括号没有任何意义,就像你在我的代码中看到的那样)!

下面是我的C代码,它为我工作:

代码语言:javascript
复制
#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.cmake rc4_pa,然后像这样使用它

代码语言:javascript
复制
$ ./rc4_pa $(echo L1Gd8F5g | base64 -d) $(echo MFuD8FVg | base64 -d) hello

希望其他人能发现它有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13745862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档