1. 程式人生 > >安全加密演算法與資料簽名總結(3)

安全加密演算法與資料簽名總結(3)

非對稱加密      非對稱加密演算法又稱為公開金鑰加密演算法,它需要兩個金鑰,一個稱為公開金鑰,即公鑰;另一個稱為私有金鑰,即私鑰。公鑰和私鑰需要配對使用,如果用公鑰對資料進行加密,只有用對應的私鑰才能進行解密,而如果使用私鑰對資料進行加密,那麼只有用對應的公鑰才能進行解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法稱為非對稱加密演算法。

     非對稱加密演算法實現機密資訊交換的基本過程是:甲方生成一對金鑰並將其中的一把作為公鑰向其他人公開,得到該公鑰的乙方使用金鑰對機密資訊進行加密後再發送給甲方,甲方再使用自己儲存的另一把專用金鑰(即私鑰)對加密後的資訊進行解密。 


非對稱加密演算法的特點:對稱加密演算法中只有一種金鑰,並且是非公開的,如果要解密就得讓對方知道金鑰,所以保證其安全性就是保證金鑰的安全,而一旦金鑰在傳輸過程中洩漏,加密資訊就不再安全。而非對稱加密演算法中包含有兩種金鑰,其中一個是公開的,這樣就不需要像對稱加密演算法那樣,需要傳輸金鑰給對方進行資料加密了,大大地提高了加密演算法的安全性。非對稱加密演算法能夠保證,即使實在獲知公鑰、加密演算法和加密演算法原始碼的情況下,也無法獲得公鑰對應的私鑰,因此也無法對公鑰加密的密文進行解密。
     但是由於非對稱加密演算法的複雜性,使得其加密解密速度遠沒有對稱加密解密的速度快。為了解決加密的速度問題,人們一般採取兩種加密結合使用的辦法,優缺點互補,達到時間和安全的平衡:對稱加密演算法加密速度快,人們用它來加密較長的檔案,然後用非對稱加密演算法來給檔案金鑰加密,解決了對稱加密演算法的金鑰分發問題。      當前使用最為廣泛的非對稱加密演算法非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位數越高,其產生金鑰對及加密、解密的速度越慢,這是基於大素數非對稱加密演算法的缺陷。