亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問板塊 發(fā)新帖
查看: 1763 | 回復(fù): 7
打印 上一主題 下一主題

[C++] 急!!!!C++編程中遇到一個(gè)非常奇怪的問題,希望大家能幫忙解決以下!! [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2015-07-21 14:46 |只看該作者 |倒序?yàn)g覽
本帖最后由 sandaojushi 于 2015-07-21 14:51 編輯

大家好,最近在寫一個(gè)程序的時(shí)候遇到了非常非常奇怪的問題,花了好幾天時(shí)間仍然無法解決,問題描述如下:
這個(gè)程序是對(duì)數(shù)據(jù)進(jìn)行加密的一個(gè)程序,用的加密算法是sm4加密算法,我的程序代碼如下:
  1. void block_encrypt(const void *ptext,void *ctext) {
  2.              sm4_setkey_enc(&ctx,(unsigned char *)smkey);
  3.              sm4_crypt_ecb(&ctx,1,16,(unsigned char*)ptext,(unsigned char*)ctext);
  4.      }
  5.      void block_decrypt(const void *ctext,void *ptext) {
  6.              sm4_setkey_dec(&ctx,(unsigned char *)smkey);
  7.              sm4_crypt_ecb(&ctx,0,16,(unsigned char*)ctext,(unsigned char*)ptext);
  8.      }
復(fù)制代碼
上面是加密解密的第一層封裝
  1. uint64_t encrypt(uint64_t pt)
  2.     {
  3.        uint64_t ct;
  4.        block_encrypt(&pt,&ct);
  5.        return ct;
  6.     }
  7.       uint64_t decrypt(uint64_t ct)
  8.      {
  9.         uint64_t pt;
  10.         block_decrypt(&ct,&pt);
  11.         return pt;
  12.      }
復(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ù)做以下修改后:
  1. uint64_t encrypt(uint64_t pt)
  2.     {
  3.        uint64_t ct;
  4.        block_encrypt(&pt,&ct);
  5.        uint64_t tc=ct
  6.        return tc;
  7.     }
  8.       uint64_t decrypt(uint64_t ct)
  9.      {
  10.         uint64_t pt;
  11.         block_decrypt(&ct,&pt);
  12.         uint64_t tp=pt;
  13.         return tp;
  14.      }
復(fù)制代碼
程序就正常了.
本以為就此可以解決,然后在進(jìn)一步測(cè)試發(fā)現(xiàn),如果我在加密后,用一個(gè)密文ctext和一個(gè)明文ptext變量直接調(diào)用block_decrypt函數(shù),就能正確解密.
就像這樣:
  1. uint64_t ptext;
  2.         uint64_t ctext;
  3.            bf.block_encrypt(&ptext,&ctext);
  4.         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)

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
2 [報(bào)告]
發(fā)表于 2015-07-21 14:58 |只看該作者
sm4_crypt_ecb要求16字節(jié)吧,你int64_t只有8字節(jié),越界了

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2015-07-21 15:19 |只看該作者
這個(gè)問題我也想到了,我就用了一個(gè)union來擴(kuò)展我這個(gè)uint64_t,但是結(jié)果還是錯(cuò)的。回復(fù) 2# hellioncu


   

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
4 [報(bào)告]
發(fā)表于 2015-07-21 15:22 |只看該作者
sandaojushi 發(fā)表于 2015-07-21 15:19
這個(gè)問題我也想到了,我就用了一個(gè)union來擴(kuò)展我這個(gè)uint64_t,但是結(jié)果還是錯(cuò)的;貜(fù) 2# hellioncu


...


沒看到哪里有union

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
5 [報(bào)告]
發(fā)表于 2015-07-21 15:23 |只看該作者
代碼直接貼出來,很少有人愿意為了幫別人解決問題去下載、解壓

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2015-07-21 15:33 |只看該作者
回復(fù) 5# hellioncu
  1. #define CLEAR(x) memset(&(x), 0, sizeof(x))
  2. typedef union _Data
  3. {
  4.                 uint64_t digital;
  5.                 char data[16];
  6. }Data;

  7. Data input, output;
  8.    CLEAR(input);
  9.    CLEAR(output);
  10. input.digital=123456789;
  11. //這樣是可以的
  12. bf.block_encrypt(input.data,output.data);
  13. bf.block_decrypt(output.data,input.data);
  14. //這樣就不行了
  15. Data input_test;
  16. CLEAR(input_test);
  17. input_test.digital=input.digital;
  18. bf.block_decrypt(output.data,input_test.data);
復(fù)制代碼
我的做法是首先新建一個(gè)聯(lián)合體16字節(jié),然后清空聯(lián)合體,再把前8個(gè)字節(jié)賦值,再傳入進(jìn)去,但是這么做依然會(huì)出錯(cuò).不知為何...

論壇徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52雙子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午馬
日期:2013-10-18 21:43:38
7 [報(bào)告]
發(fā)表于 2015-07-21 15:40 |只看該作者
sandaojushi 發(fā)表于 2015-07-21 15:33
回復(fù) 5# hellioncu 我的做法是首先新建一個(gè)聯(lián)合體16字節(jié),然后清空聯(lián)合體,再把前8個(gè)字節(jié)賦值,再傳入進(jìn)去,但是 ...


你要把input整體16字節(jié)復(fù)制到input_test才行,而不是僅僅復(fù)制digital這8字節(jié)。

這算法以每塊16字節(jié)作為加解密最小單位的

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2015-07-21 15:46 |只看該作者
回復(fù) 7# hellioncu
非常感謝,我馬上來嘗試一下。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP