From 851432fe870be4218433703c0752cf1757dcdd60 Mon Sep 17 00:00:00 2001 From: Nguyen Duy Tiep Date: Tue, 24 Oct 2017 20:39:11 +0800 Subject: [PATCH] RSA encryption --- ciphers/RSA.java | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 ciphers/RSA.java diff --git a/ciphers/RSA.java b/ciphers/RSA.java new file mode 100644 index 00000000..5baa61b0 --- /dev/null +++ b/ciphers/RSA.java @@ -0,0 +1,62 @@ +package ciphers; + +import java.math.BigInteger; +import java.security.SecureRandom; + +/** + * Created by Nguyen Duy Tiep on 23-Oct-17. + */ +public class RSA { + private BigInteger modulus, privateKey, publicKey; + + public RSA(int bits) { + generateKeys(bits); + } + + public synchronized String encrypt(String message) { + return (new BigInteger(message.getBytes())).modPow(publicKey, modulus).toString(); + } + + public synchronized BigInteger encrypt(BigInteger message) { + return message.modPow(publicKey, modulus); + } + + public synchronized String decrypt(String message) { + return new String((new BigInteger(message)).modPow(privateKey, modulus).toByteArray()); + } + + public synchronized BigInteger decrypt(BigInteger message) { + return message.modPow(privateKey, modulus); + } + + /** Generate a new public and private key set. */ + 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); + } + + /** Trivial test program. */ + public static void main(String[] args) { + RSA rsa = new RSA(1024); + + String text1 = "This is a message"; + System.out.println("Plaintext: " + text1); + + String ciphertext = rsa.encrypt(text1); + System.out.println("Ciphertext: " + ciphertext); + + System.out.println("Plaintext: " + rsa.decrypt(ciphertext)); + } +}