精华内容
下载资源
问答
  • 近期go项目对接第三方Java服务,第三方要求使用国密sm3/sm2算法进行数据签名验签,特记录go端开发注意事项1 关于密钥对密钥生成可以使用openssl库,openssl版本至少是1.1.1,终端运行openssl version检查版本,之前版本不...

    近期go项目对接第三方Java服务,第三方要求使用国密sm3/sm2算法进行数据签名验签,特记录go端开发注意事项

    1 关于密钥对

    密钥生成可以使用openssl库,openssl版本至少是1.1.1,终端运行openssl version检查版本,之前版本不支持sm2/sm3, openssl官网https://www.openssl.org/source/

    检查椭圆曲线是否包含sm2,如下所示是支持sm2的。

    $ openssl ecparam -list_curves | grep SM2

    SM2 : SM2 curve over a 256 bit prime field

    密钥生成流程,存在第四步的原因是go使用的库需要读取pkcs#8格式私钥pem文件:

    1 生成sm2私钥: openssl ecparam -genkey -name SM2 -out sm2PriKey.pem

    2 sm2私钥导出公钥: openssl ec -in sm2PriKey.pem -pubout -out sm2PubKey.pem

    3 查看私钥: openssl ec -in sm2PriKey.pem -text

    4 私钥pkcs#1转pkcs#8: openssl pkcs8 -topk8 -inform PEM -in sm2PriKey.pem -outform pem -nocrypt -out sm2PriKeyPkcs8.pem

    2 go签名验签代码

    1 读取公钥pem文件, 将公钥X/Y的bytes拼接base64编码,函数示例:

    func DealPubKey() {

    // 公钥X/Y的bytes拼接后base64编码

    PubKeyPath := "/home/xx/sm2PubKey.pem"

    pubKey, e := sm2.ReadPublicKeyFromPem(PubKeyPath, nil)

    if e != nil {

    log.Println("pubKeyPem read failed, error: ", e)

    }

    var buf bytes.Buffer

    buf.Write(pubKey.X.Bytes())

    buf.Write(pubKey.Y.Bytes())

    XY := base64.StdEncoding.EncodeToString(buf.Bytes())

    log.Println("pubKey XY base64--->", XY)

    }

    2 sm2签名验签使用的包"github.com/tjfoc/gmsm/sm2", go mod自动安装不会安装最新版本, go.mod不要添加此包,

    github最新版本是是V1.2, 切换到项目目录, 终端运行 go get github.com/tjfoc/gmsm@master安装最新版本后会自动添加到go.mod

    3 "github.com/tjfoc/gmsm/sm2"使用签名函数为 sm2.Sm2Sign, 此函数会将输入的[]bytes类型数据sm3摘要运算后进行sm2签名, 对应验签函数sm2.Sm2Verify

    4 函数sm2.Sign默认是使用sha-512进行摘要运算,与服务端Java签名验签失败.

    代码示例:

    package main

    import (

    "bytes"

    "encoding/base64"

    "fmt"

    "github.com/tjfoc/gmsm/sm2"

    "log"

    "math/big"

    "os"

    )

    var (

    default_uid = []byte{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}

    )

    func Sign(body string) (string, error) {

    cwd, _ := os.Getwd()

    PriKeyPath := cwd + string(os.PathSeparator) + "sm2PriKeyPkcs8.pem"

    priKey, e := sm2.ReadPrivateKeyFromPem(PriKeyPath, nil)

    if e != nil {

    log.Println("priKeyPem read failed, error: ", e)

    return "", e

    }

    r, s, err := sm2.Sm2Sign(priKey, []byte(body), default_uid)

    if err != nil {

    log.Println("priKey sign error: ", err)

    return "", err

    }

    //Buffer是一个实现了读写方法的可变大小的字节缓冲

    var buffer bytes.Buffer

    buffer.Write(r.Bytes())

    buffer.Write(s.Bytes())

    signature := base64.StdEncoding.EncodeToString(buffer.Bytes())

    log.Println("priKey signature base64: ", signature)

    return signature, nil

    }

    func Verify(body, signature string) {

    cwd, _ := os.Getwd()

    PubKeyPath := cwd + string(os.PathSeparator) + "sm2PubKey.pem"

    pubKey, e := sm2.ReadPublicKeyFromPem(PubKeyPath, nil)

    if e != nil {

    log.Println("pubKeyPem read failed, error: ", e)

    }

    d64, err := base64.StdEncoding.DecodeString(signature)

    if err != nil {

    log.Println("base64 decode error: ", err)

    }

    l := len(d64)

    br := d64[:l/2]

    bs := d64[l/2:]

    var ri, si big.Int

    r := ri.SetBytes(br)

    s := si.SetBytes(bs)

    v := sm2.Sm2Verify(pubKey, []byte(body), default_uid, r, s)

    log.Printf("pubKey verified: %v\n", v)

    }

    func main() {

    body := `{"name":"mike","gender":"male"}`

    signature, _ := Sign(body)

    Verify(body, signature)

    }

    展开全文
  • java国密算法实现

    2019-01-07 17:32:40
    java 国密算法sm2、sm3 详细使用参考:https://blog.csdn.net/weixin_30512027/article/details/86013878
  • 近期go项目对接第三方Java服务,第三方要求使用国密sm3/sm2算法进行数据签名验签,特记录go端开发注意事项1 关于密钥对密钥生成可以使用openssl库,openssl版本至少是1.1.1,终端运行 openssl version检查版本,之前版本...

    近期go项目对接第三方Java服务,第三方要求使用国密sm3/sm2算法进行数据签名验签,特记录go端开发注意事项

    1 关于密钥对

    密钥生成可以使用openssl库,openssl版本至少是1.1.1,终端运行 openssl version

    检查版本,之前版本不支持sm2/sm3, openssl官网 https://www.openssl.org/source/

    检查椭圆曲线是否包含sm2,如下所示是支持sm2的。

    $ openssl ecparam -list_curves | grep SM2

    SM2 : SM2 curve over a 256 bit prime field

    密钥生成流程,存在第四步的原因是go使用的库需要读取pkcs#8格式私钥pem文件:

    1 生成sm2私钥: openssl ecparam -genkey -name SM2 -out sm2PriKey.pem

    2 sm2私钥导出公钥: openssl ec -in sm2PriKey.pem -pubout -out sm2PubKey.pem

    3 查看私钥: openssl ec -in sm2PriKey.pem -text

    4 私钥pkcs#1转pkcs#8: openssl pkcs8 -topk8 -inform PEM -in sm2PriKey.pem -outform pem -nocrypt -out sm2PriKeyPkcs8.pem

    2 go签名验签代码

    1 读取公钥pem文件, 将公钥X/Y的bytes拼接base64编码,函数示例:

    func DealPubKey() {

    // 公钥X/Y的bytes拼接后base64编码

    PubKeyPath := "/home/xx/sm2PubKey.pem"

    pubKey, e := sm2.ReadPublicKeyFromPem(PubKeyPath, nil)

    if e != nil {

    log.Println("pubKeyPem read failed, error: ", e)

    }

    var buf bytes.Buffer

    buf.Write(pubKey.X.Bytes())

    buf.Write(pubKey.Y.Bytes())

    XY := base64.StdEncoding.EncodeToString(buf.Bytes())

    log.Println("pubKey XY base64--->", XY)

    }

    2 sm2签名验签使用的包”github.com/tjfoc/gmsm/sm2″, go mod自动安装不会安装最新版本, go.mod不要添加此包,

    github最新版本是是V1.2, 切换到项目目录, 终端运行 go get github.com/tjfoc/gmsm@master

    安装最新版本后会自动添加到go.mod

    3 “github.com/tjfoc/gmsm/sm2″使用签名函数为 sm2.Sm2Sign, 此函数会将输入的[]bytes类型数据sm3摘要运算后进行sm2签名, 对应验签函数sm2.Sm2Verify

    4 函数sm2.Sign默认是使用sha-512进行摘要运算,与服务端Java签名验签失败.

    代码示例:

    package main

    import (

    "bytes"

    "encoding/base64"

    "fmt"

    "github.com/tjfoc/gmsm/sm2"

    "github.com/tjfoc/gmsm/sm3"

    "log"

    "math/big"

    "os"

    )

    var (

    default_uid = []byte{0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38}

    )

    func Sign(body string) (string, error) {

    cwd, _ := os.Getwd()

    PriKeyPath := cwd + string(os.PathSeparator) + "sm2PriKeyPkcs8.pem"

    priKey, e := sm2.ReadPrivateKeyFromPem(PriKeyPath, nil)

    if e != nil {

    log.Println("priKeyPem read failed, error: ", e)

    return "", e

    }

    r, s, err := sm2.Sm2Sign(priKey, []byte(body), default_uid)

    if err != nil {

    log.Println("priKey sign error: ", err)

    return "", err

    }

    //Buffer是一个实现了读写方法的可变大小的字节缓冲

    var buffer bytes.Buffer

    buffer.Write(r.Bytes())

    buffer.Write(s.Bytes())

    signature := base64.StdEncoding.EncodeToString(buffer.Bytes())

    log.Println("priKey signature base64: ", signature)

    return signature, nil

    }

    func Verify(body, signature string) {

    cwd, _ := os.Getwd()

    PubKeyPath := cwd + string(os.PathSeparator) + "sm2PubKey.pem"

    pubKey, e := sm2.ReadPublicKeyFromPem(PubKeyPath, nil)

    if e != nil {

    log.Println("pubKeyPem read failed, error: ", e)

    }

    d64, err := base64.StdEncoding.DecodeString(signature)

    if err != nil {

    log.Println("base64 decode error: ", err)

    }

    l := len(d64)

    br := d64[:l/2]

    bs := d64[l/2:]

    var ri, si big.Int

    r := ri.SetBytes(br)

    s := si.SetBytes(bs)

    v := sm2.Sm2Verify(pubKey, []byte(body), default_uid, r, s)

    log.Printf("pubKey verified: %v\n", v)

    }

    func main() {

    body := `{"name":"mike","gender":"male"}`

    signature, _ := Sign(body)

    Verify(body, signature)

    }

    展开全文
  • 1. 使用BC库1.59版本已经可以支持国密算法SM2/SM3/SM4,某大神写的详细测试例子:https://github.com/ZZMarquis/gmhelper2.制作证书参考网上资料简单例子;``` javapublic static void genSM2CertBySelf() throws ...

    1. 使用BC库1.59版本已经可以支持国密算法SM2/SM3/SM4,某大神写的详细测试例子:https://github.com/ZZMarquis/gmhelper

    2. 制作证书参考网上资料简单例子;

    ``` java

    public static void genSM2CertBySelf() throws OperatorCreationException, IOException, CertificateException {

    String dn = "CN=dfg, OU=aert, O=45y, L=sdfg, ST=fg, C=CN";

    long year = 360 * 24 * 60 * 60 * 1000;

    Date notBefore = new Date();

    Date notAfter = new Date(notBefore.getTime() + year);

    //证书的名称

    String fileName = "self"+new Date().getTime()/1000;

    String path  = "/test/gmhelper/";

    String rootCertPath = path+fileName+".der";

    AsymmetricCipherKeyPair kp = Sm2Util.generateKeyPair();

    ECPrivateKeyParameters bcecPrivateKey = (ECPrivateKeyParameters)kp.getPrivate();

    ECPublicKeyParameters bcecPublicKey = (ECPublicKeyParameters)kp.getPublic();

    BcX509v3CertificateBuilder build = new BcX509v3CertificateBuilder(

    new X500Name(dn),

    BigInteger.probablePrime(64, new Random()),

    notBefore,

    notAfter,

    new X500Name(dn),

    bcecPublicKey);

    AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SM3withSM2");//即"1.2.156.10197.1.501"

    AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find("SHA256");

    ContentSigner sigGen = new BcECContentSignerBuilder(sigAlgId, digAlgId).build(bcecPrivateKey);

    X509CertificateHolder x509certHolder = build.build(sigGen);

    FileOutputStream outputStream = new FileOutputStream(rootCertPath);

    outputStream.write(x509certHolder.getEncoded());

    outputStream.close();

    }

    ```

    3. 使用上面介绍的制作证书方法如果跟GMSSL生成的证书比对缺少“公钥参数”对象,因为BC库公钥是采用X9.62格式,见rfc5349 https://tools.ietf.org/html/rfc5349 ; 如果一定要带公钥参数对象,代码去处理下ASN.1,把BcX509v3CertificateBuilder修改为X509v3CertificateBuilder,公钥通过createSubjectECPublicKeyInfo做下转换

    ``` java

    public static SubjectPublicKeyInfo createSubjectECPublicKeyInfo(ECPublicKeyParameters pub)

    {

    ASN1OctetString p = (ASN1OctetString)new X9ECPoint(pub.getQ()).toASN1Primitive();

    return new SubjectPublicKeyInfo(new AlgorithmIdentifier(X9ObjectIdentifiers.id_ecPublicKey, GMObjectIdentifiers.sm2p256v1), p.getOctets());

    }

    ```

    4. 自己如何构造公钥参数ECPublicKeyParameters参考:http://linuxgao.iteye.com/blog/2389904  如果要构造私钥参数类似如此操作,更简单,因为私钥参数ECPrivateKeyParameters只有一个大数BigInteger

    5. 证书解析参考:https://blog.csdn.net/qq_32221419/article/details/59111828

    6、证书请求及其它:参考 http://www.sitcoder.com/?post=54 和

    https://blog.csdn.net/jinhill/article/details/17612273

    展开全文
  • java使用国密sm算法

    2019-08-22 19:31:19
    https://www.cnblogs.com/alsodzy/p/9854521.html
    展开全文
  • 背景Java自身通过JCE和JSSE支持标准的SSL协议,但并不支持国密SSL协议。本文描述了Java使用国密JCE和国密JSSE开发一个简单的客户端程序,连接国密Web网站,发送HTTP请求,并接收HTTP应答。环境JRE是jre8。国密JCE和...
  • 背景Java自身通过JCE和JSSE支持标准的SSL协议,但并不支持国密SSL协议。本文描述了Java使用国密JCE和国密JSSE开发一个简单的客户端程序,连接国密Web网站,发送HTTP请求,并接收HTTP应答。环境JRE是jre8。国密JCE和...
  • 参考资料: https://baijiahao.baidu.com/s?id=1629915330021466224&...-- 国密算法 --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-
  • 国密SM4 - Java.zip

    2019-09-17 18:23:38
    JAVA实现国密SM4加解密,达到前端JS加密,后台Java解密的效果。 JS版见: https://download.csdn.net/download/qq_36917130/11296303
  • 国密SSL系列之Java编程

    千次阅读 2020-08-24 13:19:24
    Java自身通过JCE和JSSE支持标准的SSL协议,但并不支持国密SSL协议。本文描述了Java使用国密JCE和国密JSSE开发一个简单的客户端程序,连接国密Web网站,发送HTTP请求,并接收HTTP应答。 2 环境 JRE是jre8。 国密...
  • java sm4国密算法 CBC模式 加解密工具类说明maven依赖生成密钥加密解密测试完整代码最后 说明 工具类最开始是参考这篇博客java sm4国密算法加密、解密,但是该篇博客使用的是EBC模式,所以参考其他文章改成了CBC模式...
  • java sm3国密算法加密、验证工具类说明maven依赖完整代码测试 说明 由于本人并不专于算法和密码学,所以如果发现工具类存在问题或者可优化地方,欢迎评论处提出。 maven依赖 <!-- ...
  • SM2国密算法JAVA版,其中包含了加密和解密。附使用教程;代码经过本人测试通过。另:可与C#版SM2加解密互通 C#地址:https://download.csdn.net/download/qq137669431/11157399
  • 国密开源代码

    千次阅读 2018-01-19 14:04:35
    c/c++ 国密开源工程http://gmssl.org/java 国密开源代码 https://github.com/gotoworld/hsd-cipher-sm
  • 项目涉及保密传输,要求使用国密算法,一般遇到类似问题首先想到的就是使用非对称...Java版比较好办,较新版本的bouncycastle就支持了SM2/SM3/SM4,麻烦在于JS版,找了很多都有问题,直到遇到了这个项目:https://g...
  • 国密SM4,javaScript加密 java解密

    千次阅读 2020-01-07 10:39:17
    转载自https://www.cnblogs.com/hzxy-blog/p/9355064.html 前段时间因工作需要,接触到了SM算法。国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。 SM1为对称加密。...
  • 由于JAVA 的 API 不支持 国密证书,所以直接在JAVA代码中调用HTTPS请求,指挥中心无法收到请求。所以可以通过反向代理监听本地端口,通过脚本携带国密证书,把request 打到指挥中心。 shell脚本配置 nginx配置脚本 ...
  • 项目涉及保密传输,要求使用国密算法,一般遇到类似问题首先想到的就是...Java版比较好办,较新版本的bouncycastle就支持了SM2/SM3/SM4,麻烦在于JS版,找了很多都有问题,直到遇到了这个项目:https://github.com/S...
  • 项目涉及保密传输,要求使用国密算法,一般遇到类似问题首先想到的就是...Java版比较好办,较新版本的bouncycastle就支持了SM2/SM3/SM4,麻烦在于JS版,找了很多都有问题,直到遇到了这个项目:https://github.com/S...
  • 系统要求 1. Windows系统、Linux系统、Mac系统 2. JDK7及以上 3. JDK使用无限制的安全策略文件 HttpClient客户端核心代码 import java.io.FileInputStream;...import java.io....import java.secur...
  • 国密SM4 - JavaScript.zip

    2019-07-08 15:32:56
    JS仿照JAVA实现国密SM4加解密,达到前端JS加密,后台Java解密的效果 修复后资源链接: https://download.csdn.net/download/qq_36917130/11296303
  • 使用方法见:https://blog.csdn.net/upset_ming/article/details/96491058 1. 修改了前一版本中证书验证的bug,支持JDK8的高版本 2. 支持国密SSL双向认证 3. 将过期的国密证书替换为新证书
  • https://gitee.com/mai12/gmca这是学习大佬的代码写的,结合了GMCA和gmhelper,实现了证书生成,私钥SM4加密存储,再次感谢大佬们。然后是Github和Gitee上找到的开源代码:*****************************...
  • 上一篇随笔文中1.57版本是用得是华为mate20x测试机,我使用了mate10之后发现是1.52,这应该说明手机...https://rtyley.github.io/spongycastle/ 给出的方案: https://github.com/rtyley/spongycastle 所以不想...
  • https://pan.baidu.com/s/1n6Uoyvz3Qo9SjZuCU-hdSg 代码在链接里面,我现在遇到的问题是同样的公钥在js加密后,在java代码中使用对应的私钥无法解密

空空如也

空空如也

1 2 3
收藏数 50
精华内容 20
关键字:

httpsjava国密

java 订阅