java使用RSA工具進行信息加解密
我們在開發(fā)中需要對用戶敏感數(shù)據(jù)進行加解密,比如密碼
這邊科普一下RSA算法
RSA是非對稱加密算法,與對稱加密算法不同;在對稱加密中,相同的密鑰用于加密和解密數(shù)據(jù),因此密鑰的安全性至關重要;而在RSA非對稱加密中,有兩個密鑰,一個是公鑰,用于加密數(shù)據(jù),另一個是私鑰,用于解密數(shù)據(jù);這意味著公鑰可以公開分發(fā),而私鑰必須保持秘密;
RSA非對稱加密的主要應用包括:
數(shù)據(jù)加密:使用接收者的公鑰加密數(shù)據(jù),只有擁有相應私鑰的接收者才能解密;
數(shù)字簽名:使用發(fā)送者的私鑰對數(shù)據(jù)簽名,接收者可以使用發(fā)送者的公鑰驗證簽名,確保數(shù)據(jù)的完整性和來源的真實性;
密鑰協(xié)商:RSA也用于安全協(xié)議中,如TLS/SSL,用于安全地交換對稱加密密鑰,從而實現(xiàn)保密通信;
非對稱加密算法提供了更高的安全性,因為加密和解密使用不同的密鑰,攻擊者無法從公鑰推導出私鑰;但由于非對稱加密計算成本高昂,通常不用于大規(guī)模數(shù)據(jù)的加密,而是用于安全協(xié)商和數(shù)字簽名等場景
今天就實現(xiàn)了一個RSA工具類,可以很輕松的對數(shù)據(jù)進行加解密
不需要加依賴,代碼如下
public class RSAUtils {
/**
* @param plaintext 要加密的字符串
* @param publicKeyStr 傳入的公鑰,是一個字符串
* @return 加密后的字符串, 以Base64編碼的形式返回
* @throws Exception 異常
* 這個方法接受一個要加密的字符串和一個公鑰字符串,使用公鑰進行加密,然后返回加密后的字符串
*/
public static String encrypt(String plaintext, String publicKeyStr) throws Exception {
PublicKey publicKey = getPublicKeyFromString(publicKeyStr);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes());
return Base64.getEncoder().encodeToString(encryptedBytes);
}
/**
* @param encryptedText 要解密的字符串
* @param privateKeyStr 傳入的私鑰,是一個字符串
* @return 解密后的原始字符串
* @throws Exception 異常
* 這個方法接受一個要解密的字符串和一個私鑰字符串,使用私鑰進行解密,然后返回解密后的原始字符串
*/
public static String decrypt(String encryptedText, String privateKeyStr) throws Exception {
PrivateKey privateKey = getPrivateKeyFromString(privateKeyStr);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
return new String(decryptedBytes);
}
/**
* @return
* @throws Exception
* 隨機生成一個長度為2048的RSA公私鑰對
*/
public static KeyPair generateKeyPair() throws Exception {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
return keyPairGenerator.generateKeyPair();
}
/**
* @param publicKey
* @return
* 拿出剛生成Base64格式的私鑰對的公鑰字符串
*/
public static String publicKeyToString(PublicKey publicKey) {
return Base64.getEncoder().encodeToString(publicKey.getEncoded());
}
/**
* @param privateKey
* @return
* 拿出剛生成Base64格式的私鑰對的私鑰字符串
*/
public static String privateKeyToString(PrivateKey privateKey) {
return Base64.getEncoder().encodeToString(privateKey.getEncoded());
}
/**
* @param publicKeyStr
* @return 公鑰私鑰對象
* @throws Exception
* 將剛拿出的Base64格式的私鑰對的私鑰字符串生成公鑰對象
*/
public static PublicKey getPublicKeyFromString(String publicKeyStr) throws Exception {
byte[] publicKeyBytes = Base64.getDecoder().decode(publicKeyStr);
X509EncodedKeySpec spec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(spec);
}
/**
* @param privateKeyStr
* @return
* @throws Exception
* 將剛拿出的Base64格式的私鑰對的私鑰字符串生成私鑰對象
*/
public static PrivateKey getPrivateKeyFromString(String privateKeyStr) throws Exception {
byte[] privateKeyBytes = Base64.getDecoder().decode(privateKeyStr);
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(spec);
}
public static void main(String[] args) throws Exception {
// 生成RSA密鑰對
KeyPair keyPair = generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 將公鑰和私鑰轉換為字符串
String publicKeyStr = publicKeyToString(publicKey);
String privateKeyStr = privateKeyToString(privateKey);
System.out.println("公鑰: " + publicKeyStr);
System.out.println("私鑰: " + privateKeyStr);
// 加密和解密測試
String plaintext = "大白貓真厲害";
String encryptedText = encrypt(plaintext, publicKeyStr);
System.out.println("加密后的子串: " + encryptedText);
String decryptedText = decrypt(encryptedText, privateKeyStr);
System.out.println("解密后的子串: " + decryptedText);
}
}結果如下

將數(shù)據(jù)用公鑰加密,用私鑰解密,這樣就可以了
到此這篇關于java使用RSA工具進行信息加解密的文章就介紹到這了,更多相關java RSA信息加解密內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
基于spring-boot-maven-plugin插件打包lib文件外置的方法(layout模式為ZIP模式)
Maven是一個插件執(zhí)行框架,所有工作都由插件完成,同時?Maven?基于構建生命周期的核心概念,明確定義了構建和分發(fā)特定工件(項目)的過程,接下來通過本文給大家介紹下基于spring-boot-maven-plugin插件打包lib文件外置(layout模式為ZIP模式),需要的朋友可以參考下2022-09-09
Maven實戰(zhàn)之搭建Maven私服和鏡像的方法(圖文)
本篇文章主要介紹了搭建Maven私服和鏡像的方法(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12

