首页 > 其他分享 >SM2加解密工具

SM2加解密工具

时间:2023-04-24 15:56:03浏览次数:47  
标签:return String 加解密 SM2 sm2KeyPairVO sm2ECParam new 工具

创建秘钥对
//生成随机秘钥对
public static SM2KeyPairVO generateKeyPair() {
    try {
        X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");
        ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());
        ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator();
        keyPairGenerator.init(new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG")));
        AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair();
        //私钥,16进制格式,自己保存,格式如a2081b5b81fbea0b6b973a3ab6dbbbc65b1164488bf22d8ae2ff0b8260f64853
        BigInteger privatekey = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD();
        String privateKeyHex = privatekey.toString(16);
        //公钥,16进制格式,发给前端,格式如04813d4d97ad31bd9d18d785f337f683233099d5abed09cb397152d50ac28cc0ba43711960e811d90453db5f5a9518d660858a8d0c57e359a8bf83427760ebcbba
        ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ();
        String publicKeyHex = Hex.toHexString(ecPoint.getEncoded(false));
        SM2KeyPairVO sm2KeyPairVO = new SM2KeyPairVO();
        sm2KeyPairVO.setPrivateKey(privateKeyHex);
        sm2KeyPairVO.setPublicKey(publicKeyHex);
        return sm2KeyPairVO;
    } catch (Exception e) {
        log.error("SM2密钥对生成失败失败,原因是:" + e.getMessage());
    }
    return null;
}
加密
/**
 * SM2加密算法
 * @param publicKey 公钥
 * @param data     数据
 * @return
 */
public static String encrypt(String publicKey,String data){
    //获取一条曲线参数
    X9ECParameters sm2ECParam = GMNamedCurves.getByName("sm2p256v1");
    ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParam.getCurve(), sm2ECParam.getG(), sm2ECParam.getN());
    //提取公钥点
    ECPoint pukPoint = sm2ECParam.getCurve().decodePoint(Hex.decode(publicKey));
    //公钥值
    ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters);
    //做加签
    SM2Engine sm2Engine = new SM2Engine();
    sm2Engine.init(true,new ParametersWithRandom(publicKeyParameters,new SecureRandom()));
    byte[] arrayOfBytes = null;
    try{
        byte[] in = data.getBytes(Constants.CHARSET_UTF8);
        arrayOfBytes = sm2Engine.processBlock(in,0,in.length);
    } catch (Exception e) {
        log.error("SM2加密失败");
    }
    return Hex.toHexString(arrayOfBytes);
}
解密
/**
 * SM2解密算法
 * @param privateKey 私钥
 * @param CipherData 密文数据
 * @return
 */
public static String decryptSM2(String privateKey,String CipherData){
    byte[] cipherDateByte = Hex.decode(CipherData);
    //获取一条曲线参数
    X9ECParameters sm2ECParam = GMNamedCurves.getByName("sm2p256v1");
    //构造domain参数
    ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParam.getCurve(), sm2ECParam.getG(), sm2ECParam.getN());
    BigInteger privateKeyD = new BigInteger(privateKey, 16);
    ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters);
    //做解签
    SM2Engine sm2Engine = new SM2Engine();
    sm2Engine.init(false,privateKeyParameters);
    String result = null;
    try{
        byte[] arrayOfBytes = Base64.decode(sm2Engine.processBlock(cipherDateByte, 0, cipherDateByte.length));
        return new String(arrayOfBytes,Constants.CHARSET_UTF8);
    } catch (Exception e) {
        log.error("SM2解密失败");
    }
    return result;
}
MAIN函数测试
public static void main(String[] args) {
    SM2KeyPairVO sm2KeyPairVO = generateKeyPair();
    String pKey = sm2KeyPairVO.getPublicKey();
    String priKey = sm2KeyPairVO.getPrivateKey();
    System.out.println("公钥为: " + pKey);
    System.out.println("私钥为: " + priKey);
    String publicKey = pKey;
    String privateKey = priKey;
    String content = "hello";
    String encrypt = encrypt(publicKey, Base64.toBase64String(content.getBytes(StandardCharsets.UTF_8)));
    System.out.println("密文:" + encrypt);
    String test = decryptSM2(privateKey, encrypt);
    System.out.println("解密:" + test);
}

标签:return,String,加解密,SM2,sm2KeyPairVO,sm2ECParam,new,工具
From: https://www.cnblogs.com/yan-zm/p/17349743.html

相关文章

  • Axure RP-软件开发工具
    AxureRP是一款专业的快速原型设计工具。Axure(发音:Ack-sure),代表美国Axure公司;RP则是RapidPrototyping(快速原型)的缩写。AxureRP是美国AxureSoftwareSolution公司旗舰产品,是一个专业的快速原型设计工具,让负责定义需求和规格、设计功能和界面的专家能够快速创建应用软件或Web网站......
  • 原型设计工具比较及实践
    一.原型设计工具比较及实践  1.墨刀墨刀是一款在线原型设计墨刀是一款在线原型设计与协同工具,借助墨刀可搭建为产品原型,演示效果。同时,也可协作编辑,审阅,不管是产品想法展示还是向客户收集产品反馈等都可在手机上演示。是更偏向交互型,快捷高效的一款产品。优点:1、原......
  • python工具模块介绍-time 时间访问和转换
    快速入门In[1]:importtime#获取当前时间In[25]:time.strftime("%Y-%m-%d_%H-%M-%S",time.localtime())Out[25]:'2018-06-17_20-05-36'#停顿0.5秒In[26]:time.sleep(0.5)简介功能:时间访问和转换。相关模块:datetime 标准模块。calendar标准模块。下面介......
  • js 工具类
    /*是否带有小数*/functionisDecimal(strValue){varobjRegExp=/^\d+\.\d+$/;returnobjRegExp.test(strValue);}/*校验是否中文名称组成*/functionischina(str){varreg=/^[\u4E00-\u9FA5]{2,4}$/;/*定义验证表达式*/returnreg.tes......
  • Caesar一个全新的敏感文件发现工具
    https://github.com/0ps/Caesar 一 支持主流平台:得益于golang的跨平台优势。一次编译,到处运行。二 强大的并发:golang的并发独树一帜。12线程下能实现每秒千级请求。为了安全性,默认只设置了3线程。三 路径记忆功能:Caesar可以记忆路径的击中次数,下次运行的时候,击中次......
  • pydictor —— 一个强大实用的黑客暴力破解字典建立工具
    pydictor下载环境kalihttps://github.com/LandGrey/pydictor/下载玩解压,然后在pydictor文件夹下打开终端即可。他可以帮助我们快速的生成普通爆破字典、基于网站内容的自定义字典、社会工程学字典等等一系列高级字典还可以使用内置工具,对字典进行安全删除、合并、去重、合并并......
  • 安装最小版本centos后安装网络工具获取ip
    阿里云的centos7镜像仓库:http://mirrors.aliyun.com/centos/7/isos/x86_64/我们找到centos764的版本,点击即可开始下载#登陆进centos以后,我们需要先安装一下网络工具,我们在命令行执行命令yum-yinstallnet-tools.x86_64#点击回车后就开始安装,安装好以后,我们在命令行输入......
  • 一个将喜马拉雅音频导入小宇宙的工具
    这个喜马拉雅语音下载工具,能够帮助你下载喜马拉雅中的音频节目。如果你是会员,还能帮你下载会员节目。 下载后的音频文件,可以复制到小宇宙设备文件夹里面,这样我们就可以用小宇宙播放我们导入的音频文件啦。  工具下载:windows版https://jscs.lanzouw.com/i6pPL0tpwwmbma......
  • 原型设计工具比较及实践
    目录原型设计工具比较墨刀AxureMockplus原型设计主题名称功能界面设计考虑因素切换界面界面切换流程 一、原型设计工具比较1.墨刀墨刀是一款在线原型设计与协同工具,借助墨刀,产品经理、设计师、开发、销售、运营及创业者等用户群体,能够搭建......
  • 有了这些 AI 工具,健康和财富兼得「GitHub 热点速览」
    新的一周,又有什么新的AI应用呢?在AI专场,这次是文本生语音和双语对话模型,前者能解决你的语音问题,后者则是清华开源的模型,能让你搞个自己的类ChatGPT对话助手。此外,还有升级版的MiniGPT-4搞定基于图片的文字工作,像是诗歌生成、图片描述等等。不过,也有借着机器学习优化搞钱......