常用加密演算法

weixin_34138377發表於2018-10-08

概述

  • 摘要演算法: 不可逆,固定長度,主要用於完整性檢測,資料安全儲存,比如sha1,md5。
  • 對稱加密: 加密解密使用相同的金鑰,但是在金鑰交換的過程中要使用非對稱加密。
  • 非對稱加密:加密解密使用不同的金鑰,但是肯定是速度比較慢。

摘要演算法:

常用的摘要演算法有MD5,SHA1。摘要演算法是一個不可逆過程,就是無論多大資料,經過演算法運算後都是生成固定長度的資料,一般結果使用16進位制進行顯示。
MD5和SHA1的區別:
MD5結果是128位摘要,即16個位元組,用十六進位制表示的話就是32個字元。
SHa1是160位摘要。即20個位元組,用十六進位制表示就是40個字元。
SHa256是256位摘要。即32個位元組,用十六進位制表示就是64個字元。
那麼MD5的速度更快,而SHA1的強度更高。

摘要演算法用途:

  • 訊息完整性:由於每一份資料生成的MD5值不一樣,因此傳送資料時可以將資料和其MD5值一起傳送,然後就可以用MD5驗證資料是否丟失、修改。
  • 安全訪問認證:這是使用了演算法的不可逆性質,(就是無法從MD5值中恢復原資料)對賬號登陸的密碼進行MD5運算然後儲存,這樣可以保證除了使用者之外,即使資料庫管理人員都無法得知使用者的密碼。
  • 數字簽名:這是結合非對稱加密演算法和CA證書的一種使用場景。

摘要演算法程式碼:

In [22]: import hashlib

In [23]: hashlib.md5(b'hello').hexdigest()
Out[23]: '5d41402abc4b2a76b9719d911017c592'

In [24]: hashlib.sha1(b'hello').hexdigest()
Out[24]: 'aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d'

In [25]: hashlib.sha256(b'hello').hexdigest()
Out[25]: '2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824'

In [26]: len('5d41402abc4b2a76b9719d911017c592')
Out[26]: 32

In [27]: len('aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d')
Out[27]: 40

In [28]: len('2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824')
Out[28]: 64

對稱加密

對稱加密演算法只是為了區分非對稱加密演算法。其中鮮明的特點是對稱加密是加密解密使用相同的金鑰,而非對稱加密加密和解密時使用的金鑰不一樣。對於大部分情況我們都使用對稱加密,而對稱加密的金鑰交換時使用非對稱加密,這有效保護金鑰的安全。非對稱加密加密和解密金鑰不同,那麼它的安全性是無疑最高的,但是它加密解密的速度很慢,不適合對大資料加密。而對稱加密加密速度快,因此混合使用最好。

常用的對稱加密演算法有:AES和DES.

  • DES:比較老的演算法,一共有三個引數入口(原文,金鑰,加密模式)。目前基本被廢除,
    而3DES只是DES的一種模式,是以DES為基礎更安全的變形,對資料進行了三次加密,也是被指定為AES的過渡演算法。
    DES廢除的原因一個是金鑰位數太少,在現在的計算能力下,已經無法保證安全,第二個原因是,DES是為硬體加密設計的,對於現在軟體來說計算效率不夠好,第三個原因是,一直有人懷疑DES的S盒中隱藏著後門,而這個後門被美國安全域性掌握。所以提出了AES
  • AES:高階加密標準,新一代標準,加密速度更快,安全性更高(不用說優先選擇)

對稱加密用途

所以一般的HTTPS連線只在第一次握手時使用非對稱加密,通過握手交換對稱加密金鑰,在之後的通訊走對稱加密。

對稱加密程式碼

# pip install crypto

ln [23]: from Crypto.Cipher import AES
In [24]: e = AES.new(b'asdfasdfasdfasdf',AES.MODE_CBC,b'asdfasdfasdfasdf')

In [25]: d = AES.new(b'asdfasdfasdfasdf',AES.MODE_CBC,b'asdfasdfasdfasdf')

In [26]: a = e.encrypt(b'hellohellohello0')

In [27]: a
Out[27]: b"\xf8\x01\x97\xf0\xda'\xa0O\x8d\x0c;\x88#\xdc\xb5l"

In [28]: d.decrypt(a)
Out[28]: b'hellohellohello0'

幾個常用的加密組合

ssh原理

這裡進行一下說明:

  • 首先服務端會通過非對稱加密,產生一個公鑰和私鑰;

  • 在客戶端發起請求時,服務端將公鑰暴露給客戶端,這個公鑰可以被任意暴露;

  • 客戶端在獲取公鑰後,會先產生一個由256位隨機數字組成的會話金鑰,這裡稱為口令;

  • 客戶端通過公鑰將這個口令加密,傳送給伺服器端;

  • 伺服器端通過私鑰進行解密,獲取到通訊口令;

  • 之後,客戶端和服務端的資訊傳遞,都通過這個口令進行對稱的加密。


    2755973-9cd96781ae22b908.png
    18161540_1yaB.png

https 加密原理

第一步,愛麗絲給出協議版本號、一個客戶端生成的隨機數(Client random),以及客戶端支援的加密方法。

第二步,鮑勃確認雙方使用的加密方法,並給出數字證書、以及一個伺服器生成的隨機數(Server random)。

第三步,愛麗絲確認數字證書有效,然後生成一個新的隨機數(Premaster secret),並使用數字證書中的公鑰,加密這個隨機數,發給鮑勃。

第四步,鮑勃使用自己的私鑰,獲取愛麗絲髮來的隨機數(即Premaster secret)。

第五步,愛麗絲和鮑勃根據約定的加密方法,使用前面的三個隨機數,生成"對話金鑰"(session key),用來加密接下來的整個對話過程。

參考

https://blog.csdn.net/u013565368/article/details/53081195
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

相關文章