Created
March 19, 2018 03:24
-
-
Save mobynote/5d897f1338bc81f87742f930d8d9d0bc to your computer and use it in GitHub Desktop.
Use RSA to encrypt and decrypt in Java
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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