Skip to content

Instantly share code, notes, and snippets.

@mobynote
Created March 19, 2018 03:24
Show Gist options
  • Save mobynote/5d897f1338bc81f87742f930d8d9d0bc to your computer and use it in GitHub Desktop.
Save mobynote/5d897f1338bc81f87742f930d8d9d0bc to your computer and use it in GitHub Desktop.
Use RSA to encrypt and decrypt in Java
@Test
public void encrypt_decrypt_jdk_rsa() throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException {
String source = "Hala Madrid!";
// 1. init secureKey
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
System.out.println("public: " + Base64.encodeBase64String(rsaPublicKey.getEncoded()));
System.out.println("private: " + Base64.encodeBase64String(rsaPrivateKey.getEncoded()));
// 2. privateKey encryption, publicKey decryption - encrypt
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
byte[] cipherTextBytes = cipher.doFinal(source.getBytes());
System.out.println("privateKey encryption: " + Base64.encodeBase64String(cipherTextBytes));
// 3. privateKey encryption, publicKey decryption - decrypt
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, publicKey);
byte[] plainTextBytes = cipher.doFinal(cipherTextBytes);
System.out.println("publicKey decryption: " + new String(plainTextBytes));
// 4. privateKey decryption, publicKey encryption - encrypt
x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipherTextBytes = cipher.doFinal(source.getBytes());
System.out.println("publicKey encryption: " + Base64.encodeBase64String(cipherTextBytes));
// 5. privateKey decryption, publicKey encryption - decrypt
pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
plainTextBytes = cipher.doFinal(cipherTextBytes);
System.out.println("privateKey decryption: " + new String(plainTextBytes));
}
@Test
public void sign_jdk_rsa() throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException {
String source = "Hala Madrid!";
// 1. init security key
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
// 3. sign
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Signature signature = Signature.getInstance("MD5withRSA");
signature.initSign(privateKey);
signature.update(source.getBytes());
byte[] signSource = signature.sign();
System.out.println("jdk rsa sign: " + Hex.encodeHexString(signSource));
// 3. verify
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
signature = Signature.getInstance("MD5withRSA");
signature.initVerify(publicKey);
signature.update(source.getBytes());
boolean verify = signature.verify(signSource);
System.out.println("jdk rsa sign verify: " + verify);
}
@Test
public void sign_jdk_ecdsa() throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException {
String source = "Hala Madrid!";
// 1. init security key
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
keyPairGenerator.initialize(256);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
ECPublicKey ecPublicKey = (ECPublicKey) keyPair.getPublic();
ECPrivateKey ecPrivateKey = (ECPrivateKey) keyPair.getPrivate();
// 2. sign
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("EC");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Signature signature = Signature.getInstance("SHA1withECDSA");
signature.initSign(privateKey);
signature.update(source.getBytes());
byte[] signBytes = signature.sign();
System.out.println("jdk ecdsa sign: " + Hex.encodeHexString(signBytes));
// 3. verify
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("EC");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
signature = Signature.getInstance("SHA1withECDSA");
signature.initVerify(publicKey);
signature.update(source.getBytes());
boolean verify = signature.verify(signBytes);
System.out.println("jdk ecdsa verify: " + verify);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment