首页
社区
课程
招聘
[求助]关于RC4算法的加解密问题
发表于: 2013-1-2 21:27 8322

[求助]关于RC4算法的加解密问题

2013-1-2 21:27
8322
刚刚接触密码学, 书上说RC4是很流行的流密码, 有一定的安全性.

但是我看到RC4的工作原理, 其实还是将明文与一组实时变化的密钥异或, 特点是这组密钥仅与自身有关, 与明文是无关的. 也就是说, 对于相同长度的不同明文, 其实要异或的密钥是完全相同的, 请问我理解的对吗?

那么我的问题是, 那么要破解这种算法岂不是很简单? 我只要发一串与要破解的明文相同大小的完全由0组成的数据发过去, 那么返回的密文不就是密钥了吗?

我不知道我的想法哪里出了问题, 谢谢各位了~

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 188
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
你的这个理解是不完全正确的,在使用时有个初始化过程,经过伪随机子密码生成算法的处理后进而得到得到不同的子密钥序列。但是由于存在部分弱密钥,使得子密钥序列在不到100万字节内就发生了完全的重复,如果是部分重复,则可能在不到10万字节内就能发生重复,因此,在使用RC4算法时,一般都对加密密钥进行测试,判断其是否为弱密钥。而且,RC4密钥长度达到128位,基本不能被分析出来。
2013-1-2 22:14
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
非常感谢你的回答
你说的子密钥序列生成与一个"伪随机子密码"有关没错, 但是你每次对一串数据加密的时候, 如果这个"伪随机子密码"生成算法不变的话, 初始化之后的密钥应该都是相同的对吧?
那么这个时候我放一串0进去, 通过异或不就可以得到这串密钥了?
2013-1-2 22:25
0
雪    币: 188
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你要知道这个密钥是随机产生的啊,不是每次固定不变的。但因为是伪随机所以存在被攻击破解的可能。
2013-1-2 22:46
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如果初始密钥是随机的就说得过去了, 我刚开始想这个问题的时候, 觉得加密方用了某个随机产生的密钥, 那么解密方为了解密就需要这段密钥了, 密钥要是挺长的话, 数据传输是个问题啊...
Anyway, thanks a lot
2013-1-2 23:41
0
雪    币: 230
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
def rc4(data, key):
        x = 0
        box = range(256)
        for i in range(256):
                x = (x + box[i] + key[i % len(key)]) % 256
                box[i], box[x] = box[x], box[i]
        x = 0
        y = 0
        out = []
        for char in data:
                x = (x + 1) % 256
                y = (y + box[x]) % 256
                box[x], box[y] = box[y], box[x]
                out.append(chr(ord(char) ^ box[(box[x] + box[y]) % 256]))
        return ''.join(out)
2013-1-4 14:54
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
没错, LS写的伪代码就是RC4算法, 我想指出的就是这个box的变换实际上是固定的, 只要固定了key之后.
因此要保证其安全性可能就是要不断地改变key吧
2013-1-5 14:32
0
游客
登录 | 注册 方可回帖
返回
//