import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.InvalidKeyException; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.PublicKey; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; public class RSA { /** * String to hold name of the encryption algorithm. */ public static final String ALGORITHM = "RSA"; /** * String to hold the name of the private key file. */ public static final String PRIVATE_KEY_FILE = "private.key"; /** * String to hold name of the public key file. */ public static final String PUBLIC_KEY_FILE = "public.key"; /** * Generate key which contains a pair of private and public key using 2048 * bytes. Store the set of keys in Prvate.key and Public.key files. * */ public static void generateKey() { try { final KeyPairGenerator keyGen = KeyPairGenerator.getInstance(ALGORITHM); keyGen.initialize(2048); final KeyPair key = keyGen.generateKeyPair(); File privateKeyFile = new File(PRIVATE_KEY_FILE); File publicKeyFile = new File(PUBLIC_KEY_FILE); // Create files to store public and private key if (privateKeyFile.getParentFile() != null) { privateKeyFile.getParentFile().mkdirs(); } privateKeyFile.createNewFile(); if (publicKeyFile.getParentFile() != null) { publicKeyFile.getParentFile().mkdirs(); } publicKeyFile.createNewFile(); try ( // Saving the Public key in a file ObjectOutputStream publicKeyOS = new ObjectOutputStream( new FileOutputStream(publicKeyFile))) { publicKeyOS.writeObject(key.getPublic()); } try ( // Saving the Private key in a file ObjectOutputStream privateKeyOS = new ObjectOutputStream( new FileOutputStream(privateKeyFile))) { privateKeyOS.writeObject(key.getPrivate()); } } catch (NoSuchAlgorithmException | IOException e) { System.out.println(e.getMessage()); } } /** * The method checks if the pair of public and private key has been * generated. * * @return flag indicating if the pair of keys were generated. */ public static boolean areKeysPresent() { File privateKey = new File(PRIVATE_KEY_FILE); File publicKey = new File(PUBLIC_KEY_FILE); return privateKey.exists() && publicKey.exists(); } /** * Encrypt the plain text using public key. * * @param text : original plain text * @param key :The public key * @return Encrypted text */ public static byte[] encrypt(String text, PublicKey key) { byte[] cipherText = null; try { // get an RSA cipher object and print the provider final Cipher cipher = Cipher.getInstance(ALGORITHM); // encrypt the plain text using the public key cipher.init(Cipher.ENCRYPT_MODE, key); cipherText = cipher.doFinal(text.getBytes()); } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) { System.out.println(e.getMessage()); } return cipherText; } public static byte[] encrypt(String message) throws FileNotFoundException, IOException, ClassNotFoundException { if (!areKeysPresent()) { // Method generates a pair of keys using the RSA algorithm and stores it // in their respective files generateKey(); } // Encrypt the string using the public key ObjectInputStream inputStream = null; inputStream = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE)); final PublicKey publicKey = (PublicKey) inputStream.readObject(); final byte[] cipherText = encrypt(message, publicKey); return cipherText; } public static String decrypt(byte[] message) throws FileNotFoundException, IOException, ClassNotFoundException { // Decrypt the cipher text using the private key. ObjectInputStream inputStream = null; inputStream = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE)); final PrivateKey privateKey = (PrivateKey) inputStream.readObject(); final String plainText = decrypt(message, privateKey); return plainText; } /** * Decrypt text using private key. * * @param text :encrypted text * @param key :The private key * @return plain text */ public static String decrypt(byte[] text, PrivateKey key) { byte[] dectyptedText = null; try { // get an RSA cipher object and print the provider final Cipher cipher = Cipher.getInstance(ALGORITHM); // decrypt the text using the private key cipher.init(Cipher.DECRYPT_MODE, key); dectyptedText = cipher.doFinal(text); } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException ex) { System.out.println(ex.getMessage()); } return new String(dectyptedText); } }