文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-10-21 12:51

关注

目录

一、引入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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯