赞
踩
@Slf4j public class KeyUtils { /** * 生成国密公私钥对 * * @return * @throws Exception */ public static KeyPair generateSmKey() throws InvalidAlgorithmParameterException, NoSuchAlgorithmException { ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1"); // 获取一个椭圆曲线类型的密钥对生成器 final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider()); // 使用SM2参数初始化生成器 kpg.initialize(sm2Spec); // 获取密钥对 KeyPair keyPair = kpg.generateKeyPair(); //String[0] 公钥 //String[1] 私钥 String[] result = { new String(Base64.getEncoder().encode(keyPair.getPublic().getEncoded())) , new String(Base64.getEncoder().encode(keyPair.getPrivate().getEncoded())) }; log.info("\n" + "公钥:{} \n" + "私钥:{}", result[0], result[1]); return keyPair; } /** * 将Base64转码的公钥串,转化为公钥对象 * * @param publicKey * @return */ public static PublicKey createPublicKey(String publicKey) { PublicKey publickey = null; try { X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey)); KeyFactory keyFactory = KeyFactory.getInstance("EC", new BouncyCastleProvider()); publickey = keyFactory.generatePublic(publicKeySpec); } catch (Exception e) { e.printStackTrace(); } return publickey; } /** * 将Base64转码的私钥串,转化为私钥对象 * * @param privateKey * @return */ public static PrivateKey createPrivateKey(String privateKey) { PrivateKey publickey = null; try { PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey)); KeyFactory keyFactory = KeyFactory.getInstance("EC", new BouncyCastleProvider()); publickey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); } catch (Exception e) { e.printStackTrace(); } return publickey; } }
public class Sm2Util { static { Security.addProvider(new BouncyCastleProvider()); } /** * 根据publicKey对原始数据data,使用SM2加密 * * @param data * @param publicKey * @return */ public static byte[] encrypt(byte[] data, PublicKey publicKey) { ECPublicKeyParameters localECPublicKeyParameters = null; if (publicKey instanceof BCECPublicKey) { BCECPublicKey localECPublicKey = (BCECPublicKey) publicKey; ECParameterSpec localECParameterSpec = localECPublicKey.getParameters(); ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(), localECParameterSpec.getG(), localECParameterSpec.getN()); localECPublicKeyParameters = new ECPublicKeyParameters(localECPublicKey.getQ(), localECDomainParameters); } SM2Engine localSM2Engine = new SM2Engine(); localSM2Engine.init(true, new ParametersWithRandom(localECPublicKeyParameters, new SecureRandom())); byte[] arrayOfByte2; try { arrayOfByte2 = localSM2Engine.processBlock(data, 0, data.length); return arrayOfByte2; } catch (InvalidCipherTextException e) { e.printStackTrace(); return null; } } /** * 根据privateKey对加密数据encodedata,使用SM2解密 * * @param encodedata * @param privateKey * @return */ public static byte[] decrypt(byte[] encodedata, PrivateKey privateKey) { SM2Engine localSM2Engine = new SM2Engine(); BCECPrivateKey sm2PriK = (BCECPrivateKey) privateKey; ECParameterSpec localECParameterSpec = sm2PriK.getParameters(); ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(), localECParameterSpec.getG(), localECParameterSpec.getN()); ECPrivateKeyParameters localECPrivateKeyParameters = new ECPrivateKeyParameters(sm2PriK.getD(), localECDomainParameters); localSM2Engine.init(false, localECPrivateKeyParameters); try { byte[] arrayOfByte3 = localSM2Engine.processBlock(encodedata, 0, encodedata.length); return arrayOfByte3; } catch (InvalidCipherTextException e) { e.printStackTrace(); return null; } } /** * 私钥签名 * * @param data * @param privateKey * @return * @throws Exception */ public static byte[] signByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception { Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME); sig.initSign(privateKey); sig.update(data); byte[] ret = sig.sign(); return ret; } /** * 公钥验签 * * @param data * @param publicKey * @param signature * @return * @throws Exception */ public static boolean verifyByPublicKey(byte[] data, PublicKey publicKey, byte[] signature) throws Exception { Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME); sig.initVerify(publicKey); sig.update(data); boolean ret = sig.verify(signature); return ret; } }
public class test { public static void main(String[] args) throws Exception { String testStr = "wangjingdsadsad8746121d23sa1d784131111111111111dsadsadsdsdsdsdsd"; BirBirthCertificateRecordInfo birBirthCertificateRecordInfos = new BirBirthCertificateRecordInfo(); birBirthCertificateRecordInfos.setBirthDate(LocalDateTime.now()); birBirthCertificateRecordInfos.setAccountId(321321L); birBirthCertificateRecordInfos.setFatherName("父亲名称"); byte[] bytes = JSON.toJSONString(birBirthCertificateRecordInfos).getBytes(StandardCharsets.UTF_8); //生成公私钥对 KeyPair keyPair = KeyUtils.generateSmKey(); System.out.println("原始字符串:" + testStr); System.out.println("公钥:" + keyPair.getPrivate()); System.out.println("私钥:" + keyPair.getPublic()); System.out.println("---------------------------------------------------------------"); byte[] encrypt = Sm2Util.encrypt(testStr.getBytes(), KeyUtils.createPublicKey(Common.SM2_PUBLIC_KEY)); String encryptBase64Str = Base64.getEncoder().encodeToString(encrypt); System.out.println("加密数据:" + encryptBase64Str); encryptBase64Str = "BFHHtdKvuiWll/IMNf+cwO2gn7dXyN2ajdz61ZQmd43eQNUcjVgb4ivLJlMbuvstApvH9nZPuf/V1AqRhAt2RHpn4G/iGwQiQqF+vKVgPEEO3RANh2vJrO7hm2KyYBRs3RrSVgP9Vkj/6/vdMTs4yh0HFsvBBS1ZXaKFzcdPvp5G+KdQ1aPikMagGfl82ZP9rRYBuaqFT/bfMBzdE94Im31un2ZNmBOwZVZAO7pOKCmQtlTwmF03Z832BoHgoY0hcamQWjE5glk30u3bJwwzZlX1PRo4T4UWadfmh3IuUxj9rpeiLn/Ga1D1HzCVQulH+tLQRqpycZO4PZdNrfgIWQdyZvoJmsyRHidEzKRwzpaUyIfnnKMZ2Rde+V8YaaoQHlV82c8QU8CYYEVUX/B2yx6MWkf4oXd76lWhGbCOFbjBCn44OQB2MhCFVn6DTKsDLcplBW78fmNcPNqasDb0AU/v85/JgCDyGwuokUN6FVZ7FpucpT0aOPu5zL51lDvc1XzMD5NA9EIthXrKJBMDQ7yGDn0Fct4WU5q5H8eE0Q+N2vlUW6q6Pxk5m+zOAiXlNAvbvIo0gYKSyBvHzdDEu6cWVAjUO0RWD2IPJhRRtgWg0GKmW0dB85qIUzqFs0yIFY/ctUhf+sk/IkgR0VUD318ApKS37pHNl8B3Xb3soqdiFRetkADPbecIENsrCGmlVnFBvixJ/Gw2KiQXCoG0w7uGmMfGwafaVimevKaJyPNoCcR4it65HcMh1U90/hT7TWa82pGyGdPnJ2RiP4UnZDJRGGh+jkXvSP/K0k6d44HD2iFWxbqkCf8ymX4Me99MMJLUxg/dXfwW73AwRASjJcCAEWw2z7mntBaXKL9I1h+7TFSZzzzrrSxIUf7e5ZtWAdwGjO8K/PnG4ijdBcYENGQPRg+rQ7NWpK7rF/Au8TnIaexa7CghAN54X3Il9J8jxLFYSDHKliif1bvAQ6PM3x9BohKyylR2EOxTI97i6gKTT6KMsFJj+SZpsnpRlTTr71p7oSNrLH9CvQZ4FdYIKJ5V80wKDy6dMUHcCLgTqYsj8Ab8cwhagsDOon638plLAXHvmc5Pci3wAKPRgslUyI1nC4ThCwQ2SZL5hR2f8A/4oIoenWhq6K3INb/iwd5JaLyIoVHCalprCmLMBeGRK0+EKUrjjTsn2tQbmzUha7O5i9ySKcTT/fsLTTwXR6jvQ1RB5Y03E6dfA19aMQBkTM5ms5dPbSPd8gY5ckhTmU31Vu4YIs2Ip66rYiS8hNvPEWdjyLUK9VXCr49E1PN2TtHLeIOmXTETsPgG/MiW3nxV3yyYAYVlHxJN98cMCRnz5ZqXObp74aEQCX38N/JSxjtn0B9EDN6MF4BQLBpa+immnd5cAQQpS5hsw5ISChR16AtBy/m7DdKCenhhHowUKYksZOAq8aWkcdCrZqnF2sX1rSe6t3azrt2Hiz6ZCEFg+NDHhZKb83N5lh7+4nkSQdgy2CXnmdiJ2h9ERaysUICYgLcsQZazgqGSWyEdqhZqp6qqYnvKQqSQeg=="; byte[] decode = Base64.getDecoder().decode(encryptBase64Str); byte[] decrypt = Sm2Util.decrypt(decode, KeyUtils.createPrivateKey(AuthTokenEnum.TOKEN_XT.getPrivateKey())); System.out.println("解密数据:" + new String(decrypt)); byte[] sign = Sm2Util.signByPrivateKey(testStr.getBytes(), KeyUtils.createPrivateKey(Common.SM2_PRIVATE_KEY)); System.out.println("数据签名:" + Base64.getEncoder().encodeToString(sign)); boolean b = Sm2Util.verifyByPublicKey(testStr.getBytes(), KeyUtils.createPublicKey(Common.SM2_PUBLIC_KEY), sign); System.out.println("数据验签:" + b); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。