RSA 是非對稱加密演算法的經典實現,廣泛應用於資料加密、數位簽章與金鑰交換。本文將詳細解析 RSA 核心數學原理,並提供完整的 Java 程式碼實作,幫助開發者深入理解公開金鑰加密體系的運作機制。
RSA 安全性建立在大整數分解困難性之上。演算法流程包含三個關鍵步驟:
package rsa;
import java.math.BigInteger;
public class RSA {
private long p, q, e, d, n;
public RSA() {
// 為了示範方便,這裡使用固定質數
// 實際應用應使用 SecureRandom 生成大質數
p = 1033;
q = 2017;
e = 29437;
n = p * q;
d = calculateD();
}
private long calculateD() {
long t0 = 0, t1 = 1, t2 = -1;
long r0 = (p - 1) * (q - 1), m = r0, r1 = e, r2 = -1;
do {
long q = r0 / r1;
r2 = r0 - r1 * q;
if (r2 == 0) break;
t2 = t0 - t1 * q;
while (t2 < 0) t2 += m;
if (t2 >= m) t2 %= m;
r0 = r1; r1 = r2;
t0 = t1; t1 = t2;
} while (r2 != 0);
if (r1 != 1) return 0;
else return t2;
}
public BigInteger encode(BigInteger data) {
return pow(data, d).mod(BigInteger.valueOf(n));
}
public BigInteger decode(BigInteger code) {
return pow(code, e).mod(BigInteger.valueOf(n));
}
public BigInteger pow(BigInteger data, long p) {
return data.pow((int) p);
}
// Getter 方法省略...
public static void main(String args[]) {
RSA rsa = new RSA();
BigInteger data = new BigInteger("222222");
long oldtime = System.currentTimeMillis();
BigInteger code = rsa.encode(data);
long newtime = System.currentTimeMillis();
double codetime = ((double)(newtime - oldtime)) / 1000;
oldtime = System.currentTimeMillis();
BigInteger decode = rsa.decode(code);
newtime = System.currentTimeMillis();
double decodetime = ((double)(newtime - oldtime)) / 1000;
System.out.println("私鑰 d: " + rsa.d);
System.out.println("公開指數 e: " + rsa.e);
System.out.println("模數 n: " + rsa.n);
System.out.println("原文: " + data);
System.out.println("密文: " + code + " 耗時: " + codetime + "秒");
System.out.println("解密: " + decode + " 耗時: " + decodetime + "秒");
}
}
java.math.BigInteger 進行模冪運算calculateD() 實作擴展歐幾里得演算法求模逆,這是 RSA 金鑰生成的核心步驟pow() 方法,生產環境應採用平方乘演算法或 BigInteger.modPow() 優化大指數運算SecureRandom)產生 2048 位元以上的大質數透過本文的完整實作與原理解析,開發者可建立扎實的 RSA 演算法認知基礎。實際專案開發中,強烈建議直接使用成熟的密碼學函式庫(如 Bouncy Castle 或 Java 內建 JCA),避免自行實作帶來的安全風險。