安全加密演算法與資料簽名總結(3)
阿新 • • 發佈:2019-02-01
非對稱加密
非對稱加密演算法又稱為公開金鑰加密演算法,它需要兩個金鑰,一個稱為公開金鑰,即公鑰;另一個稱為私有金鑰,即私鑰。公鑰和私鑰需要配對使用,如果用公鑰對資料進行加密,只有用對應的私鑰才能進行解密,而如果使用私鑰對資料進行加密,那麼只有用對應的公鑰才能進行解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法稱為非對稱加密演算法。
但是由於非對稱加密演算法的複雜性,使得其加密解密速度遠沒有對稱加密解密的速度快。為了解決加密的速度問題,人們一般採取兩種加密結合使用的辦法,優缺點互補,達到時間和安全的平衡:對稱加密演算法加密速度快,人們用它來加密較長的檔案,然後用非對稱加密演算法來給檔案金鑰加密,解決了對稱加密演算法的金鑰分發問題。
當前使用最為廣泛的非對稱加密演算法非RSA莫屬。揹包演算法
1、RSA演算法
RSA非對稱加密演算法是目前最有影響力的非對稱加密演算法,他能夠抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰資料加密標準。RSA演算法基於一個十分簡單的數論事實:將兩個大素數相乘十分容易,但反過來想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密金鑰。
Java的RSA演算法的基本使用:
生成公鑰與私鑰:
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(RSA);
非對稱加密演算法實現機密資訊交換的基本過程是:甲方生成一對金鑰並將其中的一把作為公鑰向其他人公開,得到該公鑰的乙方使用金鑰對機密資訊進行加密後再發送給甲方,甲方再使用自己儲存的另一把專用金鑰(即私鑰)對加密後的資訊進行解密。
keyPairGen.initialize(
1024
);//密碼位數
公鑰和私鑰可以通過KeyPairGenerator執行generateKeyPair()後生成金鑰對KeyPair,通過KeyPair.getPublic()和KeyPair.getPrivate()來獲取。如下程式碼:
// 動態生成金鑰對,這是當前最耗時的操作,一般要2s以上。
KeyPair keyPair = keyPairGen.generateKeyPair();
// 公鑰
PublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 私鑰
PrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
byte[]
publicKeyData = publicKey.getEncoded();
byte
[] privateKeyData = publicKey.getEncoded();
// 通過公鑰byte[]將公鑰還原,適用於RSA演算法
public
static
PublicKey getPublicKey(
byte[] keyBytes)
throwsNoSuchAlgorithmException,InvalidKeySpecException {
X509EncodedKeySpec keySpec =
new
X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return
publicKey;
// 通過私鑰byte[]將公鑰還原,適用於RSA演算法
public
static
PrivateKey getPrivateKey(
byte[] keyBytes)
throws
NoSuchAlgorithmException, InvalidKeySpecException {
PKCS8EncodedKeySpec keySpec =
new
PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory =
KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return
privateKey;
使用1024初始化KeyPairGenerator,RSA加密後的密文的長度為1024位,即128個位元組,此時明文的最大長度不能超過117個位元組,超過117個位元組需要使用2048的keysize來初始化KeyPairGenerator,超過245個位元組則需要使用更高位數的keysize。RSA的keysize位數越高,其產生金鑰對及加密、解密的速度越慢,這是基於大素數非對稱加密演算法的缺陷。