1、字符串生成公钥对象 PublicKey
/**
* 实例化公钥
*
* @return
*/
private PublicKey getPubKey() {
PublicKey publicKey = null;
try {
// 自己的公钥(测试)
String pubKey ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVRiDkEKXy/KBTe+UmkA+feq1zGWIgBxkgbz7aBJGb5+eMKKoiDRoEHzlGndwFKm4mQWNftuMOfNcogzYpGKSEfC7sqfBPDHsGPZixMWzL3J10zkMTWo6MDIXKKqMG1Pgeq1wENfJjcYSU/enYSZkg3rFTOaBSFId+rrPjPo7Y4wIDAQAB";
java
.security.spec.X509EncodedKeySpec bobPubKeySpec = new
java
.security.spec.X509EncodedKeySpec(
new BASE64Decoder().decodeBuffer(pubKey));
// RSA对称
加密
算法
java.security.KeyFactory keyFactory;
keyFactory = java.security.KeyFactory.getInstance("RSA");
// 取公钥匙对象
publicKey = keyFactory.generatePublic(bobPubKeySpec);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return publicKey;
}
2、字符串生成私钥对象
/**
* 实例化私钥
*
* @return
*/
private PrivateKey getPrivateKey() {
PrivateKey privateKey = null;
String priKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJVGIOQQpfL8oFN75SaQD596rXMZYiAHGSBvPtoEkZvn54woqiINGgQfOUad3AUqbiZBY1+24w581yiDNikYpIR8Luyp8E8MewY9mLExbM
vc
nXTOQxNajowMhcoqowbU+B6rXAQ18mNxhJT96dhJmSDesVM5oFIUh36us+M+jtjjAgMBAAECgYABtnxKIabF0wBD9Pf8KUsEmXPEDlaB55LyPFSMS+Ef2NlfUlgha+UQhwsxND6CEKqS5c0uG/se/2+4l0jXz+CTYBEh+USYB3gxcMKEo5XDFOGaM2Ncbc7FAKJIkYYN2DHmr4voSM5YkVibw5Lerw0kKdYyr0Xd0kmqTok3JLiLgQJBAOGZ1ao9oqWUzCKnpuTmXre8pZLmpWPhm6S1FU0vHjI0pZh/jusc8UXSRPnx1gLsgXq0ux30j968x/DmkESwxX8CQQCpY1+2p1aX2EzYO3UoTbBUTg7lCsopVNVf41xriek7XF1YyXOwEOSokp2SDQcRoKJ2PyPc2FJ/f54pigdsW0adAkAM8JTnydc9ZhZ7WmBhOrFuGnzoux/7ZaJWxSguoCg8O
vb
Qk2hwJd3U4mWgbHWY/1XB4wHkivWBkhRpxd+6gOUjAkBH9qscS52zZzbGiwQsOk1Wk88qKdpXku4QDeUe3vmSuZwC85tNyu+KWrfM6/H74DYFbK/MzK7H8iz80uJye5jVAkAEqEB/LwlpXljFAxTID/SLZBb+bCIoV/kvg+2145F+CSSUjEWRhG/+OH0cQfqomfg36WrvHl0g/Xw06fg31HgK";
PKCS8EncodedKeySpec priPKCS8;
try {
priPKCS8 = new PKCS8EncodedKeySpec(new BASE64Decoder().decodeBuffer(priKey));
KeyFactory keyf = KeyFactory.getInstance("RSA");
privateKey = keyf.generatePrivate(priPKCS8);
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
}
return privateKey;
}
1、字符串生成公钥对象 PublicKey/** * 实例化公钥 * * @return */ private PublicKey getPubKey() { PublicKey publicKey = null; try { // 自己的公钥(测试) String pubKey ="MIGfMA0GCSqGSIb3DQEBAQUAA
import java.security.
Key
;
import java.security.
Key
Factory;
import java.security.
Key
Pair;
import java.security.
Key
PairGenerator;
import java.security.
Private
Key
;
import java.s...
import org.bouncycastle.asn1.x9.X9ECParameters;
import org.bouncycastle.crypto.ec.CustomNamedCurves;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCEC
Public
Key
;
import org.bouncycastle.jce.ECNamedCurveTable;
import org.bouncyca.
背景:要实现请求参数加密的功能,使用的是国密SM2算法,前端想后台发送请求获取
公钥
,将请求加密发送到后台,后台用对应的
私钥
进行解密
问题:前端进行加密的请求,后台无法进行解析
解决方案:(此处所用的类都为Hutool里的工具类)
当前的前端的SM2加密js库都是使用SM2
公钥
的q值
转
成16进制进行加密,所以在后台给前端发送
公钥
时,需要提取
公钥
的q值并且
转
成16进制
User
Private
Key
user
Private
Key
;
Key
Pair pair = Secure
SM2的128位
公钥
可以通过以下步骤
生成
公钥
对象
:
获取SM2的
公钥
字符串
:
公钥
字符串
通常是一个长度为128位的16进制
字符串
, 形如"04AB23CD..."。
将
公钥
字符串
转
换为字节数组: 可以使用一个十六进制
字符串
解码器将
公钥
字符串
解码为一个字节数组。
使用字节数组构造
公钥
对象
: 使用字节数组作为参数调用
公钥
类(如java.security.interfaces.EC
Public
Ke...
//
生成
秘钥对
public
static
Key
Pair get
Key
Pair() throws Exception {
Key
PairGenerator
key
PairGenerator =
Key
PairGenerator.getInstance("RSA");
ke...
public
static
Public
Key
get
Public
Key
(
String
key
) {
try {
byte[] byte
Key
= Base64.getDecoder().decode(
key
);
X509Encoded
Key
Spec x509E...
最近一个问题卡住我好几天。。各种百度谷歌都没有找到,现在简单记录下var
private
Key
= new Buffer('660acdf8ff31eea85d6b754238da16de45840190a9c8ed4b8aa27465b83f9a93', 'hex');
console.log(web3.toHex(web3.eth.gasPrice));
var rawTx = {
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.EC
Private
Key
;
import java.security.interfaces.EC
Public
Key
;
import java.security.spec.PKCS8Encoded
Key
Spec;
import java.security.spec.X509En