[原] Delphi加密解密控件DCPcrypt的RC4实现bug

作者David Barton网站:http://www.cityinthesky.co.uk/opensource/dcpcrypt
DCPcrypt v2 contains full implementations of the following algorithms:
Encryption Algorithms Hash Algorithms
Blowfish Haval
Cast 128 MD4
Cast 256 MD5
DES, 3DES RipeMD-128
Ice, Thin Ice, Ice2 RipeMD-160
IDEA SHA-1
Mars SHA-256, SHA-384, SHA-512
Misty1 Tiger
RC2, RC4, RC5, RC6
Rijndael (the AES)
Serpent
Tea
Twofish
不过我试了最新的控件,RC4实现还是有bug:8192字节后,加密的数据不是标准的。(和C语言比)
如果你全都用这个控件来实现RC4的加密/解密,或者数据块不超过8192字节,那没有问题;
不过如果你跨语言了(即用Delphi加密,其他语言解密;或者其他语言加密,Delphi解密),而且数据块超过8192字节,那一定会遇到这个bug:8192字节后的加密/解密内容不匹配。

【补充】经过阅读代码,我发现了这个bug的原因:
在 DCPcrypt2.pas 中, 当调用 TDCP_cipher.EncryptStream 时,作者把Stream 按照8192字节分成几部分,然后对每一部分调用Encrypt函数。问题就出在这里,因为RC4的算法,KeyData[0..255]这个数组是不断在变化的。作者分块以后,调用Encrypt()偏移量又重新从下标0开始算。就会导致问题:

发表评论