1.1 基礎知識點
- 知識點大綱介紹
密碼的基礎概念
對稱加密
非對稱加密
單向雜湊函式
雜湊函式
訊息認證碼
數字簽名
證照
ssl/tls - https
- 為什麼要加密, 以及解決方案
保證資料安全
- 加密三要素
明文/密文
祕鑰
定長的字串
需要根據加密演算法確定其長度
演算法
加密演算法
解密演算法
加密演算法和解密演算法有可能是互逆的, 也有可能相同
- 常用的兩種加密方式
對稱加密
祕鑰: 加密解密使用的是同一個祕鑰, 祕鑰有一個
特點
雙方向保證機密性
加密效率高, 適合加密大資料, 大檔案
加密強度不高, 相對於非對稱加密
非對稱加密
祕鑰: 加密解密使用的不同的祕鑰, 祕鑰有兩個, 需要使用祕鑰生成演算法, 得到金鑰對
公鑰 - 可以公開的祕鑰
公鑰加密資料, 解密需要使用私鑰
私鑰 - 需要妥善保管的祕鑰, 知道的人越少越好
私鑰加密, 公鑰解密
特點:
資料的機密性只能單方向保證
加密效率低, 適合加密少量資料
加密強度高, 相對於對稱加密
- 凱撒密碼
愷撒密碼(Caesar cipher)是一種相傳尤利烏斯·愷撒曾使用過的密碼。愷撒於公元前100年左右誕生於古羅馬,是一位著名的軍事統帥。
愷撤密碼是通過將明文中所使用的字母表按照一定的字數“平移”來進行加密的。
凱撒密碼加解密公式
加密
E2(x) = (x + n) mod 26
- 解密
E2(x) = (x - n) mod 26
凱撒密碼中的加密三要素
明文/密文
明文: 小寫字母表中的資料
密文: 大寫字母表中的資料
祕鑰
按照上圖祕鑰為3
演算法
加密: +3
解密: -3
凱撒密碼的安全性
不安全
- 密碼資訊保安常識
不要使用保密的密碼演算法(普通公司和個人)
使用低強度的密碼比不進行任何加密更危險
任何密碼總有一天都會被破解
密碼只是資訊保安的一部分
- 密碼資訊威脅
思考:資訊保安處理必須要具備哪些特性?
1.2 對稱加密
以分組為單位進行處理的密碼演算法稱為分組密碼(blockcipher)
- 編碼的概念
G = 1024m
m = 1024kbyte
byte = 8bit
bit 0/1
計算機的操作物件並不是文字,而是由0和1排列而成的位元序列。
將現實世界中的東西對映為位元序列的操作稱為編碼(encoding)。
加密 -> 編碼
解密 -> 解碼
hello world -> 位元序列
h -> int 104 ->
- DES – Data Encryption Standard
現在使用DES方式加密,資料還安全嗎?
不安全, 已經被破解了
是不是分組密碼?
是, 先對資料進行分組, 然後在加密或解密
DES的分組長度?
8byte == 64bit
DES的祕鑰長度?
56bit祕鑰長度+8bit錯誤檢測標誌位 = 64bit == 8byte
- 3DES – Triple-DES
3DES安全嗎?
安全, 但是效率低
演算法描述?
進行了3次des加密
是不是分組密碼?
是
3DES分組長度?
8位元組
3DES祕鑰長度?
24位元組, 在演算法內部會被平均分成3份
3DES加密過程?
祕鑰1 -> 加密, 祕鑰2 -> 解密, 祕鑰3 -> 加密
3DES解密過程?
祕鑰1 -> 解密, 祕鑰2 -> 加密, 祕鑰3 -> 解密
- AES – Advanced Encryption Standard
AES安全嗎?
安全, 效率高, 推薦使用的
是不是分組密碼?
是
AES分組長度?
128bit = 16位元組
AES祕鑰長度?
128bit = 16位元組
192bit = 24位元組
256bit = 32位元組
go中的祕鑰長度只能是16位元組
1.3 分組密碼的模式
- 按位異或
第一步需要將資料轉換為二進位制
按位異或操作符: ^
兩個標誌位進行按位異或操作:
相同為0, 不同為1
舉例:
1 0 0 0 ----> 8
1 0 1 1 ----> 11
-----------------------按位異或一次
0 0 1 1 ----> 3
1 0 1 1 ----> 11
-----------------------按位異或兩側
1 0 0 0 -----> 8
=================================
a = 8
b = 11
a 和 b按位異或1次 ==> 加密
得到的結果再次和 b 按位異或 ===> 解密
- ECB - Electronic Code Book, 電子密碼本模式
特點: 簡單, 效率高, 密文有規律, 容易被破解
最後一個明文分組必須要填充
des/3des -> 最後一個分組填充滿8位元組
aes -> 最後一個分組填充滿16位元組
不需要初始化向量
- CBC - Cipher Block Chaining, 密碼塊鏈模式
特點: 密文沒有規律, 經常使用的加密方式
最後一個明文分組需要填充
des/3des -> 最後一個分組填充滿8位元組
aes -> 最後一個分組填充滿16位元組
需要一個初始化向量 - 一個陣列
陣列的長度: 與明文分組相等
資料來源: 負責加密的人的提供的
加解密使用的初始化向量值必須相同
- CFB - Cipher FeedBack, 密文反饋模式
特點: 密文沒有規律, 明文分組是和一個資料流進行的按位異或操作, 最終生成了密文
需要一個初始化向量 - 一個陣列
陣列的長度: 與明文分組相等
資料來源: 負責加密的人的提供的
加解密使用的初始化向量值必須相同
不需要填充
- OFB - Output-Feedback, 輸出反饋模式
特點: 密文沒有規律, 明文分組是和一個資料流進行的按位異或操作, 最終生成了密文
需要一個初始化向量 - 一個陣列
陣列的長度: 與明文分組相等
資料來源: 負責加密的人的提供的
加解密使用的初始化向量值必須相同
不需要填充
- CTR - CounTeR, 計數器模式
特點: 密文沒有規律, 明文分組是和一個資料流進行的按位異或操作, 最終生成了密文
不需要初始化向量
go介面中的iv可以理解為隨機數種子, iv的長度 == 明文分組的長度
不需要填充
- 最後一個明文分組的填充
使用cbc, ecb需要填充
要求:
明文分組中進行了填充, 然後加密
解密密文得到明文, 需要把填充的位元組刪除
使用 ofb, cfb, ctr不需要填充
- 初始化向量 - IV
ecb, ctr模式不需要初始化向量
cbc, ofc, cfb需要初始化向量
初始化向量的長度
des/3des -> 8位元組
aes -> 16位元組
加解密使用的初始化向量相同
1.4 對稱加密在go中的實現
des
3des
aes
# 加密流程:
1\. 建立一個底層使用des/3des/aes的密碼介面
"crypto/des"
func NewCipher(key []byte) (cipher.Block, error) # -- des
func NewTripleDESCipher(key []byte) (cipher.Block, error) # -- 3des
"crypto/aes"
func NewCipher(key []byte) (cipher.Block, error) # == aes
2\. 如果使用的是cbc/ecb分組模式需要對明文分組進行填充
3\. 建立一個密碼分組模式的介面物件
- cbc
func NewCBCEncrypter(b Block, iv []byte) BlockMode # 加密
- cfb
func NewCFBEncrypter(block Block, iv []byte) Stream # 加密
- ofb
- ctr
4\. 加密, 得到密文
本文來自網際網路知識整合,以及書籍。
禁止 學習某地爬蟲,知乎爬蟲,CSDN 爬蟲。
本文,首發在 learnku 社群。
@author
汪春波(www.shxdledu.cn)
本作品採用《CC 協議》,轉載必須註明作者和本文連結