Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍

针对“Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍”的话题,以下是完整攻略的介绍:

一、概述

OpenSSL是一个开源的安全套接字层(SSL)实现库,能够实现多种安全协议,包括SSL和TLS。Java OpenSSL是使用Java编写的,利用OpenSSL库生成RSA公私钥,以及使用公私钥进行数据的加解密。

本文将详细介绍Java OpenSSL如何生成RSA公私钥,以及使用公私钥进行数据加解密。

二、生成RSA公私钥

通过以下命令在Linux环境下生成2048位密钥:

openssl genpkey -algorithm RSA -out private.key
openssl rsa -in private.key -pubout -out public.key

注:这里生成的公钥、私钥可以在Java和其他支持openssl密钥格式的语言中使用。

通过Java OpenSSL代码生成RSA公私钥:

import sun.security.x509.X500Name;
import sun.security.x509.X509CertImpl;
import sun.security.x509.X509CertInfo;

import javax.security.auth.x500.X500Principal;
import java.io.*;
import java.math.BigInteger;
import java.security.*;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.security.interfaces.RSAPrivateCrtKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.*;

public class GenerateKeyPairUtil {

    private static final String keyAlg = "RSA";

    public static KeyPair generateRSAKeyPair(File publicKeyFile, File privateKeyFile) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, IOException, CertificateException, InvalidKeySpecException {
        SecureRandom secureRandom = new SecureRandom();
        KeyPairGenerator kpGen = KeyPairGenerator.getInstance(keyAlg, "BC");

        RSAKeyGenParameterSpec spec = new RSAKeyGenParameterSpec(2048, RSAKeyGenParameterSpec.F4);
        kpGen.initialize(spec, secureRandom);

        KeyPair keyPair = kpGen.generateKeyPair();
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
        RSAPrivateCrtKey privateKey = (RSAPrivateCrtKey) keyPair.getPrivate();

        // 导出公钥
        X509Certificate cert = generateX509V3Cert(publicKey, privateKey);

        OutputStream pemPublicKey = new FileOutputStream(publicKeyFile);
        pemPublicKey.write("-----BEGIN PUBLIC KEY-----\n".getBytes());
        pemPublicKey.write(new String(org.bouncycastle.util.encoders.Base64.encode(cert.getEncoded())).getBytes());
        pemPublicKey.write("\n-----END PUBLIC KEY-----\n".getBytes());
        pemPublicKey.flush();
        pemPublicKey.close();

        // 导出私钥
        FileOutputStream fos = new FileOutputStream(privateKeyFile);
        fos.write("-----BEGIN PRIVATE KEY-----\n".getBytes());
        fos.write(new String(org.bouncycastle.util.encoders.Base64.encode(privateKey.getEncoded())).getBytes());
        fos.write("\n-----END PRIVATE KEY-----\n".getBytes());
        fos.flush();
        fos.close();

        return keyPair;
    }

    private static X509Certificate generateX509V3Cert(RSAPublicKey publicKey, RSAPrivateCrtKey privateKey) throws NoSuchAlgorithmException, SignatureException, InvalidKeyException, IOException, CertificateEncodingException, CertificateException {
        X500Name x500Name = new X500Name(new X500Principal("CN=Java OpenSSL RSA Test").getName());

        BigInteger serialNumber = new BigInteger(64, new SecureRandom());
        long now = System.currentTimeMillis();
        X509CertInfo info = new X509CertInfo();
        info.set(X509CertInfo.VERSION, new CertificateVersion(CertificateVersion.V3));
        info.set(X509CertInfo.SERIAL_NUMBER, new CertificateSerialNumber(serialNumber));
        info.set(X509CertInfo.SUBJECT, new CertificateSubjectName(x500Name));
        info.set(X509CertInfo.ISSUER, new CertificateIssuerName(x500Name));
        info.set(X509CertInfo.VALIDITY, new CertificateValidity(new Date(now), new Date(now + 365L * 24L * 60L * 60L * 1000L)));
        info.set(X509CertInfo.KEY, new CertificateX509Key(publicKey));
        info.set(X509CertInfo.ALGORITHM_ID, new CertificateAlgorithmId(new AlgorithmId(AlgorithmId.sha256WithRSAEncryption_oid, AlgorithmId.rsaEncryption)));

        X509CertImpl cert = new X509CertImpl(info);
        cert.sign(privateKey, "SHA256withRSA");
        return cert;
    }

    public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException, IOException, CertificateException, InvalidKeySpecException {
        KeyPair keyPair = GenerateKeyPairUtil.generateRSAKeyPair(new File("public.key"), new File("private.key"));

        System.out.println("Public key:\n" + keyPair.getPublic().toString() + "\n");
        System.out.println("Private key:\n" + keyPair.getPrivate().toString());
    }
}

在执行完上述代码后,在指定的目录下会生成名称为“public.key”和“private.key”的公钥和私钥文件。

三、RSA加解密

RSA是一种非对称加密算法,根据公钥加密,私钥解密。

  1. RSA公钥加密

RSA公钥加密示例:

import org.bouncycastle.openssl.PEMReader;
import org.bouncycastle.openssl.PEMWriter;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.StringWriter;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Security;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;

public class RSAEncryptUtil {

    static {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    }

    public static byte[] encrypt(byte[] data, String publicKeyFile) throws Exception {
        // 读取公钥
        PEMReader reader = new PEMReader(new FileReader(publicKeyFile));
        JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
        PublicKey publicKey = converter.getPublicKey((RSAPublicKey) reader.readObject());
        reader.close();

        Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);

        return cipher.doFinal(data);
    }

    public static void main(String[] args) throws Exception {
        // 待加密数据
        String data = "Hello, world!";

        // 加载RSA公钥
        String publicKeyFile = "public.key";

        // 加密
        byte[] encrypted = RSAEncryptUtil.encrypt(data.getBytes(), publicKeyFile);

        // 将加密后的数据进行Base64编码,方便传输
        String encryptedBase64 = new String(org.bouncycastle.util.encoders.Base64.encode(encrypted));

        System.out.println("加密前:" + data);
        System.out.println("加密后:" + encryptedBase64);
    }
}
  1. RSA私钥解密

RSA私钥解密示例:

import org.bouncycastle.openssl.PEMReader;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;

import javax.crypto.Cipher;
import java.io.FileReader;
import java.security.PrivateKey;
import java.security.Security;
import java.security.interfaces.RSAPrivateCrtKey;

public class RSADecryptUtil {

    static {
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    }

    public static byte[] decrypt(byte[] data, String privateKeyFile) throws Exception {
        // 读取私钥
        PEMReader reader = new PEMReader(new FileReader(privateKeyFile));
        JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
        PrivateKey privateKey = converter.getPrivateKey((RSAPrivateCrtKey) reader.readObject());
        reader.close();

        Cipher cipher = Cipher.getInstance("RSA/None/PKCS1Padding", "BC");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);

        return cipher.doFinal(data);
    }

    public static void main(String[] args) throws Exception {
        // 待解密数据
        String encryptedBase64 = "WbWSkZlwsP6QcCI1CksTZ2atyWrxFhq/f5PHj0tPchB+znmrldyF76Sp7k3SLx9STuL2T1Qzg1kXsg2TYiUoJNEcs9TJupf6834KvGgLit7aJHgQsd78/Hio6lZay8uSMMXGd7mF8EN1WVK9d5YjRmBFSxe1mwmowlzhtYS9IL8=";

        // 加载RSA私钥
        String privateKeyFile = "private.key";

        // 解密
        byte[] decrypted = RSADecryptUtil.decrypt(org.bouncycastle.util.encoders.Base64.decode(encryptedBase64.getBytes()), privateKeyFile);

        System.out.println("解密前:" + new String(decrypted));
        System.out.println("解密后:" + new String(decrypted));
    }
}

在上述示例中,给出了Java OpenSSL生成的RSA测试公私钥及其加解密的示例。这些示例需要依存Bouncy Castle库,应在自己的项目中将其添加到类路径中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java OpenSSL生成的RSA公私钥进行数据加解密详细介绍 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • MyBatis-plus+达梦数据库实现自动生成代码的示例

    接下来我将详细讲解如何使用MyBatis-plus和达梦数据库实现自动生成代码的步骤和注意事项。 环境准备 JDK 1.8及以上版本 Maven 3.5及以上版本 Spring Boot 2.x及以上版本 MyBatis-plus 3.x及以上版本 达梦数据库 JDBC 驱动程序 步骤一:添加依赖 首先,在使用 MyBatis-plus 时,需要添加相应的依…

    Java 2023年5月20日
    00
  • 详解java平台解析协议相关备忘

    详解Java平台解析协议相关备忘 本文主要介绍在Java平台下解析常见网络协议的相关备忘,方便开发者进行网络编程。 TCP协议解析 1.建立连接 使用Java Socket进行TCP连接,代码示例如下: Socket socket = new Socket("localhost", 8080); 其中,”localhost”为连接的服务器…

    Java 2023年5月27日
    00
  • java数字和中文算数验证码的实现

    下面将为你讲解如何实现“Java数字和中文算数验证码”的过程。 1. 实现思路 Java数字和中文算数验证码一般包括以下几个步骤: 生成算式表达式和结果 将算式表达式和结果转化为图片 将图片显示在界面上 验证用户输入的答案是否正确 2. 实现步骤 2.1 生成算式表达式和结果 算式表达式可以随机生成,常见的包括加减乘除四则运算,可以使用Java中的随机数生成…

    Java 2023年5月19日
    00
  • Java 如何实现时间控制

    Java 中实现时间控制的方式有很多种,其中比较常用的有以下几种: 方式一:使用 Timer 和 TimerTask 类 Java 通过 Timer 和 TimerTask 类可以实现简单的时间控制功能。Timer 是一个定时器类,可用于在指定时间间隔内重复执行某个操作。TimerTask 则是一个抽象类,用于在指定时间执行某个操作。通过这两个类的组合使用,…

    Java 2023年5月20日
    00
  • 使用maven编译Java项目实例

    使用Maven编译Java项目的完整攻略,主要分为以下几个步骤: Step 1:准备工作 在开始编译Java项目之前,需要确保已经安装好了以下软件和环境: JDK:确保已经安装了JDK,并设置了JAVA_HOME环境变量。 Maven:需要先安装Maven,并将其添加到PATH环境变量中。 Step 2:创建项目 在本地计算机上创建一个Java项目,并使用M…

    Java 2023年5月20日
    00
  • Hibernate对数据库删除、查找、更新操作实例代码

    下面就是详细讲解 Hibernate 对数据库删除、查找、更新操作实例代码的完整攻略。 什么是 Hibernate Hibernate 是一个开源的、高性能的 Java ORM(对象关系映射)框架。它可以让我们通过面向对象的方式进行数据库操作,避免了 SQL 语句难以管理和维护的问题。 使用Hibernate,我们可以通过定义 Java 类与数据库表的映射关…

    Java 2023年5月19日
    00
  • maven私服的配置使用方法

    为了详细讲解maven私服的配置使用方法,我将分为以下三个部分: Maven私服的配置 Maven私服的使用 示例演示 Maven私服的配置 Maven私服可以管理、缓存和分发项目所需的依赖项,以加快项目构建的速度。在将Maven私服配置为自己的项目的常规步骤中,需要设置一个Maven私服URL和一个Maven私服ID。 将以下配置添加到你的Maven se…

    Java 2023年5月20日
    00
  • MyBatis入门实例教程之创建一个简单的程序

    首先我们需要明确一下MyBatis的基础知识。MyBatis是一个持久层框架,可以与关系型数据库进行交互。在使用MyBatis时,我们需要进行以下三步操作: 配置数据源:需要在MyBatis的配置文件中配置数据库的连接信息。 编写Mapper文件:Mapper文件是MyBatis的核心,用于描述SQL语句以及与Java对象之间的映射关系。 执行SQL语句:通…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部