簡介
對稱加密算法在加密和解密時使用的是同一個祕鑰;而非對稱加密算法需要兩個密鑰來進行加密和解密,這兩個祕鑰是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。
在非對稱加密中使用的主要算法有:RSA、Elgamal、揹包算法、Rabin、D-H、ECC等。
RSA
RSA是基於大數因子分解難題所實現的加密算法,並且RSA不只可以實現加密,還可以在數字簽名中使用。JDK實現的RSA密鑰長度在512~65536之間(64的整數倍),默認爲1024。
RSA 的 java 實現:
public class MyRSA {
private static final String str = "i am guo feng";
public static void main(String[] args) {
try {
//初始化密鑰
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(512);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
//私鑰加密,公鑰解密的加密
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[] result = cipher.doFinal(str.getBytes());
System.out.println(new BigInteger(1, result).toString(16));
//私鑰加密,公鑰解密的解密
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
cipher.init(Cipher.DECRYPT_MODE, publicKey);
result = cipher.doFinal(result);
System.out.println(new String(result));
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印:
8ab11533e870d8ebb8a5f255ca8e0a5bd38807a1989779d77ec6af27d4df0e1d5dea01026ee3cd349c8fa655d3d2be8bd588a5370126cf08278b6947d2111f2e
i am guo feng
公鑰加密,私鑰解密類似,使用場景時序圖如下: