首页 > 其他分享 >使用OpenEuler x86_64 实现Bouncycastle SM2加解密

使用OpenEuler x86_64 实现Bouncycastle SM2加解密

时间:2024-03-30 21:33:35浏览次数:21  
标签:java x86 import org 加解密 bouncycastle new Bouncycastle String

使用OpenEuler x86_64 实现Bouncycastle SM2加解密

一、安装运行环境

  • 安装java和maven

     sudo yum install java-17-openjdk
     sudo yum install maven
    

    安装完成后,你就可以在 OpenEuler 上使用 Maven 来管理 Java 项目了。

二、创建项目工程

  1. 在项目根目录下创建pom.xml文件用于添加Bouncycastle的依赖项。

    vi pom.xml

加入内容:

  <project xmlns="http://maven.apache.org/POM/4.0.0"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>com.example</groupId>
  <artifactId>MySM2Project</artifactId>
  <version>1.0-SNAPSHOT</version>

  <dependencies>
  <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-jdk15to18</artifactId>
      <version>1.77</version>
  </dependency>
  <dependency>
      <groupId>org.bouncycastle</groupId>
      <artifactId>bcprov-ext-jdk15to18</artifactId>
      <version>1.77</version>
  </dependency>
  1. 将源代码放入src/main/java/BC目录下。

sm2_demo.java:

  import org.bouncycastle.jce.provider.BouncyCastleProvider;
  import java.security.*;
  import java.security.spec.ECGenParameterSpec;
  public class sm2_demo {
      static {
          Security.addProvider(new BouncyCastleProvider());
      }

  private static final String M = "lzc_SM2_demo";

  public static void main(String[] args) throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
      try {
          SM2Util sm2 = new SM2Util();
          final ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");
          final KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC", "BC");
          kpg.initialize(sm2Spec);
          KeyPair keyPair = kpg.generateKeyPair();
          PublicKey publicKey = keyPair.getPublic();
          PrivateKey privateKey = keyPair.getPrivate();

          String data = sm2.encrypt(publicKey, M);
          System.out.println(data);

          String text = sm2.decrypt(privateKey, data);
          System.out.println(text);
          } catch (NoSuchProviderException e) {
          e.printStackTrace();
          }
      }
  }

SMUtil.java:

  import java.security.Security;
  import org.bouncycastle.jce.provider.BouncyCastleProvider;

  import java.security.Provider;

  import org.bouncycastle.crypto.engines.SM2Engine;
  import org.bouncycastle.crypto.params.*;
  import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
  import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
  import org.bouncycastle.jce.spec.ECParameterSpec;
  import org.bouncycastle.util.encoders.Hex;

  import java.security.PrivateKey;
  import java.security.PublicKey;
  import java.security.SecureRandom;

  public class SM2Util {

  static {
      Provider provider = new BouncyCastleProvider();
      Security.addProvider(provider);
  }

  public String encrypt(PublicKey publicKey, String data) {
      ECPublicKeyParameters ecPublicKeyParameters = null;
      if (publicKey instanceof BCECPublicKey) {
          BCECPublicKey bcecPublicKey = (BCECPublicKey) publicKey;
          ECParameterSpec ecParameterSpec = bcecPublicKey.getParameters();
          ECDomainParameters ecDomainParameters = new ECDomainParameters(
                  ecParameterSpec.getCurve(), ecParameterSpec.getG(), ecParameterSpec.getN());
          ecPublicKeyParameters = new ECPublicKeyParameters(bcecPublicKey.getQ(), ecDomainParameters);
      }
      SM2Engine sm2Engine = new SM2Engine();
      sm2Engine.init(true, new ParametersWithRandom(ecPublicKeyParameters, new SecureRandom()));
      byte[] arrayOfBytes = null;
      try {
          byte[] in = data.getBytes("utf-8");
          arrayOfBytes = sm2Engine.processBlock(in, 0, in.length);
      } catch (Exception e) {
          System.out.println("SM2加密时出现异常:");
      }
      return Hex.toHexString(arrayOfBytes);
  }
      public String decrypt(PrivateKey privateKey, String cipherData) {
      byte[] cipherDataByte = Hex.decode(cipherData);
      BCECPrivateKey bcecPrivateKey = (BCECPrivateKey) privateKey;
      ECParameterSpec ecParameterSpec = bcecPrivateKey.getParameters();
      ECDomainParameters ecDomainParameters = new ECDomainParameters(
              ecParameterSpec.getCurve(), ecParameterSpec.getG(), ecParameterSpec.getN());
      ECPrivateKeyParameters ecPrivateKeyParameters = new ECPrivateKeyParameters(
              bcecPrivateKey.getD(), ecDomainParameters);
      SM2Engine sm2Engine = new SM2Engine();
      sm2Engine.init(false, ecPrivateKeyParameters);
      String result = null;
      try {
          byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length);
          return new String(arrayOfBytes, "utf-8");
      } catch (Exception e) {
          System.out.println("SM2解密时出现异常");
      }
      return result;
      }
  }
  1. 创建lib文件夹,并将从官网上下载的bcprov-ext-jdk15to18-177.jar和bcprov-jdk15to18-177.jar放入其中。

    Bouncycastle官网:https://www.bouncycastle.org/latest_releases.html

三、编译和运行

  1. 编译

使用mvn系列命令进行编译:

    mvn clean install

最终项目结构为:

  1. 运行

使用命令运行:

   java -cp target/classes:target/MySM2Project-1.0-SNAPSHOT.jar:lib/* sm2_demo
  1. 运行结果

标签:java,x86,import,org,加解密,bouncycastle,new,Bouncycastle,String
From: https://www.cnblogs.com/yuanyi23/p/18106053

相关文章

  • 20211105BouncyCastle
    1.下载jar包https://www.bouncycastle.org/latest_releases.html找了半天在官网上没找到,是找的其他的csdn的网页二级标题将下载的两个jar包拷贝到%JAVA_HOME%\jre\lib\ext目录下面3.修改配置文件%JAVA_HOME%\jre\lib\security\java.security,在末尾添加security.provider.11......
  • yii2 密码和加解密
    yii2密码和加解密生成hash$hash=Yii::$app->getSecurity()->generatePasswordHash($password);验证hashif(Yii::$app->getSecurity()->validatePassword($password,$hash)){//allgood,logginguserin}else{//wrongpassword}生成随机字符串$k......
  • bouncycastle
    把下载的安装包放在%JAVA_HOME%\jre\lib\ext目录下面修改配置文件%JAVA_HOME%\jre\lib\security\java.security,在末尾添加security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider;具体如下:导入jar包demo.java点击查看代码importorg.bouncycastle.j......
  • X86架构与ARM架构的区别:
    原文链接:https://zhidao.baidu.com/question/208949741393495605.html?qbl=relate_question_11、含义不同:X86使用CISC(ComplexInstructionSetComputer,复杂指令集计算机)。ARM使用RISC(ReducedInstructionSetComputer,精简指令集计算机),ARM英文全称AdvancedRISCMachine。2、......
  • Xcode开发iOS运行项目报错symbol(s) not found for architecture x86_64的解决办法
    写在前边的话:如果是xcode13,那么请先升级系统到Monterey(ios12.7.4),并安装xcode14。因为好多sdk都是xcode14才有的,xcode13不支持,任你把buildsetting玩出花来都没用的。Xcode13的时候,各种报错百度搜索解决方法,各种配置buildsettings,然而没有什么用,真机/模拟器都是一一直报错。......
  • kernel BUG at arch/x86/kernel/apic/vector.c:174!
    问题兆芯设备适配ngrayos系统(debian系统4.20.1内核)时,在网口up时系统崩溃。版本如下:现象:经过排查,原因是因为兆芯设备启动参数加了noapic(不加系统无法正常刻录和启动),网口up时中断向量不够分配。APIC(AdvancedProgrammableInterruptController)是一种硬件设备,用于处......
  • 使用AES进行加解密
    今天来使用aes对sk(一个字段)进行加解密,要求秘钥一半在配置文件,一般写死aes就是一个加解密的工具,有加密和解密二个方法,是可逆的packagecom.huawei.koophone.openpower.common.utils.algo;importlombok.extern.slf4j.Slf4j;importorg.apache.commons.codec.DecoderExcep......
  • 使用 openssl 进行 RSA/ECB/PKCS1PADDING 加解密
    使用java进行RSA/ECB/PKCS1PADDING是非常方便的,例如下面的示例publicstaticStringpublicDecrypt(PublicKeypublicKey,Stringencrypted)throwsException{Ciphercipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");cipher.init(Cipher.DECRYPT_......
  • Hadoop与Spark的x86和ARM混合集群部署【环境搭建篇】
    ​笔者在完成课程设计时,突然想到把大数据框架同时部署到PC端虚拟机以及ARM架构的Linux板上,这篇博客记录集群部署流程以及例程测试。部署架构如下图:若下文与架构图冲突,则以架构图为准。运行环境:PC方面,使用两台Ubuntu20.04LTSFocalFossa虚拟机ARM板子则使用香橙派5(R......
  • 接口RSA加解密参考
    后端依赖当然,这里也可以自行实现,获取使用rsa+aes组合的方案来实现。<dependency><groupId>cn.shuibo</groupId><artifactId>rsa-encrypt-body-spring-boot</artifactId><version>1.0.1.RELEASE</version></dependency>示例@Spring......