天天看點

[轉載] 對稱加密與非對稱加密

PostgreSQL , 對稱加密 , 非對稱加密 , Symmetric , ASymmetric , public , private , pgcrypto , 區塊鍊

轉載:

<a href="http://www.cnblogs.com/jfzhu/p/4020928.html">http://www.cnblogs.com/jfzhu/p/4020928.html</a>

對稱加密是最快速、最簡單的一種加密方式,加密(encryption)與解密(decryption)用的是同樣的密鑰(secret key)。對稱加密有很多種算法,由于它效率很高,是以被廣泛使用在很多加密協定的核心當中。

對稱加密通常使用的是相對較小的密鑰,一般小于256 bit。因為密鑰越大,加密越強,但加密與解密的過程越慢。如果你隻用1 bit來做這個密鑰,那黑客們可以先試着用0來解密,不行的話就再用1解;但如果你的密鑰有1 MB大,黑客們可能永遠也無法破解,但加密和解密的過程要花費很長的時間。密鑰的大小既要照顧到安全性,也要照顧到效率,是一個trade-off。

2000年10月2日,美國國家标準與技術研究所(NIST--American National Institute of Standards and Technology)選擇了Rijndael算法作為新的進階加密标準(AES--Advanced Encryption Standard)。.NET中包含了Rijndael算法,類名叫RijndaelManaged,下面舉個例子。

加密過程:

解密過程:

對稱加密的一大缺點是密鑰的管理與配置設定,換句話說,如何把密鑰發送到需要解密你的消息的人的手裡是一個問題。在發送密鑰的過程中,密鑰有很大的風險會被黑客們攔截。現實中通常的做法是将對稱加密的密鑰進行非對稱加密,然後傳送給需要它的人。

非對稱加密為資料的加密與解密提供了一個非常安全的方法,它使用了一對密鑰,公鑰(public key)和私鑰(private key)。私鑰隻能由一方安全保管,不能外洩,而公鑰則可以發給任何請求它的人。非對稱加密使用這對密鑰中的一個進行加密,而解密則需要另一個密鑰。比如,你向銀行請求公鑰,銀行将公鑰發給你,你使用公鑰對消息加密,那麼隻有私鑰的持有人 -- 銀行才能對你的消息解密。與對稱加密不同的是,銀行不需要将私鑰通過網絡發送出去,是以安全性大大提高。

目前最常用的非對稱加密算法是RSA算法,是Rivest, Shamir, 和Adleman于1978年發明,他們那時都是在MIT。.NET中也有RSA算法,請看下面的例子:

雖然非對稱加密很安全,但是和對稱加密比起來,它非常的慢,是以我們還是要用對稱加密來傳送消息,但對稱加密所使用的密鑰我們可以通過非對稱加密的方式發送出去。為了解釋這個過程,請看下面的例子:

(1) Alice需要在銀行的網站做一筆交易,她的浏覽器首先生成了一個随機數作為對稱密鑰。

(2) Alice的浏覽器向銀行的網站請求公鑰。

(3) 銀行将公鑰發送給Alice。

(4) Alice的浏覽器使用銀行的公鑰将自己的對稱密鑰加密。

(5) Alice的浏覽器将加密後的對稱密鑰發送給銀行。

(6) 銀行使用私鑰解密得到Alice浏覽器的對稱密鑰。

(7) Alice與銀行可以使用對稱密鑰來對溝通的内容進行加密與解密了。

[轉載] 對稱加密與非對稱加密

(1) 對稱加密加密與解密使用的是同樣的密鑰,是以速度快,但由于需要将密鑰在網絡傳輸,是以安全性不高。

(2) 非對稱加密使用了一對密鑰,公鑰與私鑰,是以安全性高,但加密與解密速度慢。

(3) 解決的辦法是将對稱加密的密鑰使用非對稱加密的公鑰進行加密,然後發送出去,接收方使用私鑰進行解密得到對稱加密的密鑰,然後雙方可以使用對稱加密來進行溝通。

(4) PostgreSQL pgcrypto插件支援了對稱和非對稱加密。

<a href="https://www.postgresql.org/docs/devel/static/pgcrypto.html">https://www.postgresql.org/docs/devel/static/pgcrypto.html</a>

對稱加密函數: pgp_sym_encrypt()

對稱解密函數: pgp_sym_decrypt()

非對稱加密函數(使用公鑰加密): pgp_pub_encrypt()

非對稱解密函數(使用私鑰解密): pgp_pub_decrypt()

pgcrypto的加解密過程參考:

The functions here implement the encryption part of the OpenPGP (RFC 4880) standard. Supported are both symmetric-key and public-key encryption.

An encrypted PGP message consists of 2 parts, or packets:

Packet containing a session key - either symmetric-key or public-key encrypted.

Packet containing data encrypted with the session key.

When encrypting with a symmetric key (i.e., a password):

1. The given password is hashed using a String2Key (S2K) algorithm. This is rather similar to crypt() algorithms - purposefully slow and with random salt - but it produces a full-length binary key.

2. If a separate session key is requested, a new random key will be generated. Otherwise the S2K key will be used directly as the session key.

3. If the S2K key is to be used directly, then only S2K settings will be put into the session key packet. Otherwise the session key will be encrypted with the S2K key and put into the session key packet.

When encrypting with a public key:

1. A new random session key is generated.

2. It is encrypted using the public key and put into the session key packet.

In either case the data to be encrypted is processed as follows:

1. Optional data-manipulation: compression, conversion to UTF-8, and/or conversion of line-endings.

2. The data is prefixed with a block of random bytes. This is equivalent to using a random IV.

3. An SHA1 hash of the random prefix and data is appended.

4. All this is encrypted with the session key and placed in the data packet.

對稱加密算法在加密和解密時使用的是同一個秘鑰;而非對稱加密算法需要兩個密鑰來進行加密和解密,這兩個秘鑰是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。

1976年,美國學者Dime和Henman為解決資訊公開傳送和密鑰管理問題,提出一種新的密鑰交換協定,允許在不安全的媒體上的通訊雙方交換資訊,安全地達成一緻的密鑰,這就是“公開密鑰系統”。

與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公開密鑰(publickey)和私有密鑰(privatekey)。公開密鑰與私有密鑰是一對,如果用公開密鑰對資料進行加密,隻有用對應的私有密鑰才能解密;如果用私有密鑰對資料進行加密,那麼隻有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的密鑰,是以這種算法叫作非對稱加密算法。

如下圖所示,甲乙之間使用非對稱加密的方式完成了重要資訊的安全傳輸。

[轉載] 對稱加密與非對稱加密

1、乙方生成一對密鑰(公鑰和私鑰)并将公鑰向其它方公開。

2、得到該公鑰的甲方使用該密鑰對機密資訊進行加密後再發送給乙方。

3、乙方再用自己儲存的另一把專用密鑰(私鑰)對加密後的資訊進行解密。乙方隻能用其專用密鑰(私鑰)解密由對應的公鑰加密後的資訊。

在傳輸過程中,即使攻擊者截獲了傳輸的密文,并得到了乙的公鑰,也無法破解密文,因為隻有乙的私鑰才能解密密文。

同樣,如果乙要回複加密資訊給甲,那麼需要甲先公布甲的公鑰給乙用于加密,甲自己儲存甲的私鑰用于解密。

非對稱加密與對稱加密相比,其安全性更好:對稱加密的通信雙方使用相同的秘鑰,如果一方的秘鑰遭洩露,那麼整個通信就會被破解。而非對稱加密使用一對秘鑰,一個用來加密,一個用來解密,而且公鑰是公開的,秘鑰是自己儲存的,不需要像對稱加密那樣在通信之前要先同步秘鑰。

非對稱加密的缺點是加密和解密花費時間長、速度慢,隻适合對少量資料進行加密。

在非對稱加密中使用的主要算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(橢圓曲線加密算法)等。

不同算法的實作機制不同,可參考對應算法的詳細資料。

<a href="https://baike.baidu.com/item/%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86">https://baike.baidu.com/item/%E9%9D%9E%E5%AF%B9%E7%A7%B0%E5%8A%A0%E5%AF%86</a>

繼續閱讀