iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >国密sm2公钥加密 私钥解密java代码实现
  • 859
分享到

国密sm2公钥加密 私钥解密java代码实现

java开发语言安全 2023-10-21 12:10:32 859人浏览 安东尼
摘要

目录 一、引入jar包 二、生成秘钥对,加解密工具类 一、引入jar包 org.bouncycastle bcprov-jdk15on

目录

一、引入jar包

二、生成秘钥对,加解密工具类


一、引入jar

                            org.bouncycastle            bcprov-jdk15on            1.70        

二、生成秘钥对,加解密工具

import org.apache.Tomcat.util.codec.binary.Base64;import org.bouncycastle.crypto.CipherParameters;import org.bouncycastle.crypto.engines.SM2Engine;import org.bouncycastle.crypto.params.ParametersWithRandom;import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;import org.bouncycastle.jcajce.provider.asymmetric.util.ECUtil;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import java.security.*;import java.security.spec.ECGenParameterSpec;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;public class PassUtils {    private static Logger logger = LoggerFactory.getLogger(PassUtils.class);    private static final SM2Engine.Mode DIGEST = SM2Engine.Mode.C1C3C2;        public static KeyPair createSm2Key() {        try {            //使用标准名称创建EC参数生成的参数规范            final ECGenParameterSpec sm2p256v1 = new ECGenParameterSpec("sm2p256v1");            // 获取一个椭圆曲线类型的密钥对生成器            final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());            // 使用SM2的算法区域初始化密钥生成器            kpg.initialize(sm2p256v1, new SecureRandom());            // 获取密钥对            return kpg.generateKeyPair();        } catch (Exception e) {            logger.error("生成秘钥对失败{}", e.getMessage());            return null;        }    }        public static String encryptSm2(String publicKeyStr, String data) {        try {            //算法工具包            Security.addProvider(new BouncyCastleProvider());            //将公钥字符串转为公钥字节            byte[] bytes = Base64.decodeBase64(publicKeyStr);            KeyFactory keyFactory = KeyFactory.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME);            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);            logger.info("获取转换后的公钥");            PublicKey publicKey = keyFactory.generatePublic(keySpec);            logger.info("开始加密");            CipherParameters pubKeyParameters = new ParametersWithRandom(ECUtil.generatePublicKeyParameter(publicKey), new SecureRandom());            SM2Engine sm2Engine = new SM2Engine();            sm2Engine.init(true, pubKeyParameters);            byte[] arrayBytes = sm2Engine.processBlock(data.getBytes(), 0, data.getBytes().length);            return Base64.encodeBase64String(arrayBytes);            //开始加密        } catch (Exception e) {            logger.error("加密失败{}", e.getMessage());        }        return null;    }        public static String decryptSm2(String privateStr, String data) {        try {            logger.info("私钥转换");            byte[] bytes = Base64.decodeBase64(privateStr);            KeyFactory keyFactory = KeyFactory.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME);            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);            PrivateKey privateKey = keyFactory.generatePrivate(keySpec);            logger.info("sm2开始解密");            CipherParameters privateKeyParameters = ECUtil.generatePrivateKeyParameter((BCECPrivateKey) privateKey);            SM2Engine engine = new SM2Engine();            engine.init(false, privateKeyParameters);            byte[] byteDate = engine.processBlock(Base64.decodeBase64(data), 0, Base64.decodeBase64(data).length);            return new String(byteDate);        } catch (Exception e) {            logger.error("sm2解密失败{}", e.getMessage());            return null;        }    }    public static void main(String[] args) throws Exception {        //定义需要加密的字符串        String str = "aaaaa";        //生成秘钥对        KeyPair sm2Key = createSm2Key();        //获取公钥        PublicKey publicKey = sm2Key.getPublic();        //获取公钥base加密后字符串        String publicStr = Base64.encodeBase64String(publicKey.getEncoded());        logger.info("公钥为:{}", publicStr);        //获取私钥        PrivateKey privateKey = sm2Key.getPrivate();        //获取私钥base加密后字符串        String privateStr = Base64.encodeBase64String(privateKey.getEncoded());        logger.info("私钥为:{}", privateStr);        //公钥加密        String passStr = encryptSm2(publicStr, str);        logger.info("加密后为{}", passStr);        //私钥解密        String deStr = decryptSm2(privateStr, passStr);        logger.info("解密后为{}", deStr);    }}

来源地址:https://blog.csdn.net/weixin_51613454/article/details/127861884

--结束END--

本文标题: 国密sm2公钥加密 私钥解密java代码实现

本文链接: https://www.lsjlt.com/news/433651.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作