BigInteger 是 RSA 密钥生成的核心工具,提供 probablePrime、modInverse 等方法支持大素数生成、模逆元计算等数学流程,但不自动计算密钥对,需手动实现选素数、算 φ(n)、求 e 和 d 的全过程。

Java 中的 BigInteger 是实现 RSA 的核心工具,但它本身不直接“计算公钥私钥”,而是提供大整数运算能力,供你按 RSA 数学流程手动构造密钥对。RSA 密钥生成本质是数学过程:选两个大素数、算模数和欧拉函数、选公钥指数、求私钥指数(模逆元)。BigInteger 提供了 probablePrime、gcd、modInverse、modPow 等关键方法来支撑这一过程。
生成两个大素数 p 和 q
RSA 安全性依赖于大素数分解困难。不能用小常量(如 61、53),必须用足够位长的随机素数(生产环境建议 ≥2048 位)。
- 使用
BigInteger.probablePrime(bitLength, random)生成伪随机素数,例如:BigInteger p = BigInteger.probablePrime(1024, new SecureRandom());BigInteger q = BigInteger.probablePrime(1024, new SecureRandom()); - 确保
p.compareTo(q) != 0,避免相同素数导致模数不安全
计算模数 n 和欧拉函数 φ(n)
n = p × q,φ(n) = (p−1) × (q−1),这两个值必须保密(尤其 φ(n))。
BigInteger n = p.multiply(q);BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));- 注意:不能直接用
(p-1)*(q-1),必须用subtract和multiply
选择公钥指数 e 并验证互质性
e 通常取固定值(如 65537 = 0x10001),它必须满足:1
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 常用安全值:
BigInteger e = BigInteger.valueOf(65537); - 验证互质:
if (!e.gcd(phi).equals(BigInteger.ONE)) { throw new RuntimeException("e not coprime to φ(n)"); } - 也可随机生成 e,但需循环检查互质,效率低且不必要
计算私钥指数 d(模逆元)
d 是 e 关于 φ(n) 的模乘法逆元,即满足 (e × d) mod φ(n) = 1。这是 RSA 最关键一步,BigInteger.modInverse 直接完成:
BigInteger d = e.modInverse(phi);- 该方法内部使用扩展欧几里得算法,要求 e 和 φ(n) 互质(前面已验证)
- 得到的 d 就是私钥的核心指数,配合 n 构成私钥 (d, n)
至此,公钥为 (e, n),私钥为 (d, n)。实际应用中建议用 KeyPairGenerator(如 KeyPairGenerator.getInstance("RSA"))委托 JVM 安全实现,而非手写上述流程——除非教学、定制协议或研究需要。手写有助于理解原理,但易出错且难满足 FIPS/合规要求。

















