RSA Algorithm
More often, RSA passes coded shared keys for symmetric key cryptanalysis which in turn can perform bulk encryption-decryption operations at much higher speed. Clifford Cocks, an English mathematician working for the British intelligence agency government communications Headquarters (GCHQ), had developed an equivalent system in 1973, which was not declassified until 1997.
A user of RSA makes and then publishes a public key based on two large prime numbers, along with an auxiliary value. Rivest and Shamir, as computer scientists, proposed many potential functions, while Adleman, as a mathematician, was responsible for finding their weaknesses. Some people feel that teaching child-RSA gives insight into RSA and other public-key ciphers, analogous to simplified DES.The algorithm is now known as RSA – the initials of their surnames in same order as their paper.
package ciphers;
import java.math.BigInteger;
import java.security.SecureRandom;
import javax.swing.JOptionPane;
/**
* @author Nguyen Duy Tiep on 23-Oct-17.
*/
public final class RSA {
/**
* Trivial test program.
*
* @param args
* @deprecated TODO remove main and make JUnit Testing or any other
* methodology
*/
public static void main(String[] args) {
RSA rsa = new RSA(1024);
String text1 = JOptionPane.showInputDialog("Enter a message to encrypt :");
String ciphertext = rsa.encrypt(text1);
JOptionPane.showMessageDialog(null, "Your encrypted message : " + ciphertext);
JOptionPane.showMessageDialog(null, "Your message after decrypt : " + rsa.decrypt(ciphertext));
}
private BigInteger modulus, privateKey, publicKey;
/**
*
* @param bits
*/
public RSA(int bits) {
generateKeys(bits);
}
/**
*
* @param message
* @return encrypted message
*/
public synchronized String encrypt(String message) {
return (new BigInteger(message.getBytes())).modPow(publicKey, modulus).toString();
}
/**
*
* @param message
* @return encrypted message as big integer
*/
public synchronized BigInteger encrypt(BigInteger message) {
return message.modPow(publicKey, modulus);
}
/**
*
* @param encryptedMessage
* @return plain message
*/
public synchronized String decrypt(String encryptedMessage) {
return new String((new BigInteger(encryptedMessage)).modPow(privateKey, modulus).toByteArray());
}
/**
*
* @param encryptedMessage
* @return plain message as big integer
*/
public synchronized BigInteger decrypt(BigInteger encryptedMessage) {
return encryptedMessage.modPow(privateKey, modulus);
}
/**
* Generate a new public and private key set.
*
* @param bits
*/
public synchronized void generateKeys(int bits) {
SecureRandom r = new SecureRandom();
BigInteger p = new BigInteger(bits / 2, 100, r);
BigInteger q = new BigInteger(bits / 2, 100, r);
modulus = p.multiply(q);
BigInteger m = (p.subtract(BigInteger.ONE)).multiply(q.subtract(BigInteger.ONE));
publicKey = new BigInteger("3");
while (m.gcd(publicKey).intValue() > 1) {
publicKey = publicKey.add(new BigInteger("2"));
}
privateKey = publicKey.modInverse(m);
}
}