do { e = new BigInteger(2 * SIZE, new Random()); } // 前面的条件表示 e>PhiN,后面的条件表示e与PhiN的最大公约数不为1,即表示不互质 // 当e>PhiN或e与PhiN不互质时就不断循环,直到两个条件都满足,即找到了一个小于φ(n)且与φ(n)互质的整数e while ((e.compareTo(PhiN) != 1) || (e.gcd(PhiN).compareTo(BigInteger.valueOf(1)) != 0));
int SIZE = 512; // p and q are 2 154 digit Prime Numbers which are used in the generation of RSA Keys p = new BigInteger("8513222065247162701695105220665738877312063308356937563625345485856710133446374665834898192825484459951443770023314504441479244278247980992441766519074969"); q = new BigInteger("8364581280641288933593527550533091363060086128207408134848028170130641974184553465641962883238792572920670310338579332490687347012348067644317739328586993"); n = p.multiply(q); PhiN = p.subtract(BigInteger.valueOf(1)); PhiN = PhiN.multiply(q.subtract(BigInteger.valueOf(1))); do { e = new BigInteger(2 * SIZE, new Random()); } // 前面的条件表示 e>PhiN,后面的条件表示e与PhiN的最大公约数不为1,即表示不互质 // 当e>PhiN或e与PhiN不互质时就不断循环,直到两个条件都满足 while ((e.compareTo(PhiN) != 1) || (e.gcd(PhiN).compareTo(BigInteger.valueOf(1)) != 0)); d = e.modInverse(PhiN); }
/** * 加密:使用接收者的公钥(e, n),将明文数据m加密为密文c。加密操作为c = m^e mod n。 * 解密:使用接收者的私钥(d, n),将密文c解密为明文数据m。解密操作为m = c^d mod n。 */ public BigInteger encrypt(BigInteger plaintext){ return plaintext.modPow(e, n); }
public BigInteger decrypt(BigInteger ciphertext){ return ciphertext.modPow(d, n); } }