-
java 国密p7验签_go/Java 国密sm2签名验签
2021-03-16 14:15:35近期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:40java 国密算法sm2、sm3 详细使用参考:https://blog.csdn.net/weixin_30512027/article/details/86013878 -
java签名验签_go/Java 国密sm2签名验签
2021-03-06 05:38:27近期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)
}
-
java sm_Java国密SM2/SM3/SM4及证书
2021-03-14 22:04:221. 使用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 -
java ssl编程_国密SSL协议之Java编程
2021-02-28 09:21:45背景Java自身通过JCE和JSSE支持标准的SSL协议,但并不支持国密SSL协议。本文描述了Java使用国密JCE和国密JSSE开发一个简单的客户端程序,连接国密Web网站,发送HTTP请求,并接收HTTP应答。环境JRE是jre8。国密JCE和... -
java ssl协议_国密SSL协议之Java编程
2021-02-13 01:41:57背景Java自身通过JCE和JSSE支持标准的SSL协议,但并不支持国密SSL协议。本文描述了Java使用国密JCE和国密JSSE开发一个简单的客户端程序,连接国密Web网站,发送HTTP请求,并接收HTTP应答。环境JRE是jre8。国密JCE和... -
JAVA-国密算法SM3和SM4应用Example
2020-10-24 10:09:54参考资料: https://baijiahao.baidu.com/s?id=1629915330021466224&...-- 国密算法 --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov- -
国密SM4 - Java.zip
2019-09-17 18:23:38JAVA实现国密SM4加解密,达到前端JS加密,后台Java解密的效果。 JS版见: https://download.csdn.net/download/qq_36917130/11296303 -
国密SSL系列之Java编程
2020-08-24 13:19:24Java自身通过JCE和JSSE支持标准的SSL协议,但并不支持国密SSL协议。本文描述了Java使用国密JCE和国密JSSE开发一个简单的客户端程序,连接国密Web网站,发送HTTP请求,并接收HTTP应答。 2 环境 JRE是jre8。 国密... -
java sm4国密算法 CBC模式 加解密工具类
2021-02-25 14:21:09java sm4国密算法 CBC模式 加解密工具类说明maven依赖生成密钥加密解密测试完整代码最后 说明 工具类最开始是参考这篇博客java sm4国密算法加密、解密,但是该篇博客使用的是EBC模式,所以参考其他文章改成了CBC模式... -
java sm3国密算法加密、验证工具类
2021-02-25 15:01:47java sm3国密算法加密、验证工具类说明maven依赖完整代码测试 说明 由于本人并不专于算法和密码学,所以如果发现工具类存在问题或者可优化地方,欢迎评论处提出。 maven依赖 <!-- ... -
国密SM2加解密demo(JAVA篇)
2019-05-03 12:37:00SM2国密算法JAVA版,其中包含了加密和解密。附使用教程;代码经过本人测试通过。另:可与C#版SM2加解密互通 C#地址:https://download.csdn.net/download/qq137669431/11157399 -
国密开源代码
2018-01-19 14:04:35c/c++ 国密开源工程http://gmssl.org/java 国密开源代码 https://github.com/gotoworld/hsd-cipher-sm -
JS实现国密算法SM2加密,后端Java解密
2020-06-10 16:38:28项目涉及保密传输,要求使用国密算法,一般遇到类似问题首先想到的就是使用非对称...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不支持国密证书,通过nginx监听本地解决
2021-04-16 15:27:21由于JAVA 的 API 不支持 国密证书,所以直接在JAVA代码中调用HTTPS请求,指挥中心无法收到请求。所以可以通过反向代理监听本地端口,通过脚本携带国密证书,把request 打到指挥中心。 shell脚本配置 nginx配置脚本 ... -
sm2算法前端处理_JS实现国密算法SM2加密,后端Java解密
2020-12-22 07:25:02项目涉及保密传输,要求使用国密算法,一般遇到类似问题首先想到的就是...Java版比较好办,较新版本的bouncycastle就支持了SM2/SM3/SM4,麻烦在于JS版,找了很多都有问题,直到遇到了这个项目:https://github.com/S... -
sm4 前后端 加密_JS实现国密算法SM2加密,后端Java解密
2020-12-21 11:16:57项目涉及保密传输,要求使用国密算法,一般遇到类似问题首先想到的就是...Java版比较好办,较新版本的bouncycastle就支持了SM2/SM3/SM4,麻烦在于JS版,找了很多都有问题,直到遇到了这个项目:https://github.com/S... -
HttpClient调用大宝CA版本JSSE访问国密SSL协议的HTTPS服务的方法
2019-06-19 20:28:26系统要求 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:56JS仿照JAVA实现国密SM4加解密,达到前端JS加密,后台Java解密的效果 修复后资源链接: https://download.csdn.net/download/qq_36917130/11296303 -
JAVA NIO MINA2调用大宝CA密码安全套件实现国密SSL安全通道,1.0.1版本,含通信示例代码
2020-02-26 19:33:33使用方法见:https://blog.csdn.net/upset_ming/article/details/96491058 1. 修改了前一版本中证书验证的bug,支持JDK8的高版本 2. 支持国密SSL双向认证 3. 将过期的国密证书替换为新证书 -
java生成sm4算法的对称密钥_Java bouncycastle 简洁版国密ca,颁发证PEM格式证书,SM4加密私钥...
2021-03-16 02:44:36https://gitee.com/mai12/gmca这是学习大佬的代码写的,结合了GMCA和gmhelper,实现了证书生成,私钥SM4加密存储,再次感谢大佬们。然后是Github和Gitee上找到的开源代码:*****************************... -
android(java) SM3,SM4国密算法踩坑总结2
2019-04-11 14:49:00上一篇随笔文中1.57版本是用得是华为mate20x测试机,我使用了mate10之后发现是1.52,这应该说明手机...https://rtyley.github.io/spongycastle/ 给出的方案: https://github.com/rtyley/spongycastle 所以不想... -
国密算法SM2 js加密 java解密不行,谁帮我看下代码,谢谢!
2018-04-26 02:37:56https://pan.baidu.com/s/1n6Uoyvz3Qo9SjZuCU-hdSg 代码在链接里面,我现在遇到的问题是同样的公钥在js加密后,在java代码中使用对应的私钥无法解密