Comments (20)
@zzl360 @ugenehan @Holy-Shine 测试下,没有问题呢,是可以互通,是使用上的问题 在 linux系统里 echo hello 实际上是 “hello\n”, 如果在bc里用 str = "hello"的话,在gmssl里是测试不通过的,是这个换行的问题,
from gmssl.
gmssl 签名出来的是 asn1(r,s), bc库中的签名函数 就有签名出 asn1(r, s) 的函数,是可以互通的
from gmssl.
gmssl 签名出来的是 asn1(r,s), bc库中的签名函数 就有签名出 asn1(r, s) 的函数,是可以互通的
注意的一个问题是,gmssl用到的私钥是加密过的,公钥是明文, BC库用的公私钥都是明文的, gmssl签名,bc库验签名没有问题,倒过来的话,需要把gmssl使用的私钥解密码下
from gmssl.
gmssl 签名出来的是 asn1(r,s), bc库中的签名函数 就有签名出 asn1(r, s) 的函数,是可以互通的
注意的一个问题是,gmssl用到的私钥是加密过的,公钥是明文, BC库用的公私钥都是明文的, gmssl签名,bc库验签名没有问题,倒过来的话,需要把gmssl使用的私钥解密码下
可以用BC生成公钥、私钥,然后签名;GMSSL中用sm2_key_set_public_key设置一下公钥,然后验签,这样可以的吧?
from gmssl.
可以的
from gmssl.
可以的
用https://github.com/ZZMarquis/gmhelper.git的测试用例SM2UtilTest.java中的testSignAndVerify,生成公钥、私钥和签名后的消息,然后gmssl中用sm2_verify没通过。sm2_key_set_public_key设置公钥,再将签名hex转成str,最后用sm2_verify验签,没通过。是哪边设置有问题吗?
from gmssl.
gmssl sm2verify -pubkey sm2pub.pem -sig sm2.sig
例子中的这个sm2.sig 里存的bin类型
from gmssl.
gmssl sm2verify -pubkey sm2pub.pem -sig sm2.sig
例子中的这个sm2.sig 里存的bin类型
我分别用的是gmssl自带的demo中sing例子,以及gmhelper中单元测试的例子。
`
/gmhelper中签名例子****/
public void testSignAndVerify() {
try {
AsymmetricCipherKeyPair keyPair = SM2Util.generateKeyPairParameter();
ECPrivateKeyParameters priKey = (ECPrivateKeyParameters) keyPair.getPrivate();
ECPublicKeyParameters pubKey = (ECPublicKeyParameters) keyPair.getPublic();
System.out.println("Pri Hex:"
+ ByteUtils.toHexString(priKey.getD().toByteArray()).toUpperCase());
System.out.println("Pub X Hex:"
+ ByteUtils.toHexString(pubKey.getQ().getAffineXCoord().getEncoded()).toUpperCase());
System.out.println("Pub Y Hex:"
+ ByteUtils.toHexString(pubKey.getQ().getAffineYCoord().getEncoded()).toUpperCase());
System.out.println("Pub Point Hex:"
+ ByteUtils.toHexString(pubKey.getQ().getEncoded(false)).toUpperCase());
byte[] sign = SM2Util.sign(priKey, null, SRC_DATA);
System.out.println("SM2 sign with withId result:\n" + ByteUtils.toHexString(sign));
byte[] rawSign = SM2Util.decodeDERSM2Sign(sign);
sign = SM2Util.encodeSM2SignToDER(rawSign);
System.out.println("SM2 sign with withId result:\n" + ByteUtils.toHexString(sign));
boolean flag = SM2Util.verify(pubKey, null, SRC_DATA, sign);
if (!flag) {
Assert.fail("verify failed");
}
sign = SM2Util.sign(priKey, SRC_DATA);
System.out.println("SM2 sign without withId result:\n" + ByteUtils.toHexString(sign));
flag = SM2Util.verify(pubKey, SRC_DATA, sign);
if (!flag) {
Assert.fail("verify failed");
}
} catch (Exception ex) {
ex.printStackTrace();
Assert.fail();
}
}
`
`
/gmssl自带的签名demo例子修改****/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <gmssl/sm2.h>
#include <gmssl/error.h>
#include
int main(void)
{
SM2_KEY sm2_key;
SM2_KEY pub_key;
unsigned char dgst[32];
// unsigned char sig[SM2_MAX_SIGNATURE_SIZE];
size_t siglen;
int ret;
char* p = "hello world";
sm3_digest((unsigned char *)p, strlen(p), dgst);
format_bytes(stdout, 0, 0, "to be signed digest", dgst, sizeof(dgst));
char* pub_key_x = "testSignAndVerify函数生成的X";
char* pub_key_y = "testSignAndVerify函数生成的Y";
char* priv_key = "testSignAndVerify函数生成的私钥";
SM2_POINT point;
//转换
Hex2Str(pub_key_x,64,(char*)point.x);
Hex2Str(pub_key_y,64,(char*)point.y);
sm2_key_set_public_key(&sm2_key,&point);
//Hex2Str(priv_key,664,(char*)sm2_key.private_key);
std::string sing = "testSignAndVerify签名结果";
std::string sig = Hex2Byte(si);//转换为字节
// sm2_key_generate(&sm2_key);
// sm2_sign(&sm2_key, dgst, sig, &siglen);
// format_bytes(stdout, 0, 0, "signature", sig, siglen);
memcpy(&pub_key, &sm2_key, sizeof(SM2_POINT));
if ((ret = sm2_verify(&pub_key, dgst, sig.data(), sig.size())) != 1) {
fprintf(stderr, "verify failed\n");
} else {
printf("verify success\n");
}
return 0;
}
`
from gmssl.
这只能自己调试下了,哪一步不对了,bc库签名, 然后一步步调试BC验签与gmssl 签名中每一步输出
from gmssl.
同样遇到了这个问题,目前还没找到原因
from gmssl.
与gmssl 签名中每一步
看来得先熟悉下SM2了
from gmssl.
可以先用其他的国密库验证bc的签名试试。看看是哪边特立独行。
from gmssl.
echo hello | gmssl sm2verify -pubkey sm2pub.pem -sig sm2.sig -id 1234567812345678
demo的命令行的问题 改成这就OK了
#去掉换行
echo hello|awk '{printf($1)}' |gmssl sm2verify -pubkey sm2pub.pem -sig sm2.sig -id 1234567812345678
from gmssl.
我的情况是sm2signwithsm3(sm3做摘要,sm2加密):用python的gmssl库做签名,Lua用FFI库调用gmssl验签,一步步下来,发现可能的原因是sm3哈希结果不一致导致的,python的gmssl库做sm3摘要的时候,拼接的pubkey不带前缀04的,而gmssl貌似是带的
from gmssl.
我的情况是sm2signwithsm3(sm3做摘要,sm2加密):用python的gmssl库做签名,Lua用FFI库调用gmssl验签,一步步下来,发现可能的原因是sm3哈希结果不一致导致的,python的gmssl库做sm3摘要的时候,拼接的pubkey不带前缀04的,而gmssl貌似是带的
这个和04不04的没什么问题,各个项目自己对公钥的表示的问题,在使用的时候,都要把04去掉的,
你用的python库是 pip install gmssl 这个库吗?这个库的签名是 r+s 格式的, 本项目是 asn1(r,s) ,大多数的项目是 asn1(r,s)的,要进行匹配的时候,得做下转换
from gmssl.
我的情况是sm2signwithsm3(sm3做摘要,sm2加密):用python的gmssl库做签名,Lua用FFI库调用gmssl验签,一步步下来,发现可能的原因是sm3哈希结果不一致导致的,python的gmssl库做sm3摘要的时候,拼接的pubkey不带前缀04的,而gmssl貌似是带的
这个和04不04的没什么问题,各个项目自己对公钥的表示的问题,在使用的时候,都要把04去掉的, 你用的python库是 pip install gmssl 这个库吗?这个库的签名是 r+s 格式的, 本项目是 asn1(r,s) ,大多数的项目是 asn1(r,s)的,要进行匹配的时候,得做下转换
签名是做了转换的,而且目前gmssl==3.2.2也做了ans1支持,是没有问题的。
摘要自己用python gmssl的 sm3模块生成,然后验签用sm2_verify
,就能过
但是直接用c的gmssl的sm3模块做摘要再输入sm2_verify
就过不了,所以就怀疑是摘要的实现哪里不一致
from gmssl.
@Holy-Shine , 没有问题呢,是不是你使用上有问题
[root@localhost scripts]# echo -n abc|gmssl sm3
66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
就比如sm3("abc")
/Python/Python38-32/python3 tm3.py
66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
用这两个出来的是一样的呢,
from gmssl.
@lpilp ok我再看看,非常感谢
from gmssl.
以下代码可以与BC的互通:
`//私钥形式:B05998.......
sign(const char* privkey,const char* src,size_t len){
SM2_KEY sm2_key;
SM2_SIGN_CTX sign_ctx;
unsigned char sig[SM2_MAX_SIGNATURE_SIZE];
size_t siglen;
uint8_t priv[32] = {0};
//需要将hex的私钥转换成str
hex2str(privkey,64,(char*)priv);
set_key_set_private_key(&sm2_key,priv);
sm2_sign_init(&sign_ctx,&sm2_key,SM2_DEFAULT_ID,SM2_DEFAULT_ID_LENGTH);
sm2_sign_update(&sign_ctx,(unsigned char*)src,len);
sm2_sign_finish(&sign_ctx,sig,&siglen);
//将签名转换成hex,形式为:304.....
}
verify(const char* x,const char* y,const char* src,size_t src_len,const char* sig,size_t sig_len){
SM2_KEY sm2_key;
SM2_POINT point;
//秘钥格式转换
hex2str(x,64,(char*)point.x);
hex2str(x,64,(char*)point.y);
sm2_key_set_public_key(&sm2_key,&point);
//签名后的304....格式的数据转换,假设转换后存在了char* sig_byte中,长度len
hex2byte();
SM2_SIGN_CTX sign_ctx;
sm2_verify_init(&&sign_ctx,&sm2_key,SM2_DEFAULT_ID,SM2_DEFAULT_ID_LENGTH);
sm2_verify_update(&sign_ctx,(unsigned char*)src,src_len);
sm2_verify_finish(&sign_ctx,(unsigned char*)sig_byte,len);
}
`
from gmssl.
@Holy-Shine , 没有问题呢,是不是你使用上有问题
[root@localhost scripts]# echo -n abc|gmssl sm3 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
就比如sm3("abc")
/Python/Python38-32/python3 tm3.py 66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0
用这两个出来的是一样的呢,
是我理解错了,我以为SM2SignWithSM3
就是简单的sm2sign(sm3_hash(data))
,所以用gmssl的api的时候就掉了俩函数,获得了跟py-gmssl不一样的签名结果,实际上sm3_hash(·)
的时候,对data
做了扩充
from gmssl.
Related Issues (20)
- 请问3.1.1版本是否支持AIX HOT 2
- Python的ssl加载证书出错
- 国密 tomcat已经验证没问题, 使用iOS 的GmSSL最新sdk访问 localhost 报错,访问其他国密地址没有问题
- sm2.h文件报不存在 HOT 2
- 请求新加全局控制打印函数的功能,可以使得gmssl库不打屏 HOT 1
- 请求添加类似openssl 的 sslPending 的函数接口
- 请求添加 获取 TLS_CTX 、TLS_CONNECT 的size的接口
- sm2_encrypt_demo.c运行解密失败 HOT 2
- win 下面 golang cgo编译 报/x86_64-w64-mingw32/bin/ld.exe: cannot find -lgmssl HOT 1
- 可否在sm2_signtest.c添加secp256r1曲线的相关代码? HOT 4
- linux sh安装后查看版本 报gmssl: error while loading shared libraries: libgmssl.so.3: cannot open shared object file: No such file or directory HOT 3
- 建议编译增加mingw的支持 HOT 1
- gmssl tls12_client 和 tls13_client 链接各自服务器报错,tlcp_client 链接 tlcp_server 没问题
- 私钥密码中包含"^"时无法使用sm2_private_key_info_decrypt_from_pem读取证书 HOT 2
- Gmssl V2最新版,ecb模式下,aes,des,sm4,加密中英文混合后数据均不完整但英文正常,cbc模式下中文英文混合均正常 HOT 1
- Why delete '_gmssl_export' key word HOT 1
- 请问 master分支如何 开启这个 DENABLE_BROKEN_CRYPTO 配置项呢 HOT 1
- 编译GmSSL3.1.1发行版报错,tools/tlcp_client.c:147:3: error: unknown type name ‘fd_set’; HOT 1
- 编译GmSSL3.1.1发行版报错,tools/tlcp_client.c:147:3: error: unknown type name ‘fd_set’;
- 运行JS版,sm3hmac,报错 Uncaught ReferenceError: sm3_ctx_free is not defined
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.