RSA[非对称加密算法]

359 阅读3分钟

       RSA 是一种非对称加密算法,用于安全数据传输。RSA 是由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)在1977年一起提出的。当时他们三人都在麻省理工学院工作。RSA 就是他们三人姓氏开头字母拼在一起组成的。

       1973年,在英国政府通讯总部工作的数学家克利福德·柯克斯(Clifford Cocks)在一个内部文件中提出了一个与之等效的算法,但该算法被列入机密,直到1997年才得到公开。对极大整数做因数分解的难度决定了 RSA 算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA 算法愈可靠。假如有人找到一种快速因数分解的算法的话,那么用 RSA 加密的信息的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的 RSA 钥匙才可能被强力方式破解。到2020年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用 RSA 加密的信息实际上是不能被破解的。

       RSA 是现代加密领域的核心技术之一,广泛应用于 SSL/TLS 协议、数字签名、电子邮件加密等场景。

RSA的特点

  • 非对称性:不同于对称加密(如 AES)使用同一密钥,RSA 使用一对密钥。

  • 基于数学难题:RSA 的安全性依赖于大整数因式分解的计算复杂性。

  • 支持多功能:既可用于加密,也可用于数字签名。

  • 广泛应用:被视为非对称加密的事实标准。

基于Java的快速实践

使用 Java 的 java.security 包生成密钥并进行加密和解密

package cn.com.openboot.dotj.study.security;

import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;

public class RSAExample {
    public static void main(String[] args) throws Exception {
        // 1. 生成密钥对
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
        keyPairGen.initialize(2048); // 设置密钥长度(一般为2048位)
        KeyPair keyPair = keyPairGen.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();

        // 2. 待加密明文
        String message = "Hello, RSA!";
        System.out.println("原文: " + message);

        // 3. 加密
        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey); // 使用公钥加密
        byte[] encryptedData = cipher.doFinal(message.getBytes());
        System.out.println("加密后的密文: " + bytesToHex(encryptedData));

        // 4. 解密
        cipher.init(Cipher.DECRYPT_MODE, privateKey); // 使用私钥解密
        byte[] decryptedData = cipher.doFinal(encryptedData);
        System.out.println("解密后的原文: " + new String(decryptedData));
    }

    // 工具方法:字节数组转十六进制字符串
    public static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
}

注意事项

  • 密钥长度:2048 位是现代安全标准,推荐使用,不建议使用较短密钥。

  • 加密大小限制:RSA 通常用于加密小数据(如对称密钥或摘要),而不是直接加密大文件。

  • 填充方式:使用安全填充方案(如 OAEP)以防御加密攻击。

RSA 的安全性基础

+---------------------------+
|       RSA Algorithm       |
+---------------------------+
| 密钥生成 | 加密 | 解密 | 签名验证 |
+---------------------------+
      |             | 
+----------+   +----------+
| 公钥 (e) |   | 私钥 (d)  |
+----------+   +----------+
# 1.数学问题:大整数分解
  
  RSA 基于模幂运算和因式分解的难度。
  给定两个大素数 p, q,计算其乘积 N = p * q 容易,但从 N 中恢复 pq 则非常困难。

# 2.密钥生成:

  选择两个大素数 pq。
  计算 N = p * q 和  \phi(N) = (p-1)(q-1) 。
  选择一个公钥指数 e(通常是小素数,如 65537),满足 1 < e < \phi(N)。
  计算私钥指数 d,使 (d \cdot e \equiv 1 \pmod{\phi(N)})。

# 3.加密与解密:

  加密:C = M^e \mod N 
  解密:M = C^d \mod N

总结

致谢

更多内容欢迎关注 [ 小巫编程室 ] 公众号,喜欢文章的话,也希望能给小编点个赞或者转发,你们的喜欢与支持是小编最大的鼓励,小巫编程室感谢您的关注与支持。好好学习,天天向上(good good study day day up)。

参考资料[1]

RFC2CN: rfc2cn.com/rfc2313.htm…

RFC: www.rfc-editor.org/rfc/rfc2313…

在线工具: cryptii.com/