加密解密(RSA)非对称加密算法

简介: 加密解密(RSA)非对称加密算法

RSA

RSA加解密是一种非对称加密算法,由三位数学家Rivest、Shamir和Adleman于1977年提出。它的概念是基于两个密钥:公钥和私钥。公钥用于加密数据,私钥用于解密数据。

RSA算法的原理

RSA算法的原理基于数论中的两个重要问题:大数分解和模幂运算。其核心思想是选择两个大素数p和q,计算它们的乘积n=p*q,并选择一个整数e作为公钥,满足e与(p-1)(q-1)互质。然后,计算私钥d,使得e*d ≡ 1 (mod (p-1)(q-1))。公钥是(n, e),私钥是(n, d)。

加密过程中,将明文m转换为整数M,然后使用公钥对M进行加密,得到密文C。加密操作为C ≡ M^e (mod n)。解密过程中,使用私钥对密文C进行解密,得到明文m。解密操作为m ≡ C^d (mod n)。

优点

RSA算法的优点是安全性高,能够提供可靠的数据加密和解密。它的缺点是加密和解密的速度相对较慢,尤其是对于大数据量的处理。

应用场景

RSA算法在实际应用中广泛使用,包括数字签名、密钥交换、安全通信等领域。它可以用于保护敏感信息的传输和存储,确保数据的机密性和完整性。

代码示例

首先,生成RSA密钥对,然后使用公钥对明文进行加密,再使用私钥对密文进行解密。最后,输出解密后的明文

 
import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.Base64;
 
public class RSAExample {
 
    /**
     * 创建密钥规范
     */
    public static final String RSA_KEY = "RSA";
 
    public static void main(String[] args) throws Exception {
        //注:这里加密解密要用同一个   一对存在
        KeyPair keyPair = keyPairInit();
        Cipher cipher = Cipher.getInstance(RSA_KEY);
        // 明文
        String plainText = "Hello, RSA!";
        System.out.println("明文: " + plainText);
        // 加密
        PublicKey publicKey = keyPair.getPublic();
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        String encode = encode(plainText, cipher);
        System.out.println("加密后: " + encode);
        // 解密
        PrivateKey privateKey = keyPair.getPrivate();
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        String decode = decode(encode, cipher);
        System.out.println("解密后: " + decode);
    }
 
    /**
     * 生成RSA密钥对
     *
     * @return
     * @throws Exception
     */
    public static KeyPair keyPairInit() throws Exception {
        // 生成RSA密钥对
        KeyPairGenerator instance = KeyPairGenerator.getInstance(RSA_KEY);
        KeyPair keyPair = instance.generateKeyPair();
        return keyPair;
    }
 
    /**
     * 加密
     *
     * @param plainText 明文
     * @return
     * @throws Exception
     */
    public static String encode(String plainText, Cipher cipher) throws Exception {
        byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());
        String encode = Base64.getEncoder().encodeToString(encryptedBytes);
        return encode;
    }
 
    /**
     * 解密
     *
     * @param encrypted 密文
     * @return
     * @throws Exception
     */
    public static String decode(String encrypted, Cipher cipher) throws Exception {
        byte[] decode = Base64.getDecoder().decode(encrypted);
        byte[] decryptedBytes = cipher.doFinal(decode);
        return new String(decryptedBytes);
    }
}

RSA公钥和私钥的生成(.asc)

RSA公钥和私钥的生成可以使用Java的密钥对生成器(KeyPairGenerator)来实现。具体步骤如下:

  1. 使用KeyPairGenerator.getInstance("RSA")获取一个RSA密钥对生成器实例。
  2. 使用generateKeyPair方法生成密钥对,该方法返回一个KeyPair对象。
  3. 从生成的KeyPair对象中分别获取公钥和私钥,并将它们保存到文件中。

代码示例

第一种

生成RSA公钥和私钥:

 
import java.io.FileOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
 
public class RSAGenerator {
 
    public static void main(String[] args) throws Exception {
        // 创建RSA密钥对生成器对象
        KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
        // 初始化密钥对生成器,指定密钥长度为1024位
        kpg.initialize(1024);
 
        // 生成RSA密钥对
        KeyPair keyPair = kpg.generateKeyPair();
        // 获取公钥和私钥
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
 
        // 保存公钥和私钥到文件中
        saveKeyToFile("public.key", publicKey.getEncoded());
        saveKeyToFile("private.key", privateKey.getEncoded());
 
        System.out.println("RSA公钥和私钥已生成并保存到文件中!");
    }
 
    /**
     * 将密钥保存到文件中
     *
     * @param fileName
     * @param keyBytes
     * @throws Exception
     */
    public static void saveKeyToFile(String fileName, byte[] keyBytes) throws Exception {
        FileOutputStream fos = new FileOutputStream(fileName);
        fos.write(keyBytes);
        fos.close();
    }
 
}

生成.asc文件

运行该程序后,将会生成一个名为public.key的文件和一个名为private.key的文件,其中public.key文件保存公钥,private.key文件保存私钥。这两个文件的格式为二进制格式,如果需要以.asc文件的形式保存,可以使用如下命令将其转换:

$ openssl rsa -in private.key -outform PEM -out private.asc
$ openssl rsa -in public.key -outform PEM -out public.asc

这将把private.key和public.key转换为private.asc和public.asc文件,其中private.asc和public.asc文件就是RSA私钥和公钥的.asc形式。

第二种:

生成RSA密钥对并保存为.pem和.der文件

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.io.FileOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.Security;
 
public class RSAKeyPairGenerator {
    public static void main(String[] args) throws Exception {
        Security.addProvider(new BouncyCastleProvider());
 
        // Generate RSA key pair
        KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");
        generator.initialize(2048);
        KeyPair keyPair = generator.generateKeyPair();
 
        // Save private key as .pem file
        try (FileOutputStream privateKeyFile = new FileOutputStream("private_key.pem")) {
            privateKeyFile.write(keyPair.getPrivate().getEncoded());
        }
 
        // Save public key as .der file
        try (FileOutputStream publicKeyFile = new FileOutputStream("public_key.der")) {
            publicKeyFile.write(keyPair.getPublic().getEncoded());
        }
 
        System.out.println("RSA key pair generated and saved successfully.");
    }
}

注:依赖

<dependencies>
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.68</version>
    </dependency>
</dependencies>
<dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcpkix-jdk15on</artifactId>
            <version>1.68</version>
        </dependency>


相关文章
|
21天前
|
算法 C# 数据安全/隐私保护
|
18天前
|
算法 安全 数据安全/隐私保护
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
|
18天前
|
数据安全/隐私保护
https【详解】与http的区别,对称加密,非对称加密,证书,解析流程图
https【详解】与http的区别,对称加密,非对称加密,证书,解析流程图
13 0
|
20天前
|
算法 安全 网络安全
支付系统,网络安全06----支付安全---,机密性,加密算法,目前最流行的加密算法,AES加密算法,目前最流行的非对称加密算法RSA,对称加密和非对称加密的优缺点,非对称加密是基于非常复杂的数学算法
支付系统,网络安全06----支付安全---,机密性,加密算法,目前最流行的加密算法,AES加密算法,目前最流行的非对称加密算法RSA,对称加密和非对称加密的优缺点,非对称加密是基于非常复杂的数学算法
|
21天前
|
算法 Java 数据处理
Java中MD5加密算法的实现
Java中MD5加密算法的实现
|
1天前
|
SQL 安全 网络安全
网络安全与信息安全:漏洞、加密技术与安全意识的深度剖析
在数字化时代,网络安全与信息安全成为维护数据完整性、保密性和可用性的关键。本文将深入探讨网络安全中常见的漏洞类型,介绍加密技术如何保护信息免受未授权访问,并强调培养安全意识的重要性。我们将通过具体案例和统计数据来展示网络攻击的实际影响,分析加密技术的工作原理及其面临的挑战,并提供实用的建议来提高个人和组织的安全意识。文章旨在为读者提供全面的网络安全知识,帮助他们在日益复杂的网络环境中保护自己的信息资产。
|
4天前
|
存储 监控 安全
网络安全的守护者:漏洞、加密与意识
【7月更文挑战第19天】本文深入探讨了网络安全领域的核心要素,包括网络漏洞的识别与防御、先进的加密技术,以及培养必要的安全意识。文章不仅提供了关于网络攻击手段和防御策略的实用信息,还讨论了如何通过教育提高个人和组织的安全素养。通过分析最新的网络安全趋势和案例研究,本文为读者提供了一套全面的网络安全知识框架。
|
1天前
|
安全 算法 网络安全
数字堡垒之下:网络安全漏洞、加密技术与安全意识的现代博弈
在数字化时代的浪潮中,网络安全已成为保护个人隐私和企业资产的重要防线。本文将探讨网络安全漏洞的成因与影响,分析加密技术在数据保护中的关键作用,并强调提升公众和企业的安全意识的必要性。通过具体案例和最新统计数据,我们将揭示网络威胁的现实面貌,并提供实用的防护策略,以增强读者对网络安全挑战的认识和应对能力。
|
1天前
|
SQL 安全 网络安全
网络安全与信息安全:漏洞、加密技术与安全意识的三重防线
在数字时代的浪潮中,网络安全和信息安全成为保护个人隐私和企业资产的重要屏障。本文将深入探讨网络安全漏洞的种类与影响,分析加密技术在数据保护中的应用及局限性,并强调培养安全意识的必要性。文章旨在揭示网络威胁的复杂性,提供防护策略,并促进读者对信息安全重要性的认识。
10 3
|
1天前
|
SQL 安全 网络安全
网络安全漏洞、加密技术与安全意识:知识分享
在数字化时代,网络安全与信息安全已成为全球关注的焦点。本文将探讨网络安全漏洞、加密技术以及安全意识等方面的内容。首先,我们将介绍常见的网络漏洞类型及其利用方式;其次,我们将讨论加密技术的原理和应用场景;最后,我们将强调安全意识在维护网络安全中的重要作用。通过本文的分享,希望能够提高读者对网络安全的认识和防范能力。
6 2