Coder Social home page Coder Social logo

Comments (20)

lpilp avatar lpilp commented on June 12, 2024 1

@zzl360 @ugenehan @Holy-Shine 测试下,没有问题呢,是可以互通,是使用上的问题 在 linux系统里 echo hello 实际上是 “hello\n”, 如果在bc里用 str = "hello"的话,在gmssl里是测试不通过的,是这个换行的问题,

from gmssl.

lpilp avatar lpilp commented on June 12, 2024

gmssl 签名出来的是 asn1(r,s), bc库中的签名函数 就有签名出 asn1(r, s) 的函数,是可以互通的

from gmssl.

lpilp avatar lpilp commented on June 12, 2024

gmssl 签名出来的是 asn1(r,s), bc库中的签名函数 就有签名出 asn1(r, s) 的函数,是可以互通的

注意的一个问题是,gmssl用到的私钥是加密过的,公钥是明文, BC库用的公私钥都是明文的, gmssl签名,bc库验签名没有问题,倒过来的话,需要把gmssl使用的私钥解密码下

from gmssl.

ugenehan avatar ugenehan commented on June 12, 2024

gmssl 签名出来的是 asn1(r,s), bc库中的签名函数 就有签名出 asn1(r, s) 的函数,是可以互通的

注意的一个问题是,gmssl用到的私钥是加密过的,公钥是明文, BC库用的公私钥都是明文的, gmssl签名,bc库验签名没有问题,倒过来的话,需要把gmssl使用的私钥解密码下

可以用BC生成公钥、私钥,然后签名;GMSSL中用sm2_key_set_public_key设置一下公钥,然后验签,这样可以的吧?

from gmssl.

lpilp avatar lpilp commented on June 12, 2024

可以的

from gmssl.

ugenehan avatar ugenehan commented on June 12, 2024

可以的

https://github.com/ZZMarquis/gmhelper.git的测试用例SM2UtilTest.java中的testSignAndVerify,生成公钥、私钥和签名后的消息,然后gmssl中用sm2_verify没通过。sm2_key_set_public_key设置公钥,再将签名hex转成str,最后用sm2_verify验签,没通过。是哪边设置有问题吗?

from gmssl.

lpilp avatar lpilp commented on June 12, 2024
gmssl sm2verify -pubkey sm2pub.pem -sig sm2.sig

例子中的这个sm2.sig 里存的bin类型

from gmssl.

ugenehan avatar ugenehan commented on June 12, 2024
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.

lpilp avatar lpilp commented on June 12, 2024

这只能自己调试下了,哪一步不对了,bc库签名, 然后一步步调试BC验签与gmssl 签名中每一步输出

from gmssl.

Holy-Shine avatar Holy-Shine commented on June 12, 2024

同样遇到了这个问题,目前还没找到原因

from gmssl.

ugenehan avatar ugenehan commented on June 12, 2024

与gmssl 签名中每一步

看来得先熟悉下SM2了

from gmssl.

zzl360 avatar zzl360 commented on June 12, 2024

可以先用其他的国密库验证bc的签名试试。看看是哪边特立独行。

from gmssl.

lpilp avatar lpilp commented on June 12, 2024
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.

Holy-Shine avatar Holy-Shine commented on June 12, 2024

我的情况是sm2signwithsm3(sm3做摘要,sm2加密):用python的gmssl库做签名,Lua用FFI库调用gmssl验签,一步步下来,发现可能的原因是sm3哈希结果不一致导致的,python的gmssl库做sm3摘要的时候,拼接的pubkey不带前缀04的,而gmssl貌似是带的

from gmssl.

lpilp avatar lpilp commented on June 12, 2024

我的情况是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.

Holy-Shine avatar Holy-Shine commented on June 12, 2024

我的情况是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.

lpilp avatar lpilp commented on June 12, 2024

@Holy-Shine , 没有问题呢,是不是你使用上有问题

[root@localhost scripts]# echo -n abc|gmssl sm3
66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0

就比如sm3("abc")

/Python/Python38-32/python3   tm3.py
66c7f0f462eeedd9d1f2d46bdc10e4e24167c4875cf2f7a2297da02b8f4ba8e0

用这两个出来的是一样的呢,

from gmssl.

Holy-Shine avatar Holy-Shine commented on June 12, 2024

@lpilp ok我再看看,非常感谢

from gmssl.

ugenehan avatar ugenehan commented on June 12, 2024

以下代码可以与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 avatar Holy-Shine commented on June 12, 2024

@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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.