Java中使用RSA算法加密

Java中使用RSA算法加密

概述

RSA加密算法是一種非對稱加密算法

RSA加密的方式

  • 使用公鑰加密的數據,利用私鑰進行解密
  • 使用私鑰加密的數據,利用公鑰進行解密 RSA是一對密鑰。分別是公鑰私鑰,這個公鑰和私鑰其實就是一組數字!其二進制位長度可以是1024位或者2048位.長度越長其加密強度越大,目前為止公之於眾的能破解的最大長度為768位密鑰,只要高於768位,相對就比較安全.

RSA加密的缺點

由於RSA算法的原理都是大數計算,使得RSA最快的情況也比對稱加密算法慢上好幾倍。

<code>public class RSAUtils {

public static String RSA_ALGORITHM = "RSA";
public static String UTF8 = "UTF-8";

/**
* 密鑰長度,DSA算法的默認密鑰長度是1024
* 密鑰長度必須是64的倍數,在512到65536位之間
* */
private static final int KEY_SIZE=1024;

public static void main(String[] args) throws Exception {
String password = "1234abcd5678";
KeyStore keys = createKeys();
byte[] publicKey = getPublicKey(keys);
byte[] privateKey = getPrivateKey(keys);
System.out.println("公鑰:"+Base64.encode(publicKey));
System.out.println("私鑰:"+ Base64.encode(privateKey));

byte[] encryptByPublicKey = encryptByPublicKey(password.getBytes(), publicKey);
System.out.println("使用公鑰加密後的數據:"+Base64.encode(encryptByPublicKey));

byte[] decryptByPrivateKey = decryptByPrivateKey(encryptByPublicKey, privateKey);
System.out.println("使用私鑰解密後的數據:"+new String(decryptByPrivateKey));

}

/**
* 生成密鑰對
* @return 密鑰對對象
* @throws NoSuchAlgorithmException
*/
public static KeyStore createKeys() throws NoSuchAlgorithmException {
//KeyPairGenerator用於生成公鑰和私鑰對。密鑰對生成器是使用 getInstance 工廠方法
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM);
keyPairGenerator.initialize(KEY_SIZE);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPrivateKey privateKey = (RSAPrivateKey)keyPair.getPrivate();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
KeyStore keyStore = new KeyStore( publicKey, privateKey);
return keyStore;

}

/**
* 獲取私鑰
* @param keyStore
* @return
*/
private static byte[] getPrivateKey(KeyStore keyStore){
return ((RSAPrivateKey)keyStore.privateKey).getEncoded();
}

/**
* 獲取公鑰
* @param keyStore
* @return
*/
private static byte[] getPublicKey(KeyStore keyStore){
return ((RSAPublicKey)keyStore.publicKey).getEncoded();
}

/**
* 私鑰加密
* @param data 待加密數據
* @param key 密鑰
* @return byte[] 加密數據
* */
public static byte[] encryptByPrivateKey(byte[] data,byte[] key) throws Exception{

//取得私鑰
PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory=KeyFactory.getInstance(RSA_ALGORITHM);
//生成私鑰
PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);
//數據加密
Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}

/**
* 公鑰加密
* @param data
* @param key
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
* @throws NoSuchPaddingException

* @throws BadPaddingException
* @throws IllegalBlockSizeException
* @throws InvalidKeyException
*/
private static byte[] encryptByPublicKey(byte[] data, byte[] key) throws NoSuchAlgorithmException,
InvalidKeySpecException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException {
//實例化密鑰工廠
KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
//初始化公鑰,根據給定的編碼密鑰創建一個新的 X509EncodedKeySpec。
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(key);
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
//數據加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE,publicKey);
return cipher.doFinal(data);
}

/**
* 私鑰解密
* @param data 待解密數據
* @param key 密鑰
* @return byte[] 解密數據
* */
public static byte[] decryptByPrivateKey(byte[] data,byte[] key) throws Exception{
//取得私鑰
PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory=KeyFactory.getInstance(RSA_ALGORITHM);
//生成私鑰
PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);
//數據解密
Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}

/**
* 公鑰解密
* @param data 待解密數據
* @param key 密鑰
* @return byte[] 解密數據
* */
public static byte[] decryptByPublicKey(byte[] data,byte[] key) throws Exception{

//實例化密鑰工廠
KeyFactory keyFactory=KeyFactory.getInstance(RSA_ALGORITHM);
//初始化公鑰
//密鑰材料轉換
X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);
//產生公鑰
PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);
//數據解密
Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, pubKey);
return cipher.doFinal(data);
}


//定義密鑰類
@Data
@AllArgsConstructor
public static class KeyStore{
private Object publicKey;
private Object privateKey;
}
}/<code>

測試結果:

<code>公鑰:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdnS/LflJjuj4M9V63SPe3YUx0uFD/oVoPRwG2
p1HXNSp6x+h7ImVAns9Bx5aKKthTH6V70W0TAdreCwS7WyzakvnHu4zWhGX77JM7/dEgdU5LSK8s
I7YLz4bKhCpjBQGXJiKj/3InDPidWzw6w53Ce207HUzrYgR71rM3/OfewwIDAQAB
私鑰:MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJ2dL8t+UmO6Pgz1XrdI97dhTHS4
UP+hWg9HAbanUdc1KnrH6HsiZUCez0HHlooq2FMfpXvRbRMB2t4LBLtbLNqS+ce7jNaEZfvskzv9
0SB1TktIrywjtgvPhsqEKmMFAZcmIqP/cicM+J1bPDrDncJ7bTsdTOtiBHvWszf8597DAgMBAAEC
gYBb6uuQtV6/IkJFtGNEaJ1uqKO5/jPeoO6wsixhpTqpUywu5p7CENET2onsRsWYVlxKPc54Yy5F
Q3OswqhDy2xgL5AFcCboDHCipVojA/6lQsWnvQL1Go/NkAf88YmIMvcNV6TrlBW3TWOr9D6+/LUW
Hjbmr744bE7eRODAV/PVYQJBAOZe0uIm5mXm+eoyE8BT7SVu7XWeQZNtDNvD0a6h4QxQA+fkftVP
9icAfRxZEi3WH8aCtUJJkDdzo3u11XdPQF8CQQCvJjBoQI+5l4dlBfsN3jvLr9H6U1Hx20EF47t/
FbfSEHHJ0LQ6frVyEqQr2MSuL+RhE4ko+PWpB62meFpmKuwdAkEAxI73xDqIrz3K0wZzT9DMMPpa
5dZoAVA0fnawPB6nFIhZLM0LYxpc3p5OIZfmKPHgHtJ7sdlukcG7JdzaDHi0ZQJAe6pqKWHUWQUd
av3zChKsg5+rkaS8yhi163OlEhECjkZgIU/DwT1v3ZA97FuMWzSjestxX8WQpn0uZci6g0KxHQJA
BA1IIAnT7LlLHDWDXAH3B4U60GQZh7BbfF7m3nQvttLeUOc2hpklN3Rr3hpKRDghX5m5iZeiIPri
nPq25FdzAA==
使用公鑰加密後的數據:i9YbxGll3KUQNsNF71NtXKCgZhZd7tpJjTIXW1sg3avxOv0tZ84UO9eheWwBTF4ptOW4tjXKxva7
H2cRSkMknaZ0zGI7cGm/TANevR5cdYVdxa7IBIevDRvj+Lnklo8HQg0QgSqLAQeJ1d38lQkcXoXO
i5Qdol2RFTkC7zIPKdc=
使用私鑰解密後的數據:1234abcd5678/<code>


分享到:


相關文章: