Comments (20)
标准应该没变化,不知道为什么V3改变了C3的MAC算法。
from gmssl.
早期流传出的SM9规范文本中将哈希函数 Hv(Z||K2) 作为MAC算法,在2016年正式发布的GM/T 0044.4-2016标准中删除了早期草案中对MAC算法的这个(不准确的)定义。为遵守正式标准,GmSSL v3采用HMAC-SM3作为其中的MAC算法。
《GM/T 0044.4-2016 SM9标识密码算法 第4部分:密钥封装机制和公钥加密算法》中的5.4.2.1和5.4.5节。
《GB/T 38635.2-2020 信息安全技术 SM9标识密码算法 第2部分:算法》中针对这个MAC算法(Hv(Z||K2))是明确的,参考标准中的5.3.2和5.3.5节。
from gmssl.
之前您解答了asn头问题,当时以为和手头的硬件不能加解密互通是因为这个asn导致的。
现在逐步排查发现封装解封装都正常,应该计算出k1和k2的过程没问题。
通过直接赋值文档里的数据,发现这个hmac计算出的C3结果不正确,可以关注一下
from gmssl.
cc @guanzhi
from gmssl.
HMAC(EVP_sm3(), key, strlen(key), (unsigned char *)data, strlen(data), digest, &digest_len);
发现替换为openssl也是一样的值
from gmssl.
HMAC(EVP_sm3(), key, strlen(key), (unsigned char *)data, strlen(data), digest, &digest_len);
发现替换为openssl也是一样的值
你测试gmssl SM9的目的是什么?和你的硬件作比对?
from gmssl.
这个MAC的问题去年也在这里问过:emmansun/gmsm#193
from gmssl.
HMAC(EVP_sm3(), key, strlen(key), (unsigned char *)data, strlen(data), digest, &digest_len);
发现替换为openssl也是一样的值你测试gmssl SM9的目的是什么?和你的硬件作比对?
是为了软仿硬件操作,需要和硬件一致。
您说的SM9的MAC不是HMAC,gmssl里用的hmac是不是就是用错了?
如果单纯的使用sm3hash,也没有传递key2的地方了,这是啥情况搞不明白了
from gmssl.
func encrypt(rand io.Reader, pub *EncryptMasterPublicKey, uid []byte, hid byte, plaintext []byte, opts EncrypterOpts) (c1 *bn256.G1, c2, c3 []byte, err error) {
if opts == nil {
opts = DefaultEncrypterOpts
}
if len(plaintext) == 0 {
return nil, nil, nil, ErrEmptyPlaintext
}
key1Len := opts.GetKeySize(plaintext)
key, c1, err := WrapKey(rand, pub, uid, hid, key1Len+sm3.Size)
if err != nil {
return nil, nil, nil, err
}
c2, err = opts.Encrypt(rand, key[:key1Len], plaintext)
if err != nil {
return nil, nil, nil, err
}
hash := sm3.New()
hash.Write(c2)
hash.Write(key[key1Len:])
c3 = hash.Sum(nil)
return
}
- WrapKey的时候,同时derive了K1和K2
- C3 = SM3HASH(C2 || K2)
from gmssl.
标准应该没变化,不知道为什么V3改变了C3的MAC算法。
感谢您的提示,回退到最初版本查看使用的是这个:
EVP_Digest( k, c2len + SM3_HMAC_SIZE, mac, &digest_len, EVP_sm3(), NULL );
现在替换成这个成功了,gmssl现在应该是用错了
from gmssl.
mac 摘要和 digest 摘要是有些区别的,文档写的是做 mac 处理,按正常的逻辑就是做 hmac 处理,而测试数据用的是 digest 摘要处理,除非是写文档时候还没有 hmac 实现,所以只能先用 digest 代替。或者是文档作者对 mac 的理解有些出入,认为 mac 摘要就是 digest 摘要
from gmssl.
mac 摘要和 digest 摘要是有些区别的,文档写的是做 mac 处理,按正常的逻辑就是做 hmac 处理,而测试数据用的是 digest 摘要处理,除非是写文档时候还没有 hmac 实现,所以只能先用 digest 代替。或者是文档作者对 mac 的理解有些出入,认为 mac 摘要就是 digest 摘要
HMAC (Hash-based Message Authentication Code) or Keyed-Hashing for Message Authentication Code. 它通过一个标准算法,在计算哈希的过程中,把KEY混入计算过程中。 SM9中使用的SM3-MAC也是类似功效:计算一段message的哈希时,根据不同KEY计算出不同的哈希;要验证哈希值,必须同时提供正确的KEY。至于为什么SM9中使用的MAC不使用HMAC标准算法,就不得而知了。
from gmssl.
mac 摘要和 digest 摘要是有些区别的,文档写的是做 mac 处理,按正常的逻辑就是做 hmac 处理,而测试数据用的是 digest 摘要处理,除非是写文档时候还没有 hmac 实现,所以只能先用 digest 代替。或者是文档作者对 mac 的理解有些出入,认为 mac 摘要就是 digest 摘要
HMAC (Hash-based Message Authentication Code) or Keyed-Hashing for Message Authentication Code. 它通过一个标准算法,在计算哈希的过程中,把KEY混入计算过程中。 SM9中使用的SM3-MAC也是类似功效:计算一段message的哈希时,根据不同KEY计算出不同的哈希;要验证哈希值,必须同时提供正确的KEY。至于为什么SM9中使用的MAC不使用HMAC标准算法,就不得而知了。
这是真的坑,文档里并没有对这一步进行详尽描述。
c2||k2后算sm3如果不是您来告诉我,纯看文档完全不知道。。。
现在行业里各种硬件厂商和应用厂商都按照非hmac来计算了,后续的厂商也只能按照这个来走,就算是错的也只能将错就错的走下去了
from gmssl.
你这有点冤枉标准文档了,你结合5.3.2和5.3.5再仔细看看:
《GB/T 32905-2016 信息安全技术 SM3密码杂凑算法》。
只是HMAC: Keyed-Hashing for Message Authentication, The Keyed-Hash Message Authentication Code (HMAC) 更为人所知而已。
from gmssl.
早期流传出的SM9规范文本中将哈希函数 Hv(Z||K2) 作为MAC算法,在2016年正式发布的GM/T 0044.4-2016标准中删除了早期草案中对MAC算法的这个(不准确的)定义。为遵守正式标准,GmSSL v3采用HMAC-SM3作为其中的MAC算法。
from gmssl.
早期流传出的SM9规范文本中将哈希函数 Hv(Z||K2) 作为MAC算法,在2016年正式发布的GM/T 0044.4-2016标准中删除了早期草案中对MAC算法的这个(不准确的)定义。为遵守正式标准,GmSSL v3采用HMAC-SM3作为其中的MAC算法。
确实应该按最新国标吧,这里写了
GB/T 38635.2-2020 信息安全技术 SM9标识密码算法 第2部分:算法
from gmssl.
mac 摘要和 digest 摘要是有些区别的,文档写的是做 mac 处理,按正常的逻辑就是做 hmac 处理,而测试数据用的是 digest 摘要处理,除非是写文档时候还没有 hmac 实现,所以只能先用 digest 代替。或者是文档作者对 mac 的理解有些出入,认为 mac 摘要就是 digest 摘要
国标确实写了
GB/T 38635.2-2020 信息安全技术 SM9标识密码算法 第2部分:算法
from gmssl.
mac 摘要和 digest 摘要是有些区别的,文档写的是做 mac 处理,按正常的逻辑就是做 hmac 处理,而测试数据用的是 digest 摘要处理,除非是写文档时候还没有 hmac 实现,所以只能先用 digest 代替。或者是文档作者对 mac 的理解有些出入,认为 mac 摘要就是 digest 摘要
这个,认真的看的话,文档里说的是设H为密码杂凑算法。这里最主要的是要知道密码杂凑算法。
杂凑算法和密码杂凑算法看起来是有些区别的吧。
杂凑算法通常是digest,如果加key,按常规的标准那就是hmac吧
但是按文档说法,GB/T 32905-2016 的digest 就是[信息安全技术 SM3密码杂凑算法]。那基本就是直接调用sm3计算了,没有做 hmac 调用
from gmssl.
mac 摘要和 digest 摘要是有些区别的,文档写的是做 mac 处理,按正常的逻辑就是做 hmac 处理,而测试数据用的是 digest 摘要处理,除非是写文档时候还没有 hmac 实现,所以只能先用 digest 代替。或者是文档作者对 mac 的理解有些出入,认为 mac 摘要就是 digest 摘要
这个,认真的看的话,文档里说的是设H为密码杂凑算法。这里最主要的是要知道密码杂凑算法。 杂凑算法和密码杂凑算法看起来是有些区别的吧。 杂凑算法通常是digest,如果加key,按常规的标准那就是hmac吧
那怎么解释后面写的Z||K2,这种组装方式,而不是用K2对Z计算,这同一个文档的后面就带着参数结果,可以映证是非hmac
from gmssl.
mac 摘要和 digest 摘要是有些区别的,文档写的是做 mac 处理,按正常的逻辑就是做 hmac 处理,而测试数据用的是 digest 摘要处理,除非是写文档时候还没有 hmac 实现,所以只能先用 digest 代替。或者是文档作者对 mac 的理解有些出入,认为 mac 摘要就是 digest 摘要
这个,认真的看的话,文档里说的是设H为密码杂凑算法。这里最主要的是要知道密码杂凑算法。 杂凑算法和密码杂凑算法看起来是有些区别的吧。 杂凑算法通常是digest,如果加key,按常规的标准那就是hmac吧
那怎么解释后面写的Z||K2,这种组装方式,而不是用K2对Z计算,这同一个文档的后面就带着参数结果,可以映证是非hmac
按文档来,该说就不是hmac了,没走国际标准的 hmac
from gmssl.
Related Issues (20)
- sm2验签返回-1该如何排错 HOT 2
- unknown OID was met when running cmsparse HOT 6
- GmSSL 3.1.1 命令行未提供sm4 xts支持 HOT 1
- gmssl ecparam -out device.key -name SM2 -genkey 更新为V3版本之后可以用那个命令替代? HOT 2
- 配合SoftSDF编译失败问题,提示-fPIC地址重定位问题
- 求教sm9加密之后使用asn1_sequence_of_from_der去除了前9或10字节头之后,还是比纯粹的的密文多4字节 HOT 3
- 命令行下如何实现X509证书格式转换
- sm3 对文件目录摘要,目录内容发生变法后。摘要未变化 HOT 5
- 我能否为sm9加解密增加一个分组模式,再加一个mac计算选择功能 HOT 3
- SM4 cbc performance issue HOT 3
- windows下编译GmSSL报错
- when I use gmssl and curl in my project. sm3's result is different with only use gmssl in my project. why ?
- 在windows下使用源码编译nginx
- gmssl certgen reqgen: illegal option '-days'
- vs2015编译各种报错未声明标识符,vs2022正常,怎么解决
- GmSSL 3 如何通过配置文件方式生成p10格式请求证书,因为主题信息有自定义的部分
- 保存公钥到本地der文件
- 如何移植到Android源码中,有没有什么步骤
- 报错:CMake Error at CMakeLists.txt,有没有同学遇到,知道怎么解决么?
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from gmssl.