- Sub Rosa 是什麼?
- Sub Rosa 加密系統--設計
- Sub Rosa 加密系統--輸出
- Sub Rosa 加密系統--需求
- Sub Rosa 加密系統--測試
- Sub Rosa 加密系統--線上版
- Sub Rosa 加密系統--原始碼
- Sub Rosa 加密系統--文獻
Sub Rosa 是什麼?
Sub Rosa 是一個拉丁文片語,英文的字面翻譯為 "Under the rose",具有「祕密、機密」的含意。
著名密碼學家布魯斯‧施奈爾 (Bruce Schneier) 在他撰寫的《應用密碼學》(Applied Cryptography)[1] 一書中,序言即提到:
「世界上的加密系統可以分為兩種: 一種只能防止好奇的小妹偷看你的檔案,但是另一種卻可以防止大有為的政府窺視你的私人祕密。」
"There are two kinds of cryptography in this world: cryptography that will stop your kid sister from reading your files, and cryptography that will stop major governments from reading your files."
Sub Rosa 是一個雙倍神經質 (稱為「雙倍」的原因將詳述於下) 的對稱式密鑰加密 (Symmetric key encryption) 系統,是我撰寫來保護一些小小的祕密,同時也試圖達到上述後者的境界。
Sub Rosa 加密系統--設計
一個加密系統,除了密鑰之外,即使所有設計細節都已經被徹底了解,系統仍然必須保持安全。這就是密碼學中科克霍夫原則 (Kerckhoffs' principle)[2] 以及香農箴言 (Shannon's maxim)[3] 所要傳達的基本精神。如果想要說服別人相信一個加密系統是安全的,最有力的方法就是公佈設計細節讓所有人檢驗,符合透明式安全 (Security through transparency) 的概念。
Sub Rosa 加密系統的設計細節如下圖所示,數字以位元 (Bit) 為單位。
紅色: 暗文 (Ciphertext)。
綠色: 明文 (Plaintext)。
藍色: 密碼 (Password)。
黃色: 加密基元 (Cryptographic primitive)。
Sub Rosa 加密系統是由 AES-CTR[4][5]、Salsa20[6]、XSalsa20[6]、SHA512[7]、HMAC-SHA512[8]、PBKDF2-HMAC-SHA512[9][10]...... 等加密基元所組成。
大致而言,Sub Rosa 加密系統經由以下步驟運作:
- 資料準備: 輸入的資料首先經由 UTF-8 編碼,得到明文 P、密碼 PW;使用 CSPRNG (在瀏覽器中是透過 crypto.getRandomValues() 函式) 產生隨機資料,得到隨機資料 S、初始向量 IVAES-CTR、初始向量 IVXSalsa20。
- 密鑰產生: 密碼 PW、隨機資料 S 經由 214 次迴圈的 PBKDF2-HMAC-SHA512 運算,得到密鑰 KMaster;分割密鑰 KMaster,得到密鑰 KAES-CTR、密鑰 KXSalsa20、密鑰 KHMAC-SHA512。
- 雙倍加密:
- 明文 P、初始向量 IVAES-CTR、密鑰 KAES-CTR 經由 AES-CTR 運算,得到暗文 C1。
- 暗文 C1、初始向量 IVXSalsa20、密鑰 KXSalsa20 經由 XSalsa20 運算,得到暗文 C2。
- 合併初始向量 IVAES-CTR、初始向量 IVXSalsa20、暗文 C2,得到暗文 C3。
- 訊息驗證: 暗文 C3、密鑰 KHMAC-SHA512 經由 HMAC-SHA512 運算,得到雜湊訊息驗證碼 HMAC。
- 結果輸出: 合併識別標頭 H、隨機資料 S、雜湊訊息驗證碼 HMAC、暗文 C3,得到暗文 C4;暗文 C4 經由 16 進位編碼,得到暗文 CFinal,是為最終結果。
Sub Rosa 加密系統--輸出
Sub Rosa 加密系統的輸出結構如下圖所示,數字以位元 (Bit) 為單位。
Sub Rosa 加密系統--需求
Sub Rosa 加密系統是以 Javascript 撰寫而成,Node.js 和瀏覽器為其主要的目標執行平臺。請注意你的瀏覽器至少必須支援 ECMAScript 5.1 Edition[11] 標準、ECMAScript 6.0 Edition[12] 標準中的 TypedArray 功能、以及 Web Cryptography API[13] 標準中的 crypto.getRandomValues() 函式。大致而言,只要是比 Microsoft Internet Explorer 11 新的瀏覽器都可以支援。
Sub Rosa 加密系統--測試
在使用 Sub Rosa 加密系統前,內部的加密基元必須通過測試向量 (Test vector)[14] 的測試,才能確認運作正確無誤。所有項目都應該顯示綠色的「通過 (Passed)」字樣。
以下是一個 Sub Rosa 加密系統的使用範例。輸入密碼 "I want to tell you a secret..." (不含引號)。如果測試成功,你應該會看到一段英文訊息。
Sub Rosa 加密系統--線上版
Sub Rosa 加密系統--原始碼
以下是 Sub Rosa 的應用程式介面 (Application programming interface) 列表。各個函式的詳細內容和使用方法請參考原始碼。
{ AUTHOR: 'Stargazer Wang',
LICENSE: 'MIT License',
NAME: 'Sub Rosa',
SUBROSA: 'A doubly paranoid symmetric key encryption utility for protecting little secrets',
VERSION: '2.0.0-20160216',
WEBSITE: 'http://www.stargazer.idv.tw/',
advanced:
{ CONSTANT_AES_CTR_BLOCK_SIZE: 16,
CONSTANT_AES_CTR_KEY_SIZE: 32,
CONSTANT_AES_CTR_NONCE_SIZE: 16,
CONSTANT_SALSA20_BLOCK_SIZE: 64,
CONSTANT_SALSA20_KEY_SIZE: 32,
CONSTANT_SALSA20_NONCE_SIZE: 8,
CONSTANT_SHA512_BLOCK_SIZE: 128,
CONSTANT_SHA512_DIGEST_SIZE: 64,
CONSTANT_XSALSA20_BLOCK_SIZE: 64,
CONSTANT_XSALSA20_KEY_SIZE: 32,
CONSTANT_XSALSA20_NONCE_SIZE: 24,
aes_ctr: [Function: aes_ctr],
aes_ctr_xor: [Function: aes_ctr_xor],
arrcmpr: [Function: arrcmpr],
arrcopy: [Function: arrcopy],
arrrand: [Function: arrrand],
arrzero: [Function: arrzero],
hmac_sha512: [Function: hmac_sha512],
pbkdf2_hmac_sha512: [Function: pbkdf2_hmac_sha512],
salsa20: [Function: salsa20],
salsa20_xor: [Function: salsa20_xor],
sha512: [Function: sha512],
xsalsa20: [Function: xsalsa20],
xsalsa20_xor: [Function: xsalsa20_xor] },
decrypt: [Function: decrypt],
encrypt: [Function: encrypt],
from_b64_string: [Function: from_b64_string],
from_hex_string: [Function: from_hex_string],
from_raw_string: [Function: from_raw_string],
from_string: [Function: from_string],
to_b64_string: [Function: to_b64_string],
to_hex_string: [Function: to_hex_string],
to_raw_string: [Function: to_raw_string],
to_string: [Function: to_string] }
Sub Rosa 加密系統--文獻
[1]: Bruce Schneier. "Applied Cryptography, Second Edition".
[2]: Auguste Kerckhoffs. "La cryptographie militaire".
[3]: Claude E. Shannon. "Communication Theory of Secrecy Systems".
[4]: NIST. "FIPS 197: Advanced Encryption Standard (AES)".
[5]: NIST. "SP 800-38 A: Recommendation for Block Cipher Modes of Operation - Methods and Techniques".
[6]: Daniel J. Bernstein. "The Salsa20 Encryption Function".
[7]: NIST. "FIPS 180-4: Secure Hash Standard (SHS)".
[8]: NIST. "FIPS 198-1: Keyed-Hash Message Authentication Code (HMAC)".
[9]: NIST. "SP 800-132: Recommendation for Password-Based Key Derivation Part 1: Storage Applications".
[10]: IETF. "RFC 2898: Password-Based Cryptography Specification Version 2.0".
[11]: Ecma International. "ECMAScript 5.1 Edition Language Specification".
[12]: Ecma International. "ECMAScript 6.0 Edition Language Specification".
[13]: W3C. "Web Cryptography API".
[14]: 測試向量的來源和內容請參考 "subrosaselftest.js" 原始碼中的註解。
Revision: 20160312