OpenSSL中RC4加解密过程调研
最近项目用到rc4加密数据,对其实现过程做了基本调研,在此记录一下初步调研结果。
首先shell中man RC4,了解其基本函数调用方法,知道了怎么用,但对其实现原理还有疑问,继续调研
然后google一把ssl rc4,发现这篇文章讲得比较清楚了:
http://blog.csdn.net/k1988/article/details/4854369
本地写了几行代码对RC4的用法做测试,发现一个问题:
调用RC4_set_key()设置key后,先调用RC4()对一段测试数据做加密,然后用同样的key再次调用RC4()做解密,发现解密失败。。。
其实解密失败的情况上面贴出的那篇文章已经提到过,但自己不试验的话,不是很理解,更不清楚是什么原因导致解密失败
于是,继续google RC4的实现源码,在这里发现了一份实现:
http://etutorials.org/Programming/secure+programming/Chapter+5.+Symmetric+Encryption/5.23+Setting+Up+and+Using+RC4/
从RC4()函数实现可以看到,在调用RC4()加密过程中,key的buffer内容被改动过
这样的话,首次调用RC4()前后,加密所用的key的内容已经不同,第二次调用RC4()尝试解码时,必然是失败的。。。
为了证实这个过程,写了几行测试代码于main.c中(测试代码见本文最后)
编译&&链接:
gcc -lssl -g -o rc4_case main.c
然后gdb在RC4调用前后设置断点,查看其memory buffer是否不同,结果如下:

结果很明显,RC4()调用前后,key已经不同了
后来细看wikipedia中RC4的介绍,其给出的算法伪码也表明key是会被改动的
结论:
若本地想测试加密/解密是否成功,需要2个key buffer,在RC4_set_key()时用同样的data去设置key1和key2,然后,加密时用key1,解密时用key2
main.c sample code:
#include <openssl/rc4.h>#include <stdio.h>int main(int argc, char * argv[]){ unsigned char key_data[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef }; RC4_KEY key; RC4_set_key(&key, sizeof(key_data), key_data); unsigned char * raw_data = "this is a rc4 test case"; unsigned char outBuf[256]; memset(outBuf, 0, sizeof(outBuf)); RC4(&key, strlen(raw_data), raw_data, outBuf); if(1) { printf("break it\n"); } return 0;}