首页 > 编程语言 >Java非对称加密RSA算法

Java非对称加密RSA算法

时间:2023-11-14 17:03:20浏览次数:40  
标签:算法 公钥 加密 RSA Java 密钥 私钥 非对称

简介:

公开密钥密码学(英语:Public-key cryptography)也称非对称式密码学(英语:Asymmetric cryptography)是密码学的一种算法。加密与解密使用不同的密钥,其中一个称之为公钥,对外公开,通常用于数据加密。另一个称之为私钥,是不能对外公布的,通常用于数据解密,这样使用公钥加密的数据即使被人非法截取,因为没有与之配对的私钥也不能对数据进行解密。

具体过程如下图

Java非对称加密RSA算法_数据

优点:

较于对称算法有较高的安全性,主要是因为加密与解密采用不同的密钥,且无法通过一个密钥推导出另一个密钥,公钥加密的信息只能用同一方的私钥解密。

缺点:

算法非常复杂,导致加密大量数据的时候所用的时间比较长,加密后的报文比较长,会导致数据分片,不利于传输。

常用算法:

DH DSA RDA

RSA介绍:

是公开密钥系统的代表;

安全性:建立在具有大素数因子的合数,其因子分解困难这一法则之上;处理速度慢密钥管理:加解密过程中不必网络传输保密的密钥;密钥管理优于AES算法;

RSA加解密速度慢,不适合大量数据文件加密;

RSA原理:

RSA算法是一种基于数学原理的非对称加密算法,利用公钥加密、私钥解密的特性来保护数据安全和实现数字签名。

RSA(Rivest-Shamir-Adleman)是一种非对称加密算法,使用一对密钥(公和私)进行加密和解密操作。它是目前广泛应用于数据加密和数字签名领域的一种加密算法。RSA算法的原理基于两个数学问题:

1.大数分解:在给定一个大的合数的情况下,找到该合数的质因数。

2.模幂运算:计算一个数的指数次幂除以另一个数后的余数。

RSA算法的过程如下:

生成密钥对:首先生成一对密钥,分别是公钥和私钥。公钥可以公开,而私钥必须保密。

加密:使用公钥将明文进行加密。发送方使用公钥对明文进行加密得到密文。

解密:使用私钥将密文进行解密。接收方使用私钥对密文进行解密,还原出原始明文。在RSA算法中,公钥用于加密数据,私钥用于解密数据。加密时,数据经过公钥加密后,只能通过对应的私钥进行解密。这种不对称的特性使得RSA算法在保护数据安全和实现数字签名方面具有重要的应用价值。 RSA算法的安全性基于大数分解问题的困难性,即要通过公钥找到私钥的计算复杂度远远高于通过私钥找到公钥。此外,RSA算法的安全性还依赖于合理选择的秘钥长度。

RSA应用

签名和验签的流程:

Java非对称加密RSA算法_数据_02

代码示例:

package com.gfc.test;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import java.security.*;

/**
 * RSA算法
 *
 * @author gfc
 * @date 2023/11/14 9:16
 */
public class EncryptAndDecrypt {
    public static void main(String[] args) throws Exception {
        // 明文字符串
        String plaintext = "Hello, world!";
        // 生成RSA密钥对
        KeyPair keyPair = generateRSAKeyPair();
        // 获取公钥和私钥
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        // 公钥加密
        byte[] encryptedBytes = encryptRSA(plaintext, publicKey);
        // 输出密文
        System.out.println("密文:" + new String(encryptedBytes));
        // 私钥解密
        String decryptedBytes = decryptRSA(encryptedBytes, privateKey);
        // 输出明文
        System.out.println("明文:" + decryptedBytes);
    }

    /**
     * 生成RSA密钥对
     *
     * @return RSA密钥对
     * @throws NoSuchAlgorithmException 理解和处理算法不存在异常
     */
    public static KeyPair generateRSAKeyPair() throws NoSuchAlgorithmException {
        Security.addProvider(new BouncyCastleProvider());
        // 初始化密钥对生成器,指定密钥长度为1024位
        final int keySize = 1024;
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(keySize);
        return keyPairGenerator.generateKeyPair();
    }

    /**
     * 公钥加密
     *
     * @param plaintext 明文
     * @param publicKey 公钥
     * @return 密文
     * @throws Exception 异常
     */
    public static byte[] encryptRSA(String plaintext, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        return cipher.doFinal(plaintext.getBytes());
    }

    /**
     * @param ciphertext 密文
     * @param privateKey 私钥
     * @return 明文
     * @throws Exception 异常
     */
    public static String decryptRSA(byte[] ciphertext, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(ciphertext);
        return new String(decryptedBytes);
    }
}
代码注意:

每次用公钥加密后,结果是不一致的,主要是在明文填充的时候有随机数验证算法的正确性:将生的私钥 copy,解密公加密结果,如果与最初的明文一致,则说明RSA算法运算正确!

标签:算法,公钥,加密,RSA,Java,密钥,私钥,非对称
From: https://blog.51cto.com/u_16356983/8371468

相关文章

  • Java将SQL解析为SQL模板
    /***获取sql模板*/publicStringextraSqlTemplate(StringsqlContent){if(StringUtils.isBlank(sqlContent)){return"";}String[]sqlContentArr=sqlContent.split("");String......
  • Day04java方法
    所有学习内容来自:狂神说javaJava方法详解一、方法java方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序集合方法包含于类或对象中方法在程序中被创建,在其他地方被引用设计方法的原则:设计方法时最好保持方法的原子性,就是一个方法值完成一个功能,这......
  • Java登陆第六天——SQL之SQL(四)外连接
    外连接外连接分为左外连接和右外连接。有的也叫联表查询,联表查询分为左表查询(左外连接)和右表查询(右外连接)。准备数据createtablestu(idint,namevarchar(32));insertintostuvalues(1,'jack'),(2,'tom'),(3,'kity'),(4,'nono');createtableexam(idint,gr......
  • 秦疆的Java课程笔记:32 基础 JavaDoc生成文档
    javadoc命令是用来生成自己API文档的参数信息:@author作者名@version版本号@since指明需要最早使用的JDK版本@param参数名@return返回值情况@throws异常抛出情况比如这就是一个JDK21的Oracle官方API:点击跳转packageacolyte.operator;/***这是加在类......
  • 因为懒得百度,我选择自己写篇博文教自己配置JAVA环境
    1.首先是准备施法材料JDK的下载地址:https://www.oracle.com/java/technologies/downloads/然后选择自己的想要的版本和英雄(系统)选择x64CompressedArchive免安装版本进行下载(解压就用,免除疯狂确认的烦恼)解压到某个位置就好,这里我创建了一个JDK文件夹,为了以后切换版本时,统一......
  • Java 中 为什么 Long 用== 有时候返回true 有时候事false
    今天做项目的时候一直跑不出想要的结果,最后才发现是一处判断语句出了问题。有两个Long类型的变量初始赋值都为10000,但用“==”来判断结果却是判断它们不相等。Long中有⼀个静态的内部类LongCache,专门⽤于缓存-128⾄127之间的值,⼀共256个元素。如果值在[-128,127]之间,会放在缓存......
  • java带List实体的集合转换
     实体类publicclassPageResult<T>{intpage;intlimit;Longcount;Stringcode;stringmsg;List<T>data;Texample;publicPageResult(){}}  转换的utils/***list集合转换*@paramresultT转换前数据*@paramresultw转换后的实体类@paramclassW......
  • JavaWeb--Servlet
    Servlet专门用来开发动态web资源开发技术 导入servlet依赖坐标<dependencies><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><s......
  • JavaScript - js生成 txt 文件
    JavaScript-js生成txt文件/***方法定义*/functiondownload(filename,text){varelement=document.createElement('a');element.style.display='none';varcontent=encodeURIComponent(text);element.setAttribute('href&#......
  • Docker 部署 java应用
    创建DockerfileFROMopenjdk:8-jdk-alpine#前一个dns.jar为上传的jar包,后一个dns.jar是将服务器中jar包对应在容器中运行的jar包名称ADDdns.jardns.jar#容器暴露的端口号,需要与jar包在容器中运行使用端口号一致EXPOSE9999#容器启动之后执行的命令,java-jard......