- 論壇徽章:
- 0
|
本帖最后由 sandaojushi 于 2015-07-21 14:51 編輯
大家好,最近在寫一個(gè)程序的時(shí)候遇到了非常非常奇怪的問題,花了好幾天時(shí)間仍然無法解決,問題描述如下:
這個(gè)程序是對(duì)數(shù)據(jù)進(jìn)行加密的一個(gè)程序,用的加密算法是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);
- }
復(fù)制代碼 上面是加密解密的第一層封裝- 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;
- }
復(fù)制代碼 這是二次封裝
然后我在主程序中調(diào)用下面的二次封裝接口
uint64_t ctext;
ctext=bf.encrypt(ptext);
直接這樣調(diào)用后在encrypt函數(shù)中返回ct的時(shí)候就出現(xiàn)cannot access memory xxxx 錯(cuò)誤(encrypt和decrypt函數(shù)都存在這樣的問題).
奇怪的是,我把encrypt和decrypt函數(shù)做以下修改后:- 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;
- }
復(fù)制代碼 程序就正常了.
本以為就此可以解決,然后在進(jìn)一步測(cè)試發(fā)現(xiàn),如果我在加密后,用一個(gè)密文ctext和一個(gè)明文ptext變量直接調(diào)用block_decrypt函數(shù),就能正確解密.
就像這樣:- uint64_t ptext;
- uint64_t ctext;
- bf.block_encrypt(&ptext,&ctext);
- bf.block_decrypt(&ctext,&ptext);
復(fù)制代碼 此時(shí)的ptext函數(shù)就可以正常得到解密的數(shù)據(jù),然而如果我調(diào)用decrypt接口,就會(huì)出錯(cuò),其實(shí)decrypt就是做了一個(gè)值傳遞的操作,但是解密結(jié)果會(huì)變得亂七八糟.
然后我根據(jù)上面的判斷嘗試這么做來測(cè)試:
ctext是密文,我再新建一個(gè)變量.
uint64_t tempctext=ctext;
然后bf.block_decrypt(&tempctext,&ptext);
這個(gè)時(shí)候就無法正確解密了.
也就是說對(duì)于密文來說,我只能存放在那個(gè)我原來的變量里才能加解密,如果傳遞給另外的變量,加解密就出錯(cuò)了.
實(shí)在不知道為何,請(qǐng)大家?guī)蛶兔Π?
這里是我寫的一個(gè)測(cè)試程序!!
sm4test.tar.gz
(10.88 KB, 下載次數(shù): 5)
2015-07-21 14:51 上傳
點(diǎn)擊文件名下載附件
這是我寫的一個(gè)測(cè)試程序!
|
|