编写blowfish的PHP module (续)

前段时间由于工作需要编写了一个blowfish的php module,从blowfish的主页上下载的加密解密实现代码,自己加密、自己解密都没啥问题,但到了和别人联调的时候,对方用java写的blowfish解密程序却死活解不出来我加密的串。
查看对方的java代码,没想到blowfish除了密钥,还有那么多可配参数,java代码里写的解密模式为"cfb/nopadding",这是什么?仔细查了手册,除了cfb,还有ecb,cbc....我晕,blowfish主页上提供的代码都没有这些东西啊!
跑去问计算机安全方面的“伪专家”,他答道:
“这些只是加密模式,任何对称加密算法都有这几种模式”
“那我应该用哪种模式才能让别人的java代码正确解密我的串?”
“不同模式跟加密算法没关系,加密出来的串都一样,你就用blowfish主页上的那些代码就行了”
说了等于没说。
我改为自己找资料,最后有了结果:不同对称加密算法(像DES、blowfish)确实都有那几种加密模式(ecb、cbc、cfb等),但并不是跟加密算法没关系,使用不同的加密模式,加密出来的串都是不同的
使用什么加密模式,解密时也必须使用相同的模式,这就是对方无法解密我的串的原因——我压根就没使用任何加密模式...直接用Bruce Schneier老兄写的blowfish代码没戏了,我只能转而使用mcrypt,这个开源包不仅提供了各种对称加密算法,还提供了不同的加密模式,好用多了。
下载、编译成动态链接库libmcrypt.so,和我的测试代码链接运行,发现当我加密字符串“hello”,得出来得还是“hello”,再次抓狂,仔细看了mcrypt的示例代码??唉,我怎么稀里糊涂的把被加密的字符串声明成const了....最后能顺利编译运行的代码是:

	char text[1024];
char *m_crypt_iv = "0808008"; char *m_dest = "hello"; char *m_key = "abcdefg"; MCRYPT td; td=mcrypt_module_open("blowfish",NULL,"cfb",NULL); if(td==MCRYPT_FAILED) printf("wrong!\n"); i=mcrypt_generic_init(td,m_key,strlen(m_key),m_crypt_iv); if(i<0) printf("wrong!\n"); memset(text,0,sizeof(text)); memmove(text,m_dest,strlen(m_dest)); mcrypt_generic(td,text,text_len); mcrypt_generic_deinit(td); mcrypt_module_close(td);
 
其中的m_crypt_iv是cfb加密模式使用的初始向量,这段代码之所以不对被加密串进行64bit的填充(即nopadding),是因为cfb模式不用填充。
加密算法本身解决了,在编译PHP module时把libmcrypt.a加上,编出来的module就可以直接使用了。


相关文章

分类

1 Comments

rik said:

站长,向你推荐一本书 。
电子工业,2005.8,密码学实践,niels ferguson/bruce schneier
你遭遇的问题在这本书中有很系统的说明。

有一个提议,在首页上提供最新的comment链接,这样可以看出comment的热点,写comment也比较有劲:)

留言:

关于文章

This page contains a single entry by DongHao published on 09 1, 2007 9:23 PM.

“冤家” was the previous entry in this blog.

时间 is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.