go如何对由椭圆曲线参数`sm2p256v1`生成密钥文件进行sm2加解密

1. 运行环境

开发环境: Kubuntu22.04
GO: go version go1.22.1 linux/amd64

2. 问题描述?

和java有部分接口交互,所以需要用到由java生成的密钥对 (目前已知java的椭圆曲线参数是sm2p256v1这种的).
我在go这里找了几个包都不行

pkg.go.dev/github.com/tjfoc/gmsm/s...
pkg.go.dev/github.com/emmansun/gms...
github.com/deatil/go-cryptobin 这个包来自这个大佬的文章 分享:go 国密招商银行对接

希望大佬们指点一下用哪个包的哪个方法去做加解密?
非常感谢


java密钥对
"prikey": "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg6rgCft6jHsmv5YnpZaWrk7fQQY9R2VoWyJ9d87XSfv6gCgYIKoEcz1UBgi2hRANCAAQRvBC+7ApOlK7fKzDb/XBCw7CrWZkC8orgyKbBbGxZRwVbCYmjygAUF6no4c1/g2lsxc+LiDUGXcAv1gr7+fGq"

"pubkey": "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEEbwQvuwKTpSu3ysw2/1wQsOwq1mZAvKK4MimwWxsWUcFWwmJo8oAFBep6OHNf4NpbMXPi4g1Bl3AL9YK+/nxqg=="


go密钥对(由java生成)
"prikey": "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgUrsLxV86AjpYVYuIZdocV5v+1yHU+KO5U73If/Pe5fmgCgYIKoEcz1UBgi2hRANCAASpHt92CMRA92RyBfXQ1LzOPTjq1qOf/0Z7KVdyc/zmsbeCKmwaGQeXn9IU5R7khb5V8DQcl+n1kr5Z8DM1fIUW"

"pubkey": "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEqR7fdgjEQPdkcgX10NS8zj046tajn/9GeylXcnP85rG3gipsGhkHl5/SFOUe5IW+VfA0HJfp9ZK+WfAzNXyFFg=="


然后双方交换公钥, 下面是有java公钥生成的密文
密文(原始数据是"LoveLive!TypeMoon!Idoly-Pride!"): "BPkRkx6Wl4KlHajh+V5znPxxpAFkZhQlxXFlaJxd/wRPHqxvnEaR/NI2d6+pa7CKXVHoJQ1Z6bAsXYEDYnKVJyNeIqhqQxxrNGl5rURnL0kDdwGJiEGQ54FRprdMIY0YEIngqw7fkorKk+6SLiTSDjuAr//z+VK4JoA6jEvuIy1l"

sign: "MEQCICAyzvt0lGp8TmErHdiQ4Ovkso0Ji8edFif04yhPuOY3AiBKeSzegV8Wh2KSHXt4AmXnoo8ELzF8PNLRgkzfbBhpmw=="
最佳答案

公钥和私钥不是明文最好还是发 PEM 格式化后的,容易解析

测试了下,暂时可以,不过发的用来签名的数据不清楚,只能测试出来,最好把怎么加密和怎么签名的发出来

    import (
        "github.com/deatil/go-cryptobin/cryptobin/sm2"
    )

    java_prikey := "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg6rgCft6jHsmv5YnpZaWrk7fQQY9R2VoWyJ9d87XSfv6gCgYIKoEcz1UBgi2hRANCAAQRvBC+7ApOlK7fKzDb/XBCw7CrWZkC8orgyKbBbGxZRwVbCYmjygAUF6no4c1/g2lsxc+LiDUGXcAv1gr7+fGq"
    java_prikeyBytes, _ := base64.StdEncoding.DecodeString(java_prikey)

    go_pubkey := "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEqR7fdgjEQPdkcgX10NS8zj046tajn/9GeylXcnP85rG3gipsGhkHl5/SFOUe5IW+VfA0HJfp9ZK+WfAzNXyFFg=="
    go_pubkeyBytes, _ := base64.StdEncoding.DecodeString(go_pubkey)

    java_sign := "MEQCICAyzvt0lGp8TmErHdiQ4Ovkso0Ji8edFif04yhPuOY3AiBKeSzegV8Wh2KSHXt4AmXnoo8ELzF8PNLRgkzfbBhpmw=="

    java_enData := "BPkRkx6Wl4KlHajh+V5znPxxpAFkZhQlxXFlaJxd/wRPHqxvnEaR/NI2d6+pa7CKXVHoJQ1Z6bAsXYEDYnKVJyNeIqhqQxxrNGl5rURnL0kDdwGJiEGQ54FRprdMIY0YEIngqw7fkorKk+6SLiTSDjuAr//z+VK4JoA6jEvuIy1l"
    java_enDataBytes, _ := base64.StdEncoding.DecodeString(java_enData)

    // 解密
    dedata := sm2.
        FromBase64String(java_enData).
        FromPKCS8PrivateKeyDer(java_prikeyBytes).
        SetMode("C1C2C3").
        Decrypt().
        ToString()
    // optput: LoveLive!TypeMoon!Idoly-Pride!

    // 验证
    veri := sm2.
        FromBase64String(java_sign).
        FromPublicKeyDer(go_pubkeyBytes).
        VerifyASN1(java_enDataBytes).
        ToVerify()
    // optput: true
1个月前 评论
Harvoc (楼主) 1个月前
deatil (作者) 1个月前
Harvoc (楼主) 1个月前
deatil (作者) 1个月前
讨论数量: 5

公钥和私钥不是明文最好还是发 PEM 格式化后的,容易解析

测试了下,暂时可以,不过发的用来签名的数据不清楚,只能测试出来,最好把怎么加密和怎么签名的发出来

    import (
        "github.com/deatil/go-cryptobin/cryptobin/sm2"
    )

    java_prikey := "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQg6rgCft6jHsmv5YnpZaWrk7fQQY9R2VoWyJ9d87XSfv6gCgYIKoEcz1UBgi2hRANCAAQRvBC+7ApOlK7fKzDb/XBCw7CrWZkC8orgyKbBbGxZRwVbCYmjygAUF6no4c1/g2lsxc+LiDUGXcAv1gr7+fGq"
    java_prikeyBytes, _ := base64.StdEncoding.DecodeString(java_prikey)

    go_pubkey := "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEqR7fdgjEQPdkcgX10NS8zj046tajn/9GeylXcnP85rG3gipsGhkHl5/SFOUe5IW+VfA0HJfp9ZK+WfAzNXyFFg=="
    go_pubkeyBytes, _ := base64.StdEncoding.DecodeString(go_pubkey)

    java_sign := "MEQCICAyzvt0lGp8TmErHdiQ4Ovkso0Ji8edFif04yhPuOY3AiBKeSzegV8Wh2KSHXt4AmXnoo8ELzF8PNLRgkzfbBhpmw=="

    java_enData := "BPkRkx6Wl4KlHajh+V5znPxxpAFkZhQlxXFlaJxd/wRPHqxvnEaR/NI2d6+pa7CKXVHoJQ1Z6bAsXYEDYnKVJyNeIqhqQxxrNGl5rURnL0kDdwGJiEGQ54FRprdMIY0YEIngqw7fkorKk+6SLiTSDjuAr//z+VK4JoA6jEvuIy1l"
    java_enDataBytes, _ := base64.StdEncoding.DecodeString(java_enData)

    // 解密
    dedata := sm2.
        FromBase64String(java_enData).
        FromPKCS8PrivateKeyDer(java_prikeyBytes).
        SetMode("C1C2C3").
        Decrypt().
        ToString()
    // optput: LoveLive!TypeMoon!Idoly-Pride!

    // 验证
    veri := sm2.
        FromBase64String(java_sign).
        FromPublicKeyDer(go_pubkeyBytes).
        VerifyASN1(java_enDataBytes).
        ToVerify()
    // optput: true
1个月前 评论
Harvoc (楼主) 1个月前
deatil (作者) 1个月前
Harvoc (楼主) 1个月前
deatil (作者) 1个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!