提供公私密匙對扎拣,及簽名操作,工具類
public class SignUtils {
private static X9ECParameters x9ECParameters = CustomNamedCurves.getByName("sm2p256v1");
private static ECParameterSpec ecParameterSpec = new ECParameterSpec(x9ECParameters.getCurve(), x9ECParameters.getG(), x9ECParameters.getN());
private static BouncyCastleProvider bouncyCastleProvider = new BouncyCastleProvider();
static{
Security.addProvider(bouncyCastleProvider);
}
/**
* 生成公私鑰對
*
* @return
*/
public static KeyPair generateKeyPair() {
try {
BouncyCastleProvider prov = new BouncyCastleProvider();
Security.addProvider(prov);
KeyPairGenerator gen = KeyPairGenerator.getInstance("ECDSA", prov);
gen.initialize(ecParameterSpec);
KeyPair keyPair = gen.generateKeyPair();
return keyPair;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 取原始公鑰中的X,本地持久化存儲
*
* @return
*/
public static String getPublicKeyX(KeyPair kp) {
PublicKey publicKey = kp.getPublic();
org.bouncycastle.math.ec.ECPoint publickeyECPoint = ((BCECPublicKey)publicKey).getQ();
String publicKeyX = publickeyECPoint.getXCoord().toString().toUpperCase(Locale.getDefault());
return publicKeyX;
}
/**
* 取原始公鑰中的Y羞酗,本地持久化存儲
*
* @return
*/
public static String getPublicKeyY(KeyPair kp) {
PublicKey publicKey = kp.getPublic();
org.bouncycastle.math.ec.ECPoint publickeyECPoint = ((BCECPublicKey)publicKey).getQ();
String publicKeyY = publickeyECPoint.getYCoord().toString().toUpperCase(Locale.getDefault());
return publicKeyY;
}
/**
* 取私鑰中的D殴俱,本地持久化存儲养交,方便后續(xù)從D直接轉(zhuǎn)換成真正的私鑰對象
*
* @return
*/
public static BigInteger getPrivateD(KeyPair kp){
BigInteger privateKeySM2D = ((BCECPrivateKey) kp.getPrivate()).getD();
return privateKeySM2D;
}
/**
* 通過私鑰D得到私鑰對象
*
* @param d
* @return
*/
public static BCECPrivateKey getPrivatekeyFromD(BigInteger d) {
ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(d, ecParameterSpec);
return new BCECPrivateKey("EC", ecPrivateKeySpec, BouncyCastleProvider.CONFIGURATION);
}
/**
* 國密算法使用私鑰進行簽名
*
* @param original
* ? SM3摘要
* @param pk
* ? 私匙
* @return
*/
public static byte[] signBySM2PK(byte[] original, PrivateKey pk) {
if (pk == null || original == null || original.length == 0) {
return null;
}
byte[] signed = null;
try {
BouncyCastleProvider prov = new BouncyCastleProvider();
Signature signature = Signature.getInstance("SM3WITHSM2", prov);
signature.initSign(pk);
signature.update(original);
signed = signature.sign();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
}
return signed;
}
/**
* 獲取公鑰,公鑰需要將原始公鑰中的X以及Y從新組裝:04+X+Y
*
* @param
*
* @return
*/
public static String getPublicKey() {
StringBuilder resultData = new StringBuilder();
//獲取本地存儲的X
String publicKeyX = Store.getInstance().get("sm2PublicKeyX");
resultData.append("04");
resultData.append(publicKeyX);
//獲取本地存儲的X
String publicKeyY = Store.getInstance().get("sm2PublicKeyY");
resultData.append(publicKeyY);