From:
011netservice@gmail.com
Date:
2022-04-24
歡迎來信交流.
目錄:
Source code
- 非對稱性加密(公開金鑰加密)
- 對稱性加密(私密金鑰加密)
- 線性散列(簽名演算法)
- 中英對照
加密演算法可分類如下:
- 非對稱性加密(公開金鑰加密)
- 對稱性加密(私密金鑰加密)
- 線性散列(簽名演算法)
相對於對稱性加密演算法, 非對稱性加密非常慢, 不適用加密大量資料, 只適用於傳輸非常小量的資料. 通常是把(對稱性加密需要的 Key 和 IV), 透過非對稱性加密方式加密傳送成功後, 後續的加密方式, 則改以快速的對稱性加密處理.
RSA
RSA Source code
RSA 步驟說明
這是以1977年由Ron Rivest, Adi Shamir and Leonard Adleman 公開說明的演算法, 因此以三人姓名命名.
若使用者A, 需要傳送加密訊息給使用者B, 則步驟如下: (以下簽章訊息並非必要步驟, 可省略)
- 建立金鑰: AB雙方各自產生一組成對的(公鑰及私鑰).
公鑰作為加密用途, 須對外公開;
私鑰作為解密用途, 不對外公開, 必須嚴格保管, 確認授權後才能使用.
- 取得公鑰: A取得(B的公鑰), 並確保(B的公鑰)是來自於B.
公鑰應公開給任何人, 才能方便的接收來自任何人的加密訊息.
公鑰通常會存放在可信賴的第三方憑證組織 CA Server 上, 公開給任何人取得, 可確保公鑰是來自於B. 例如: VISA 組織.
公鑰的信賴方式: 1. 經由可信賴的第三方憑證組織的信賴程度. 2. 透過與B約定確認後的方法.
- 加密原文: A利用(B的公鑰), 加密(原文)後, 產生(加密訊息).
- 製作簽章: A利用(A的私鑰), 簽章(原文)後, 產生(簽章訊息).
- 傳送訊息: B取得(A的公鑰), (加密訊息), (簽章訊息).
- 解密訊息: B利用(B的私鑰), 解密(加密訊息), 取得(原文).
- 驗證簽章: B取得(A的公鑰), 驗證(簽章訊息), 確定(加密訊息)沒有被竄改.
參考數據:
以 RSACryptoServiceProvider, PKCS #1 V 1.5 padding 實作, 若KeySize=1024 bits, 則可加密 117 bytes, 若KeySize = 2048 bits, 則可加密 245 bytes.
DSA
與RSA性能及安全性類似.
ECC
比RSA更快、更有效率的加密演算法.
密鑰長度建議160Bytes.
對稱式加密Advanced Encryption Standard(AES)
在演算法型態上, 有分為兩種:
- Stream Cipher: 將原文每一個bit逐一加密. 這種方式效率不佳, 因此不常用.
- Block Cipher: 將原文分成多個Block, 一次針對一個Block進行加密. 須注意處理當加密的原文相同時, 加密的結果也會相同.
以相同的密碼進行加密與解密. 常見的方法如下:
AES
AES source code
透過對每個固定大小的4x4位元矩陣區塊(block = 128 bits = 16 bytes),對其每一個元素進行多次交互置換和XOR運算。簡單來說,就是用同一把
secret key 進行Encrypt和Decrypt的動作。優點是對於資料大的檔案加解密的速度較快,而且容易透過硬體實作,運算所需要的記憶體較少,但是缺點是在資料交換的過程中,雙方必須取得這把相同的secret
key。否則,接收到加密檔案的接收者,無法解開加密後的檔案。而它的安全性強度取決於金鑰(secret key)的長度,目前
美國國防安全局審核認定的AES標準演算法secret
key長度有128 bits, 192 bits和256 bits 三種。secret key的長度越長就越安全,但是相對的加密所需的時間就越多,然而實際上secret
key長度對於加密時間的影響並不大,主要還是取決於所選擇的 Block Cipher Mode以及需要加密的資料大小。
由於對於暴力破解法,DES
有可能被破解的風險,因此美國政府提出了一個強度更強的演算法,進而想要將加解密演算法標準化,準備當電腦運算能力發展到很強,DES 必須被淘汰時的候補演算法標準,這就是
AES 的由來。
相較於 DES,AES 演算法中所使用的區塊長度為 128 bits,金鑰長度也提高到 128 bits 以上,因此 cipher text
被破解的機會便更低了。 AES比DES或3DES更快,更有效率, 也更安全的加密方法.
密鑰長度建議128 bits.
在.NET 2.0裡, AES演算法會用到RijndaelManaged
類別.
AES又叫做Rijndael.
由Joan Daemen 和 Vincent Rijmen 二位學者設計,
讀音為 rain doll. 是.NetFramework中, 唯一完全Managed的加密類別.
在.NET 3.5裡, 增加了AesCryptoServiceProvider類別. 跟Rijndael類別產生的結果相同.
AES與DES這兩種加密演算法都需要KEY與IV,AES/DES類別都有以下兩種屬性,必需要依照規則丟固定長度的Bit
- LegalBlockSizes是表示IV的容許長度,單位Bit.
- LegalKeySizes表示KEY的容許長度,單位Bit.
加密的IV跟Key也可以用中文, 只要byts長度符合就可以.
|
IV LegalBlockSizes |
Key LegalKeySizes |
Max |
Min |
Max |
Min |
AES |
128 bits |
128 bits |
256 bits |
128 bits |
16 bytes |
16 bytes |
32 bytes |
16 bytes |
DES |
64 bits |
64 bits |
64 bits |
64 bits |
8 bytes |
8 bytes |
8 bytes |
8 bytes |
AES專有名詞:
- IV (Initialization Vector) "初始化向量"或稱"起始變數",它的用途主要在於避免相同的資料加密多次都產生相同的密文(Cipher
Text)。因此,使用上必須要注意的是,相同的一把金鑰(secret key)在加密的時候,不可以使用相同的 IV,否則就破壞了AES的安全性。此外 IV
本身並不需要保護,它是可以被公開的。而IV的最大長度必須是 16 bytes,而且產生IV的方式必須是無法預測的,也就是隨機產生即可. 常見的IV類型:
- Fixed IV: 使用同一把金鑰(secret key)在加密的時候,所使用的IV都是固定的。這會造成兩個相同的
plain-text 的區塊,產生的 cipher-text 區塊是相同的。
- Counter IV: 同一把金鑰(secret key)在加密的時候,每次加密一個訊息時,都將 IV
累加 1。
- Random IV 隨機產生一個亂數當作 IV。建議的作法是將第一個 IV 當作密文的第一個 cipher-text
區塊。從第二個 cipher-text 區塊才是真正的加密資料.
- Nonce-Generated IV 是指使用相同的一把金鑰(secret key)在加密的時候,用一個
nonce 來產生 IV 。nonce 是指 number used once 的意思,主要的精神在於同一把金鑰(secret key)不可以使用相同的
nonce。例如:假設選擇 nonce = 0 開始後,使用相同的一把金鑰(secret key)在加密的時候,不可以出現使用 nonce =
0 第 2 次。
- Padding: 由於AES加密過程,是針對每個固定大小的區塊(16 bytes),進行多次的交互置換和XOR運算,因此當需要被加密的資料小於矩陣區塊16
bytes 的時候,或是資料的size 不是 16 bytes的倍數時,為了讓加密能夠順利進行,必須將資料的 size 補齊到能夠被 16 bytes
整除的大小。舉例來說,假設需要保護的資料總長度只有 5 bytes,那在進行AES加密之前,必須補齊資料長度達到16 bytes。
.Net中可參考 namespace System.Security.Cryptography之public enum PaddingMode定義有None, PKCS7, Zeros, ANSIX923, ISO10126.
- Block cipher mode
以下分類可對應到.net namespace System.Security.Cryptography 之 public enum CipherMode:
- ECB (Electonic CodeBook): ECB是對於每一個資料區塊都用同一把金鑰(secret
key)去加密,而且沒有使用 IV。缺點是在於相同的資料區塊,加密後的密文(Cipher Text)會是相同的。優點是每個區塊都可以獨立進行加密,因此可同時對每個區塊進行加密。
- CBC (Cipher-Block Chaining): CBC是一種串鏈的加密方式,第一個資料區塊必須加入IV和金鑰(secret
key)進行加密,之後將加密後的密文(Cipher Text)作為第二個資料區塊的IV再加上金鑰進行加密,以此類推下去,直到所有區塊都被加密完成。這種方式在加密過程當中,下一個區塊必須依賴這個區塊加密後的結果才能夠得到IV,因此無法同時進行。但是在解密的時候,可以同時對所有區塊進行解密,因為前後兩個密文(Cipher
Text)區塊,後面的密文區塊要解密時候所需要的IV就是前一個密文區塊。
- CFB (Cipher FeedBack): CFB 則是將 IV 和金鑰(secret key) 產生出
密文(Cipher Text)區塊,然後把密文(Cipher Text)區塊和明文資料區塊進行XOR運算後的值,當做下一個資料區塊的IV再和金鑰(secret
key)產生出下一個密文區塊,以此類推下去做相同的運算,直到所有區塊都被加密完成。
- OFB (Output FeedBack): OFB 則是將 IV 和 金鑰 (secret key)
產生密文區塊(Cipher Block),然後將Cipher Block和明文區塊 PlainText 進行 XOR 運算。而這個區塊產生的 Cipher
Block 則當作下一個資料區塊加密處理所需的 IV。
- CTR (Counter): CTR 則是先透過所謂的 nonce (其實就是IV) 加上可以在長時間內每次都產生不重復
sequence 整數的 counter 所組合出來的一個整數值, 接著用同一把金鑰 (secret key) 對這個整數值加密後的產生一個密文區塊
(Cipher Block), 最後把這個密文區塊和明文區塊(PlainText)進行XOR運算。這種做法每個區塊都可以獨立地進行加密或是解密,因此可運用在平行處理的加解密運算。
Rijndael
AES又叫做Rijndael演算法, 由Joan Daemen 和 Vincent Rijmen 二位學者設計, 讀音為 rain doll. 請參考AES相同的說明.
DES, 3DES
DES source code
DES(Data Encryption Standard)是一種分組數據加密演算法, 為1976年所提出的最早加密演算法
先將數據分成固定長度的小數據塊,之後進行加密.
速度較快,適用於大量數據加密.
DES屬於block cipher, 每個區塊大小為64bits, 金鑰長度為56bits. (其實是有64bits, 但是其中8bits棄置不用).
Triple DES(3DES)
3DES是一種基於DES的加密算法,使用3個不同密匙對同一個分組數據塊進行3次使得密文強度更高.
實作時, 需要一把安全鑰匙與檢查鑰匙, 都為8位元長度.
但因為只有八位元, 而且可以逆向反組譯, 所以是不安全的.
以現在技術來說是可以被破解的.
目前
銀行或ATM Center已經都不採用這種演算法了.
在.NET裡, DES演算法會用到DSACryptoServiceProfider類別.
Blowfish
Blowfish 演算法優點在於速度快、記憶體花費少、加解密的過程簡單(僅使用到基本運算)、可自訂金鑰長度。
而此演算法適合用在通訊連結上,因此像是 VPN
連線的加密,就有使用 Blowfish 演算法
RC5
屬於block cipher. 可以自訂每個加密區塊的長度,也可以自訂加密的回合數與金鑰的長度,加上只使用了電腦的基本運算(加法、XOR ... etc),因此不僅彈性很大,速度也很快。
而由於 RC5 演算法相較於其他演算法,所需要的記憶體比較少,因此也可以用在可攜式的裝置上。
安全散列演算法 Secure Hash Algorithm, 縮寫為SHA.
又稱雜湊法 或 簽名演算法. 產生的密文為不可逆, 也就是無法從密文回推原文. 主要用途是驗證原文經過傳輸到他方以後是否被竄改內容過.
常見的有MD5, SHA1,
HMAC.
SHA-0
1993年發佈.
SHA-1
SHA1 source code
1995年發佈. 曾被視為MD5的後繼者. 2017年荷蘭密碼學研究小組CWI和Google正式宣布攻破了SHA-1.
雜湊值長度=20 bytes (160 bits).
例如: GitHub 利用 SHA-1 雜湊法計算雜湊值, 作為查核碼 (checksum), 檢查所有內部物件是否已被變動.
SHA-2
2001年發佈 包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256.
SHA-3
2015年發佈. SHA-3並不是要取代SHA-2,因為SHA-2目前並沒有出現明顯的弱點。由於對MD5出現成功的破解,以及對SHA-0和SHA-1出現理論上破解的方法,NIST感覺需要一個與之前演算法不同的,可替換的加密雜湊演算法,也就是現在的SHA-3.
MD5
MD5 source code
訊息摘要演算法 Message Digest Algorithm.
被廣泛使用的密碼雜湊函數,可以產生出一個128位元(16位元組)的散列值(hash value),用於確保信息傳輸完整一致。
MD5由美國 Ronald Linn Rivest 於 1947 年設計, 於1992年公開,用以取代MD4演算法。這套演算法的程序在 RFC 1321 中被加以規範.
1996年後被證實存在弱點,可以被加以破解,對於需要高度安全性的資料,專家一般建議改用其他演算法,如SHA-1。2004年,證實MD5演算法無法防止碰撞,因此無法適用於安全性認證,如SSL公開金鑰認證或是數位簽章等用途.
雜湊值長度=16 bytes (128 bits).
依英文順序由小到大, 先大寫、再小寫排序.
Algorithm演算法.
Asymmetric key cryptography對稱式加密. 又稱為 公開金鑰加密.
Ciphertext密文.
Cryptanalysis密碼破解.
Cryptography密碼學.
Cryptology密碼技術.
Decryption解密.
Encryption加密.
Hash Method雜湊法.
Hash Value雜湊值.
IVInitialization Vector. 初始化向量"或稱"起始變數".
Key金鑰
MD5Message Digest Algorithm: 訊息摘要演算法. 長度128 bits(16 bytes), 建議改用SHA-1較安全.
Padding補齊加密區塊長度.
Plaintext原文.
Private Key私鑰. 私密保存的金鑰.
Public Key公鑰. 公開的金鑰.
Public key cryptography公開金鑰加密. 又稱為 對稱式加密.
SHASecure Hash Algorithm 安全散列演算法. 例如: SHA-1 長度為 20 Bytes, 在 git 中以16進位表示為 24b9da6552252987aa493b52f8696cd6d3b00373.
Secret-Key Encryption私密金鑰加密.
Secure Hash Algorithm安全散列演算法, 簡稱SHA.
Symmetric encription對稱性加密.
block cipher區塊加密.
stream cipher資料流加密.
https://docs.microsoft.com/en-us/dotnet/standard/security/cryptographic-services?view=netframework-4.7.2
20161111, Honda, Create.
20170329, Honda, Add source code for DESCryptoServiceProvider, MD5CryptoServiceProvider, RC2CryptoServiceProvider, RijndaelManaged, TripleDESCryptoServiceProvider.
20170404, Honda, Add SHA and MD5 description.
20190321, Honda, Move source code to github and add terms translation.
20190331, Honda, Add RSA sample.
20190408, Honda, Add MD5 and SHA1 samples.
20190412, Honda, Add AES sample.
20190423, Honda, Add ref. test data.
20190423, Honda, Add DES source code and file encrypt/descrypt.
20201129, Honda, 勘誤.