修改Zend引擎实现PHP源码加密的原理及实践

2004-02-14 09:33 出处:PConline 作者:老虎包子/ASPCool.com 责任编辑:zwg

  因为ECB模式是块长度确定的块加密,这里填充了一 些空字符。   然后,修改php代码中 Zend/zend-scanner.c 如下: (我的php版本是4.01pl2, SUNsparc/solaris 2.7, gcc 2.95;) 文件前加入: #define MCRYPT_BACKWARDS_COMPATIBLE 1 #include < mcrypt.h >   然后,注释掉大约3510行前后的YY_INPUT的定义。   然后, 修改大约5150行前后的yy_get_next_buffer()函数: 函数头加上定义: void *tempbuf; char *key; char debugstr[255]; int td,keysize; int x,y; FILE *fp; 然后 ,注释掉 YY_INPUT( (&yy_current_buffer- >yy_ch_buf[number_to_move]), yy_n_chars, num_to_read ); 这一句。 改为: tempbuf=malloc(num_to_read); if((yy_n_chars=fread(tempbuf,1,num_to_read,yyin))!=0){ /*decode*/ #define password "PHPphp111222" #define debug 0 keysize=mcrypt_get_key_size(DES); key=calloc(1, mcrypt_get_key_size(DES)); gen_key_sha1( key, NULL, 0, keysize, password, strlen(password)); td=init_mcrypt_ecb(DES, key, keysize); mdecrypt_ecb(td, tempbuf, yy_n_chars); memcpy((&yy_current_buffer- >yy_ch_buf[number_to_move]),tempbuf,yy_n_chars); if(debug){ fp=fopen("/tmp/logs","wb"); fwrite("nstartn",7,1,fp); fwrite(tempbuf,1,yy_n_chars,fp); fwrite("nenditn",7,1,fp); fclose(fp); } } free(tempbuf);   然后,编译php,按正常方法安装即可,因为我对于libtool不太熟悉,因此我选择static方式,并在 configure时加入了--with-mcrypt,这样我就不用自己手工修改Makefile 三、测试及结果   编译php,apache后,用ecb.c编译出来的encryptphp加密了几个文件,分别为< 1K,10K+,和40K+,在处理 40K大小文件时出错,别的文件均正常。   这是因为块的ECB加密方式决定了必须使用定长块,所以,请 诸位同好指点采用何种流加密方式可以兼顾到zend每次读取8192字节的缓存处理方式。(其他平台上 zend每次读取的块长度可能有所不同) 四、说明 我的机器是SUN Ultra1, solaris 2.7, gcc 2.95 , apache 1.3.12, php 4.01pl2, libmcrypt 2.2.4 我的C水平很差,请大家见谅。这里只是原理说明。 感谢老米飞刀等提供的协助。 源码遵从GNU,需要注意,libmcrypt提供的某些加密方式不是free的。
键盘也能翻页,试试“← →”键
分享到: QQ空间 新浪微博 腾讯微博 更多
相关文章
相关文章
相关软件