- 论坛徽章:
- 0
|
本帖最后由 sandaojushi 于 2015-07-21 14:51 编辑
大家好,最近在写一个程序的时候遇到了非常非常奇怪的问题,花了好几天时间仍然无法解决,问题描述如下:
这个程序是对数据进行加密的一个程序,用的加密算法是sm4加密算法,我的程序代码如下:- void block_encrypt(const void *ptext,void *ctext) {
- sm4_setkey_enc(&ctx,(unsigned char *)smkey);
- sm4_crypt_ecb(&ctx,1,16,(unsigned char*)ptext,(unsigned char*)ctext);
- }
- void block_decrypt(const void *ctext,void *ptext) {
- sm4_setkey_dec(&ctx,(unsigned char *)smkey);
- sm4_crypt_ecb(&ctx,0,16,(unsigned char*)ctext,(unsigned char*)ptext);
- }
复制代码 上面是加密解密的第一层封装- uint64_t encrypt(uint64_t pt)
- {
- uint64_t ct;
- block_encrypt(&pt,&ct);
- return ct;
- }
- uint64_t decrypt(uint64_t ct)
- {
- uint64_t pt;
- block_decrypt(&ct,&pt);
- return pt;
- }
复制代码 这是二次封装
然后我在主程序中调用下面的二次封装接口
uint64_t ctext;
ctext=bf.encrypt(ptext);
直接这样调用后在encrypt函数中返回ct的时候就出现cannot access memory xxxx 错误(encrypt和decrypt函数都存在这样的问题).
奇怪的是,我把encrypt和decrypt函数做以下修改后:- uint64_t encrypt(uint64_t pt)
- {
- uint64_t ct;
- block_encrypt(&pt,&ct);
- uint64_t tc=ct
- return tc;
- }
- uint64_t decrypt(uint64_t ct)
- {
- uint64_t pt;
- block_decrypt(&ct,&pt);
- uint64_t tp=pt;
- return tp;
- }
复制代码 程序就正常了.
本以为就此可以解决,然后在进一步测试发现,如果我在加密后,用一个密文ctext和一个明文ptext变量直接调用block_decrypt函数,就能正确解密.
就像这样:- uint64_t ptext;
- uint64_t ctext;
- bf.block_encrypt(&ptext,&ctext);
- bf.block_decrypt(&ctext,&ptext);
复制代码 此时的ptext函数就可以正常得到解密的数据,然而如果我调用decrypt接口,就会出错,其实decrypt就是做了一个值传递的操作,但是解密结果会变得乱七八糟.
然后我根据上面的判断尝试这么做来测试:
ctext是密文,我再新建一个变量.
uint64_t tempctext=ctext;
然后bf.block_decrypt(&tempctext,&ptext);
这个时候就无法正确解密了.
也就是说对于密文来说,我只能存放在那个我原来的变量里才能加解密,如果传递给另外的变量,加解密就出错了.
实在不知道为何,请大家帮帮忙吧!
这里是我写的一个测试程序!!
sm4test.tar.gz
(10.88 KB, 下载次数: 5)
|
|