golang 密碼學-1. 對稱加密

wangchunbo發表於2020-05-22

1.1 基礎知識點

  1. 知識點大綱介紹
  • 密碼的基礎概念

  • 對稱加密

  • 非對稱加密

  • 單向雜湊函式

  • 雜湊函式

  • 訊息認證碼

  • 數字簽名

  • 證照

  • ssl/tls - https

  1. 為什麼要加密, 以及解決方案

保證資料安全

  1. 加密三要素
  • 明文/密文

  • 祕鑰

  • 定長的字串

  • 需要根據加密演算法確定其長度

  • 演算法

  • 加密演算法

  • 解密演算法

  • 加密演算法和解密演算法有可能是互逆的, 也有可能相同

  1. 常用的兩種加密方式
  • 對稱加密

  • 祕鑰: 加密解密使用的是同一個祕鑰, 祕鑰有一個

  • 特點

  • 雙方向保證機密性

  • 加密效率高, 適合加密大資料, 大檔案

  • 加密強度不高, 相對於非對稱加密

  • 非對稱加密

  • 祕鑰: 加密解密使用的不同的祕鑰, 祕鑰有兩個, 需要使用祕鑰生成演算法, 得到金鑰對

  • 公鑰 - 可以公開的祕鑰

  • 公鑰加密資料, 解密需要使用私鑰

  • 私鑰 - 需要妥善保管的祕鑰, 知道的人越少越好

  • 私鑰加密, 公鑰解密

  • 特點:

  • 資料的機密性只能單方向保證

  • 加密效率低, 適合加密少量資料

  • 加密強度高, 相對於對稱加密

  1. 凱撒密碼

愷撒密碼(Caesar cipher)是一種相傳尤利烏斯·愷撒曾使用過的密碼。愷撒於公元前100年左右誕生於古羅馬,是一位著名的軍事統帥。

愷撤密碼是通過將明文中所使用的字母表按照一定的字數“平移”來進行加密的。

golang密碼學-1. 對稱加密

  • 凱撒密碼加解密公式

  • 加密

E2(x) = (x + n) mod 26

  • 解密

E2(x) = (x - n) mod 26

  • 凱撒密碼中的加密三要素

  • 明文/密文

  • 明文: 小寫字母表中的資料

  • 密文: 大寫字母表中的資料

  • 祕鑰

  • 按照上圖祕鑰為3

  • 演算法

  • 加密: +3

  • 解密: -3

  • 凱撒密碼的安全性

不安全

  1. 密碼資訊保安常識
  • 不要使用保密的密碼演算法(普通公司和個人)

  • 使用低強度的密碼比不進行任何加密更危險

  • 任何密碼總有一天都會被破解

  • 密碼只是資訊保安的一部分

  1. 密碼資訊威脅

golang密碼學-1. 對稱加密

思考:資訊保安處理必須要具備哪些特性?

1.2 對稱加密

以分組為單位進行處理的密碼演算法稱為分組密碼(blockcipher)

  1. 編碼的概念

G = 1024m

m = 1024kbyte

byte = 8bit

bit 0/1

計算機的操作物件並不是文字,而是由0和1排列而成的位元序列

將現實世界中的東西對映為位元序列的操作稱為編碼(encoding)

加密 -> 編碼

解密 -> 解碼

hello world -> 位元序列

h -> int 104 ->

  1. DES – Data Encryption Standard
  • 現在使用DES方式加密,資料還安全嗎?

  • 不安全, 已經被破解了

  • 是不是分組密碼?

  • 是, 先對資料進行分組, 然後在加密或解密

  • DES的分組長度?

  • 8byte == 64bit

  • DES的祕鑰長度?

  • 56bit祕鑰長度+8bit錯誤檢測標誌位 = 64bit == 8byte

  1. 3DES – Triple-DES
  • 3DES安全嗎?

  • 安全, 但是效率低

  • 演算法描述?

  • 進行了3次des加密

  • 是不是分組密碼?

  • 3DES分組長度?

  • 8位元組

  • 3DES祕鑰長度?

  • 24位元組, 在演算法內部會被平均分成3份

  • 3DES加密過程?

  • 祕鑰1 -> 加密, 祕鑰2 -> 解密, 祕鑰3 -> 加密

  • 3DES解密過程?

  • 祕鑰1 -> 解密, 祕鑰2 -> 加密, 祕鑰3 -> 解密

  1. AES – Advanced Encryption Standard
  • AES安全嗎?

  • 安全, 效率高, 推薦使用的

  • 是不是分組密碼?

  • AES分組長度?

  • 128bit = 16位元組

  • AES祕鑰長度?

  • 128bit = 16位元組

  • 192bit = 24位元組

  • 256bit = 32位元組

  • go中的祕鑰長度只能是16位元組

1.3 分組密碼的模式

  1. 按位異或
  • 第一步需要將資料轉換為二進位制

  • 按位異或操作符: ^

  • 兩個標誌位進行按位異或操作:

  • 相同為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 按位異或 ===> 解密
  1. ECB - Electronic Code Book, 電子密碼本模式
  • 特點: 簡單, 效率高, 密文有規律, 容易被破解

  • 最後一個明文分組必須要填充

  • des/3des -> 最後一個分組填充滿8位元組

  • aes -> 最後一個分組填充滿16位元組

  • 不需要初始化向量

  1. CBC - Cipher Block Chaining, 密碼塊鏈模式
  • 特點: 密文沒有規律, 經常使用的加密方式

  • 最後一個明文分組需要填充

  • des/3des -> 最後一個分組填充滿8位元組

  • aes -> 最後一個分組填充滿16位元組

  • 需要一個初始化向量 - 一個陣列

  • 陣列的長度: 與明文分組相等

  • 資料來源: 負責加密的人的提供的

  • 加解密使用的初始化向量值必須相同

  1. CFB - Cipher FeedBack, 密文反饋模式
  • 特點: 密文沒有規律, 明文分組是和一個資料流進行的按位異或操作, 最終生成了密文

  • 需要一個初始化向量 - 一個陣列

  • 陣列的長度: 與明文分組相等

  • 資料來源: 負責加密的人的提供的

  • 加解密使用的初始化向量值必須相同

  • 不需要填充

  1. OFB - Output-Feedback, 輸出反饋模式
  • 特點: 密文沒有規律, 明文分組是和一個資料流進行的按位異或操作, 最終生成了密文

  • 需要一個初始化向量 - 一個陣列

  • 陣列的長度: 與明文分組相等

  • 資料來源: 負責加密的人的提供的

  • 加解密使用的初始化向量值必須相同

  • 不需要填充

  1. CTR - CounTeR, 計數器模式
  • 特點: 密文沒有規律, 明文分組是和一個資料流進行的按位異或操作, 最終生成了密文

  • 不需要初始化向量

  • go介面中的iv可以理解為隨機數種子, iv的長度 == 明文分組的長度

  • 不需要填充

  1. 最後一個明文分組的填充
  • 使用cbc, ecb需要填充

  • 要求:

  • 明文分組中進行了填充, 然後加密

  • 解密密文得到明文, 需要把填充的位元組刪除

  • 使用 ofb, cfb, ctr不需要填充

  1. 初始化向量 - IV
  • ecb, ctr模式不需要初始化向量

  • cbc, ofc, cfb需要初始化向量

  • 初始化向量的長度

  • des/3des -> 8位元組

  • aes -> 16位元組

  • 加解密使用的初始化向量相同

1.4 對稱加密在go中的實現

  1. des

  2. 3des

  3. 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 協議》,轉載必須註明作者和本文連結

上海PHP自學中心-免費程式設計視訊教學|
7Dn78VKKcW.jpg!large
S3d25uqwht.png!large

相關文章