淺析RSA公鑰密碼以及使用Java自帶API實現RSA的密鑰生成和加解密

RSA是目前最流行的非對稱密碼,目前普遍應用在數字簽名,數字證書上。java

那麼什麼是非對稱密碼呢?就是給明文加密的密鑰和給密文解密的密鑰是不同的。其中,對外暴露的是公鑰,本身保留的是私鑰,若是用公鑰加密,就只能用私鑰解密,若是用私鑰加密就只能用公鑰解密。git

因此實現非對稱密碼,須要生成公私鑰對。而因爲RSA的非對稱密碼原理是基於大素數因子的難分解性,因此每次在生成公私鑰對的時候在一開始都會隨機產生兩個素數p,q。因此每次生成的公私鑰對也是不相同的。算法


接下來咱們就開始用Java自帶的API完成RSA的公私鑰對生成和加密解密操做。數組

在Java中,對於非對稱密碼操做的一個類是:KeyPairGenerator,密鑰對生成器類,這個類在java.security.KeyPairGenerator包下。這個類在產生對象的時候須要往構造方法中傳入一個String的值,告訴密鑰對生成器生成的是哪一中密碼的密鑰對。工具

//使用RSA算法得到密鑰對生成器對象keyPairGenerator
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
//設置密鑰長度爲1024
keyPairGenerator.initialize(1024);
//生成密鑰對
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//獲取公鑰
Key publicKey = keyPair.getPublic();
//獲取私鑰
Key privateKey = keyPair.getPrivate();

獲取到公私鑰對的時候,爲了方便後續操做,咱們通常將這兩個key對象持久化到本地保存起來。ui

在Java中提供了Cipher加密解密器來實現加解密操做,這個類在import javax.crypto.Cipher包下。在產生這個加密解密器對象的時候,須要在他的構造方法中傳倆個值,一個是功能,一個是算法種類。功能就是說告訴他接下來這個對象是須要作加密操做仍是解密操做,算法種類就是告訴他使用的加密算法。編碼

//獲取一個加密算法爲RSA的加解密器對象cipher。
Cipher cipher = Cipher.getInstance("RSA");
//設置爲加密模式,並將公鑰給cipher。
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
//得到密文
byte[] secret = cipher.doFinal(str.getBytes());
//進行Base64編碼並返回
return new BASE64Encoder().encode(secret);

一樣的,解密算法也是使用Cilpher。加密

Cipher cipher = Cipher.getInstance("RSA");
//傳遞私鑰,設置爲解密模式。
cipher.init(Cipher.DECRYPT_MODE, privateKey);
//解密器解密由Base64解碼後的密文,得到明文字節數組
byte[] b = cipher.doFinal(new BASE64Decoder().decodeBuffer(secret));
//轉換成字符串
return new String(b);

以上就是使用Java自帶API完成RSA密鑰對生成和加密解密的方法。.net

============================================================code

我已經把這個RSA加密的工具類放到了GitOSC上,你們須要的話能夠下下來看。

文中RSA工具類

相關文章
相關標籤/搜索