guanzhi / GmSSL

支持国密SM2/SM3/SM4/SM9/SSL的密码工具箱
http://gmssl.org
Apache License 2.0
5.14k stars 1.66k forks source link

使用sm3hmac,数据放到文件里面和直接对数据hmac得到的结果不一致 #1526

Open bin-wang1 opened 1 year ago

bin-wang1 commented 1 year ago

使用命令行,数据放于data.txt中 bennie@ubuntu:~/Desktop/test/gmssl_sm3hmac$ gmssl sm3hmac -key 63D1BE3F603DB6AC5F1E730500C8803F888FEAAB89327F2DC724EA2A5FCC6908 -in data.txt -hex d614b32520e79cb904455a56e4d59c126f7194cc65693406edd6857ea9f11d6d

使用源码进行hmac: 所有源码来自于gmssl3.1版本,包括sm3.c sm3_hmac.c hex.c void sm3_hmac(const uint8_t key, size_t key_len, const uint8_t data, size_t data_len, uint8_t mac[SM3_HMAC_SIZE]) { SM3_HMAC_CTX ctx; sm3_hmac_init(&ctx, key, key_len); sm3_hmac_update(&ctx, data, data_len); sm3_hmac_finish(&ctx, mac); } int main(int argc,charconstargv){ uint8_t dgst[32]; char mesg[]="f63c4c0a4bd5c31acb29a588137dc6f42e20230800000001000003202300030407fe899afc1b5da5ff296044e57d034add1f5cf443e25ba0a4f2b4469f566769e09af6a011b05c1158584507131b05eb6c1353aba9c6ca56b331ea01aaeb965265b37d4d007ffa53016ea9987d5bb7862d1246ba3928df34dbda49cd3fee69a335c90c4c54713a9d27666a1473669b9a8ccb7137ce243bdede5e3d39240eca93f2c5b6175010dea819cceba143466d2c1e7486fca7bad341c7c862c2fc34e71444b8f4c25891ab0cd3bdd34526dedd0b7950b7cd74d5f997fc9a5ffc523757f85e97b600d488a208ca5bd596260fce7b7ff63ec26706bf05d006357b524bf4b0cec9635679428d088fd5f03864670ad46d19bd168b1ec153df6b3dd32b2a15dd2f18e1f4b2f8c049951688bac895b1e464d1646de955b1c6af6f97553827f9eda7f45884d24a12b9c55e8de96d68841cb9955f513c905312dd943997f3ff56503f2f53f6dd1e2700a9b4ebd779a277faddb2b2eac680e7fab6f7ef328bc6e0b9897f1aa1d2b23477a3d2f344c7b261f26a462ca6ba9f40681a7025922761febf998e2fcd1db4bfa2155d2f350b0edcc8900dbdf16b08b31d51d616e3efa86d384ccbb5dc6c562ced2c7367e208849e627d9df6807d272dca4ab0012d846c7a2dbec10317ef43c886e185e265cb42e2dd1ff3ca46f3e0293f5b86bdad78ac1ded5c1154918b6f6c6e25b5af6b5033b2fbc3355f15ddb1a588f9f9d4a6804a1c6fab7fc602f49b0ce0549036634f09fa7a707f1e93d32332e920cb5bd64db1a2428a803b2c3a062315d25ca21188f77ea0e2dd722a2d3f3170d0683c3daa98a91cb966566de278d56d69b547480788e55b046cdc5e4de88d4d7be5af3c3dc9d1dfbfb9992a248f2a3e3d1c990e88671408aff8f3fd904261c3bc677b92c33a432db6afb3f065666d89d5aa9f5b09cb52979ebba5ea7de8a3777a6780b87adab0eeeaaf12788fc454a223be2fe77f0b52d77dacd4111135b1efa50fb245d768ec12e449c60874f4dec5fc48b996f3674b9db116652249d7319105f68577d205efa7530d3b8b51c291e22ce1c10c1ce37152"; uint8_t key[]="63D1BE3F603DB6AC5F1E730500C8803F888FEAAB89327F2DC724EA2A5FCC6908"; uint8_t out[800]; size_t outlen=0; printf("the length of mesg is %ld\n",strlen(mesg)); hex_to_bytes(mesg, strlen(mesg), out, &outlen); printf("outlen:%ld\n",outlen); sm3_hmac(key,strlen(key),out,outlen,dgst); int i; for (i = 0; i < sizeof(dgst); i++) { fprintf(stdout, "%02x", dgst[i]); } fprintf(stdout, "\n");

运行后结果: bennie@ubuntu:~/Desktop/test/gmssl_sm3hmac$ ./a.out the length of mesg is 1568 outlen:784 6674c81cf00bae4a8dae5be80a13d2ff3c5981d441709a0f9be1a5b72fbe9f5b

有知道原因的吗

lpilp commented 1 year ago

这种最大的可能是写入文本的数据结尾带着一个特殊字符,比如用vi 打开文件写入一个字符的时候,系统上显示的是占用了两个字节,如果是用代码向文件里写一个字符的话,显示的就是一个字节,可以试着用写文件的代码向文件里写入你上面的字符,再进行哈稀试试