(1)非對稱加密是通過兩個密鑰(公鑰-私鑰)來實現對數據的加密和解密的。
(2)RSA可以通過兩種方式加解密:公鑰加密私鑰解密 和 私鑰加密公鑰解密。
(3)缺點:效率比較低,由於RSA 的分組長度太大,爲保證安全性,使運算代價很高,較對稱加密算法慢幾個數量級
二.加解密過程簡析
1.發送者使用私鑰加密數據,接收者使用公鑰解密數據。
2.發送者使用公鑰加密數據,接收者使用私鑰解密數據。
三.CODE SHOW
public class TestRSA {
//公鑰加密、私鑰解密
//私鑰加密、公鑰解密
private static String src="RSA加密算法";
private static String RSATYPE ="RSA";
public static void main(String[] args){
System.out.println("----------RSA-私鑰加密、公鑰解密----------");
jdkRSA1();
System.out.println("----------RSA-公鑰加密、私鑰解密----------");
jdkRSA2();
}
//私鑰加密、公鑰解密
public static void jdkRSA1(){
try {
//初始化密鑰
KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(RSATYPE);
keyPairGenerator.initialize(512);
KeyPair keyPair= keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();
System.out.println("PublicKey:"+Base64.encodeBase64String(rsaPublicKey.getEncoded()));
System.out.println("PrivateKey:"+Base64.encodeBase64String(rsaPrivateKey.getEncoded()));
//私鑰加密
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance(RSATYPE);
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance(RSATYPE);
cipher.init(Cipher.ENCRYPT_MODE, privateKey); //加密模式
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("加密數據:"+Base64.encodeBase64String(result));
//公鑰解密
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance(RSATYPE);
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
cipher = Cipher.getInstance(RSATYPE);
cipher.init(Cipher.DECRYPT_MODE, publicKey); //解密模式
byte[] decryptResult = cipher.doFinal(result);
System.out.println("解密結果:"+ new String(decryptResult));
} catch (Exception e) {
e.printStackTrace();
}
}
//公鑰加密、私鑰解密
public static void jdkRSA2(){
try {
//初始化密鑰
KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance(RSATYPE);
keyPairGenerator.initialize(512);
KeyPair keyPair= keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();
System.out.println("PublicKey:"+Base64.encodeBase64String(rsaPublicKey.getEncoded()));
System.out.println("PrivateKey:"+Base64.encodeBase64String(rsaPrivateKey.getEncoded()));
//公鑰加密
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance(RSATYPE);
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance(RSATYPE);
cipher.init(Cipher.ENCRYPT_MODE, publicKey); //加密模式
byte[] result = cipher.doFinal(src.getBytes());
System.out.println("加密數據:"+Base64.encodeBase64String(result));
//私鑰解密
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
keyFactory = KeyFactory.getInstance(RSATYPE);
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
cipher = Cipher.getInstance(RSATYPE);
cipher.init(Cipher.DECRYPT_MODE, privateKey); //解密模式
byte[] decryptResult = cipher.doFinal(result);
System.out.println("解密結果:"+ new String(decryptResult));
} catch (Exception e) {
e.printStackTrace();
}
}
}
四.輸出結果