非對稱加密
- 非對稱加密算法又稱現(xiàn)代加密算法。非對稱加密是計算機通信安全的基石,保證了加密數(shù)據(jù)不會被破解。
- 與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公開密鑰(publickey) 和私有密(privatekey)
- 公開密鑰和私有密鑰是一對。如果用公開密鑰對數(shù)據(jù)進行加密,只有用對應的私有密鑰才能解密。如果用私有密鑰對數(shù)據(jù)進行加密,只有用對應的公開密鑰才能解密。
- 因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。
- 特點
- 加密和解密使用不同的密鑰
- 如果使用私鑰加密, 只能使用公鑰解密
- 如果使用公鑰加密, 只能使用私鑰解密
- 處理數(shù)據(jù)的速度較慢, 因為安全級別高
- 示例
- 首先生成密鑰對, 公鑰為(5,14), 私鑰為(11,14),A希望將原文2發(fā)送給B
- A使用公鑰加密數(shù)據(jù). 2的5次方mod 14 = 4 , 將密文4發(fā)送給B
- B使用私鑰解密數(shù)據(jù). 4的11次方mod14 = 2, 得到原文2
1 常見算法
- RSA
- RSA是1977年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。
- RSA公開密鑰密碼體制是一種使用不同的加密密鑰與解密密鑰。
- RSA能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊,已被ISO推薦為公鑰數(shù)據(jù)加密標準。只有短的RSA鑰匙才可能被強力方式解破。世界上還沒有任何可靠的攻擊RSA算法的方式。只要其鑰匙的長度足夠長,用RSA加密的信息實際上是不能被解破的。
- RSA算法基于一個十分簡單的數(shù)論事實:將兩個大質數(shù)相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。
- RSA在線工具
- 希望深入學習RSA的小伙伴,請移步公開密鑰加密之RSA算法
- ECC(Elliptic curve cryptography)
- 橢圓曲線密碼學(ECC),一種建立公開密鑰加密的演算法,基于橢圓曲線數(shù)學。橢圓曲線在密碼學中的使用是在1985年由Neal Koblitz和Victor Miller分別獨立提出的。
- 希望深入學習ECC的小伙伴,請移步ECC橢圓曲線加解密原理詳解(配圖)
2 生成公鑰和私鑰
public static void main(String[] args) throws NoSuchAlgorithmException {
// 加密算法
String algorithm = "RSA";
// 創(chuàng)建密鑰對生成器對象
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
// 生成密鑰對
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 生成私鑰
PrivateKey privateKey = keyPair.getPrivate();
// 生成公鑰
PublicKey publicKey = keyPair.getPublic();
// 獲取私鑰字節(jié)數(shù)組
byte[] privateKeyEncoded = privateKey.getEncoded();
// 獲取公鑰字節(jié)數(shù)組
byte[] publicKeyEncoded = publicKey.getEncoded();
// 對公私鑰進行base64編碼
String privateKeyString = Base64.encodeBase64String(privateKeyEncoded);
String publicKeyString = Base64.encodeBase64String(publicKeyEncoded);
// 打印私鑰
System.out.println("私鑰:"+privateKeyString);
// 打印公鑰
System.out.println("共鑰:"+publicKeyString);
}
私鑰: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
共鑰:MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAuoaZDELPg9F3n0zREqKM9wmrs/E6ZezWhypt1/Ga6izv0HwqltmaKM5ZFxYu58zcD0AXxL9VY
F4Yk+VTsvq9uC3HN6GpDbUll2LgaF62iV3aROxKlSnT0mW8c09zoUkNEKl9xdmNfXrs+UQfIw/RgRCflR05wSiKboF+Iqwlo9U2CmwfFxmx/OcHFhuLh9pJ+
NQ6jPCD8PU0w6TKMluwRB0obpTkvuxtTXe667Wn9LQspPW1XZrPTrvicylkXwkBcbhB9bFr4o1uEfNzkGH6RmtpLyYIlED9DvU0ApqdPiJlok4Vn2G4qqxci
VcpyA5KPJhV11qJZnX6tZsrjYNdurFHtcD5mYbSAufeYafeuSvG8E4koPMHrklzpAFyewq+DiwjopkqweKnS7nqowITHEFrh12xmQqp627ThZs8cUTR/E1o4
cj77V5XX+2ytAkGkrhNpHwIu2CsAcMyPIgG1aJmIexHVbzB6v2JcBD4PA6nLgCTg2qnJ2bMu6JirmVnAgMBAAE=
3 私鑰加密
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
String input = "國泰民安";
// 加密算法
String algorithm = "RSA";
// 創(chuàng)建密鑰對生成器對象
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
// 生成密鑰對
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 生成私鑰
PrivateKey privateKey = keyPair.getPrivate();
// 生成公鑰
PublicKey publicKey = keyPair.getPublic();
// 創(chuàng)建加密對象
// 參數(shù)表示加密算法
Cipher cipher = Cipher.getInstance(algorithm);
// 初始化加密
// 第一個參數(shù):加密的模式
// 第二個參數(shù):使用私鑰進行加密
cipher.init(Cipher.ENCRYPT_MODE,privateKey);
// 私鑰加密
byte[] bytes = cipher.doFinal(input.getBytes());
System.out.println(Base64.encodeBase64String(bytes));
}
gjfiD1F+DOFk2IHqrTWSKe+8qGLCihNuu+RrZY6CKji0H56RUhSL3P5fW2X3FXpCrY+CMsGg16HfmR3boeX1qY4e0NJU0JtE1Ch4uERigH1eM/MUCUaFaVI4
9roDAcqbz0v+lnsX41mOCQ4YSd742XoIg7cJX1GcsHhkXDF3JCM/fDxdHYR63ApmSpzr+qfoelntnc+Xah90i3UR/PPiEZ6/6JWz7mU5DK/X5IVnqgGObNCl
syH7tWcwl34IcrszFvK4ovtxeYVQken7IHgW8LMCxWGXWyDThC+9A/d9AV9vlLLuzZcYEvRYMS5BzZqr9gzdrgYE1hsRouFQ0yyuOUoVAbaqAjqhPRTTIj0E
QUl2PpB7hi561x/j/58w9dsoI3gKp/G6SBl40yyuxbm5z/RGYxjeZhyIC4Lm/ddpCQpJ5qzZ/WX6N9fSqjwQLaHSQpgmsy5zdZRkZchxknw8LgONSzObwA5/
F561oXgtHWD44+SzZHoOGY3hDSU3oKMT
4 私鑰加密 公鑰解密
- 私鑰加密,只能公鑰解密
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
String input = "國泰民安";
System.out.println(input);
// 加密算法
String algorithm = "RSA";
// 創(chuàng)建密鑰對生成器對象
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
// 生成密鑰對
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 生成私鑰
PrivateKey privateKey = keyPair.getPrivate();
// 生成公鑰
PublicKey publicKey = keyPair.getPublic();
// 創(chuàng)建加密對象
// 參數(shù)表示加密算法
Cipher cipher = Cipher.getInstance(algorithm);
// 初始化加密
// 第一個參數(shù):加密的模式
// 第二個參數(shù):使用私鑰進行加密
cipher.init(Cipher.ENCRYPT_MODE,privateKey);
// 私鑰加密
byte[] bytes = cipher.doFinal(input.getBytes());
System.out.println(Base64.encodeBase64String(bytes));
// 私鑰進行解密
cipher.init(Cipher.DECRYPT_MODE,publicKey);
// 對密文進行解密,不需要使用base64,因為原文不會亂碼
byte[] bytes1 = cipher.doFinal(bytes);
System.out.println(new String(bytes1));
}
國泰民安
VfUXV9TiXxeRx5/gq13GtsNm76BSw/63e1SaOI1szLnb9DjE4hfCmim0qqqOQYSp5fyE45694Dlj37p7/+eu7gMAuJN5PYZfN7bYQZ+ZIJeXCiEO/IWXFzQW
yIgoyqUjZ1i6ja0yfHhY0FXkBBJCr2SNwBiMW1lEQav0UE/i05Dj3+OOKDTKNbIgMLcsZfM3WPSNJWJq7bthnjO0KTPSdG5Dl+/eJictaSGTk0it5+D1l4G6
N8CfTfshG9c3vWbfmqgmU8GaA5Iqo1eHINPpS9SZOoAAokGEzmDkx2VJQiQO3GELIdcCGvyWvZIm7PlAV8EYzxTQiHRSuwiCJyGGABC+I9iEFwDaZwYCTAh7
roSwtpt1ax/KgQfbhv8vNE+/3ADnnvFgzDX6LfWuSl0vhclh9kl0ECnIICJd6dxKwCAZkctiwdOoPrbGnK4lWXbeTbdkxBpdw9LcnWMkCuCVy53k47OjB3S+
t+Uktr2snJAjJDYG4ZZmrQpEIj17zLKZ
國泰民安
5 公鑰和私鑰的保存和讀取
5.1 保存公鑰和私鑰
public static void main(String[] args) throws Exception {
String input = "硅谷";
// 加密算法
String algorithm = "RSA";
//生成密鑰對并保存在本地文件中
generateKeyToFile(algorithm, "a.pub", "a.pri");
}
/**
* 生成密鑰對并保存在本地文件中
*
* @param algorithm : 算法
* @param pubPath : 公鑰保存路徑
* @param priPath : 私鑰保存路徑
* @throws Exception
*/
private static void generateKeyToFile(String algorithm, String pubPath, String priPath) throws Exception {
// 獲取密鑰對生成器
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
// 獲取密鑰對
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 獲取公鑰
PublicKey publicKey = keyPair.getPublic();
// 獲取私鑰
PrivateKey privateKey = keyPair.getPrivate();
// 獲取byte數(shù)組
byte[] publicKeyEncoded = publicKey.getEncoded();
byte[] privateKeyEncoded = privateKey.getEncoded();
// 進行Base64編碼
String publicKeyString = Base64.encodeBase64String(publicKeyEncoded);
String privateKeyString = Base64.encodeBase64String(privateKeyEncoded);
// 保存文件
FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));
FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));
}
5.2 讀取公鑰和私鑰
public static void main(String[] args) throws Exception {
String input = "明德新民,止于至善";
// 加密算法
String algorithm = "RSA";
//生成密鑰對并保存在本地文件中
generateKeyToFile(algorithm, "a.pub", "a.pri");
//讀取私鑰
PrivateKey privateKey = getPrivateKey("a.pri", algorithm);
//讀取公鑰
PublicKey publicKey = getPublicKey("a.pub", algorithm);
String s = encryptRSA(algorithm, privateKey, input);
String res = decryptRSA(algorithm, publicKey, s);
System.out.println(res);
}
/**
* 解密數(shù)據(jù)
*
* @param algorithm : 算法
* @param encrypted : 密文
* @param key : 密鑰
* @return : 原文
*/
public static String decryptRSA(String algorithm,Key key,String encrypted) throws Exception{
// 創(chuàng)建加密對象
// 參數(shù)表示加密算法
Cipher cipher = Cipher.getInstance(algorithm);
// 私鑰進行解密
cipher.init(Cipher.DECRYPT_MODE,key);
// 由于密文進行了Base64編碼, 在這里需要進行解碼
byte[] decode = Base64.decodeBase64(encrypted);
// 對密文進行解密,不需要使用base64,因為原文不會亂碼
byte[] bytes1 = cipher.doFinal(decode);
return new String(bytes1);
}
/**
* 使用密鑰加密數(shù)據(jù)
*
* @param algorithm : 算法
* @param input : 原文
* @param key : 密鑰
* @return : 密文
*/
public static String encryptRSA(String algorithm,Key key,String input) throws Exception{
// 創(chuàng)建加密對象
// 參數(shù)表示加密算法
Cipher cipher = Cipher.getInstance(algorithm);
// 初始化加密
// 第一個參數(shù):加密的模式
// 第二個參數(shù):使用私鑰進行加密
cipher.init(Cipher.ENCRYPT_MODE,key);
// 私鑰加密
byte[] bytes = cipher.doFinal(input.getBytes());
// 對密文進行Base64編碼
return Base64.encodeBase64String(bytes);
}
public static PublicKey getPublicKey(String pulickPath,String algorithm) throws Exception{
// 將文件內容轉為字符串
String publicKeyString = FileUtils.readFileToString(new File(pulickPath), Charset.defaultCharset());
// 獲取密鑰工廠
KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
// 構建密鑰規(guī)范 進行Base64解碼
X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.decodeBase64(publicKeyString));
// 生成公鑰
return keyFactory.generatePublic(spec);
}
/**
* 生成密鑰對并保存在本地文件中
*
* @param algorithm : 算法
* @param pubPath : 公鑰保存路徑
* @param priPath : 私鑰保存路徑
* @throws Exception
*/
private static void generateKeyToFile(String algorithm, String pubPath, String priPath) throws Exception {
// 獲取密鑰對生成器
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
// 獲取密鑰對
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 獲取公鑰
PublicKey publicKey = keyPair.getPublic();
// 獲取私鑰
PrivateKey privateKey = keyPair.getPrivate();
// 獲取byte數(shù)組
byte[] publicKeyEncoded = publicKey.getEncoded();
byte[] privateKeyEncoded = privateKey.getEncoded();
// 進行Base64編碼
String publicKeyString = Base64.encodeBase64String(publicKeyEncoded);
String privateKeyString = Base64.encodeBase64String(privateKeyEncoded);
// 保存文件
FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));
FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));
}
public static PrivateKey getPrivateKey(String priPath,String algorithm) throws Exception{
// 將文件內容轉為字符串
String privateKeyString = FileUtils.readFileToString(new File(priPath), Charset.defaultCharset());
// 獲取密鑰工廠
KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
// 構建密鑰規(guī)范 進行Base64解碼
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKeyString));
// 生成私鑰
return keyFactory.generatePrivate(spec);
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-435377.html
文章來源:http://www.zghlxwxcb.cn/news/detail-435377.html
到了這里,關于密碼學【java】初探究加密方式之非對稱加密的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!