首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 其他相关 >

OpenSSL中RC4加解密进程调研

2013-03-17 
OpenSSL中RC4加解密过程调研最近项目用到rc4加密数据,对其实现过程做了基本调研,在此记录一下初步调研结果

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是否不同,结果如下:

OpenSSL中RC4加解密进程调研
OpenSSL中RC4加解密进程调研
        结果很明显,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;} 

热点排行