RSA加解密应用
1:获取秘钥对
/**
* 获取秘钥对
* @return 秘钥map
*/
public static Map<String, byte[]> generateKeyBytes() {
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);
keyPairGenerator.initialize(KEY_SIZE);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
Map<String, byte[]> keyMap = new HashMap<String, byte[]>();
keyMap.put(PUBLIC_KEY, publicKey.getEncoded());
keyMap.put(PRIVATE_KEY, privateKey.getEncoded());
return keyMap;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
2:还原公钥
/**
* 还原公钥, X509EncodedKeySpec 用于构建公钥的规范
* @param keyBytes
* @return
*/
public static PublicKey restorePublicKey(byte[] keyBytes) {
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);
try {
KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec);
return publicKey;
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
e.printStackTrace();
}
return null;
}
3:还原私钥
/**
* 还原私钥, PKCS8EncodedKeySpec 用于构建私钥的规范
* @param keyBytes
* @return
*/
public static PrivateKey restorePrivateKey(byte[] keyBytes) {
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
try {
KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
PrivateKey privateKey = factory.generatePrivate(pkcs8EncodedKeySpec);
return privateKey;
} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
e.printStackTrace();
}
return null;
}
4:加密
/**
* 加密,三步走
* @param key 公钥
* @param plainText 私钥
* @return
*/
public static byte[] RSAEncode(PublicKey key, byte[] plainText) {
try {
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(plainText);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException
| IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
return null;
}
5:解密
/**
* 解密,三步走
* @param key
* @param encodedText
* @return
*/
public static String RSADecode(PrivateKey key, byte[] encodedText) {
try {
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key);
return new String(cipher.doFinal(encodedText));
| IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
return null;
}
6:测试
public static final String PUBLIC_KEY = "publicKey";
public static final String PRIVATE_KEY = "privateKey";
public static final int KEY_SIZE = 1024;
public static final String PLAIN_TEXT = "hello word";
@Test
public void testRSA(){
Map<String, byte[]> keyMap = generateKeyBytes();
PublicKey publicKey = restorePublicKey(keyMap.get(PUBLIC_KEY));
System.out.println("public key: " + Base64.encode(publicKey.getEncoded()));
byte[] encodedText = RSAEncode(publicKey, PLAIN_TEXT.getBytes());
System.out.println("RSA encoded: " + Base64.encode(encodedText));
PrivateKey privateKey = restorePrivateKey(keyMap.get(PRIVATE_KEY));
System.out.println("private key: " + Base64.encode(publicKey.getEncoded()));
System.out.println("RSA decoded: " + RSADecode(privateKey, encodedText));
}
7:测试结果
public key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzMfk9znh1dIMREw/uv08A74RqsDQFjGb2v5FI
ACHYYFHNSpriBL1B5TEQEay24kEucqF3ItmVWRz3YfgpMdYPwmaWAkPsp/sMiQTnfXJ6x2clSNGT
I4BecMIcc0mtvMRufgd/hDgdFd+YTXUGELB+FSyZYqqOhdEaZxk0+BXXDwIDAQAB
RSA encoded: DtXp9oJ42XNfEPkR5JsdhZceGAVVWpkixgL34CjXTpFjO7gO2OQfmr3v0kV68kgCjJ8MftBYwDM7
1cLcwwAYKF9fMyTsIt+JQBp3i7zk4QUbG6u1zzKBH6f5erGVNKQIoZ3//++0YkUpAmipUDqVtu73
Uha0gF7xyT2KoQzR4AQ=
private key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzMfk9znh1dIMREw/uv08A74RqsDQFjGb2v5FI
ACHYYFHNSpriBL1B5TEQEay24kEucqF3ItmVWRz3YfgpMdYPwmaWAkPsp/sMiQTnfXJ6x2clSNGT
I4BecMIcc0mtvMRufgd/hDgdFd+YTXUGELB+FSyZYqqOhdEaZxk0+BXXDwIDAQAB
RSA decoded: hello word