不同的工具對相同的輸入返回不同的密文值
我有一個Luna G5 Safenet HSM,我想加密一個包含算法的文本
testtest
文件3DES-ECB
。因此,在第一步中,我3DES
在 HSM 上生成了一個密鑰:密鑰生成器工具的視圖:
Select type of key to generate [ 1] DES [ 2] DES2 [ 3] DES3 [ 5] CAST3 [ 6] Generic [ 7] RSA [ 8] DSA [ 9] DH [10] CAST5 [11] RC2 [12] RC4 [13] RC5 [14] SSL3 [15] ECDSA [16] AES [17] SEED [18] KCDSA-1024 [19] KCDSA-2048 [20] DSA Domain Param [21] KCDSA Domain Param [22] RSA X9.31 [24] ARIA [25] DH PKCS Domain Param [26] RSA 186-3 Aux Primes [27] RSA 186-3 Primes > 3 Enter Is Token Attribute [0-1]: 1 Enter Is Sensitive Attribute [0-1]: 1 Enter Is Private Attribute [0-1]: 1 Enter Encrypt Attribute [0-1]: 1 Enter Decrypt Attribute [0-1]: 1 Enter Sign Attribute [0-1]: 1 Enter Verify Attribute [0-1]: 1 Enter Wrap Attribute [0-1]: 1 Enter Unwrap Attribute [0-1]: 1 Enter Derive Attribute [0-1]: 1 Enter Extractable Attribute [0-1]: 1 Generated DES3 Key handler: 14
之後我檢查了它的屬性:
G:\LunaG5> Cmu.exe getattribute -password 1234567 Select object to query Handler Label 14 Generated DES3 Key Enter handler (or 0 for exit) : 14 class=secretKey token=true private=true label=Generated DES3 Key value=86016e6572617465642044455333204b6579000000000000 keytype=3DES id= sensitive=true encrypt=true decrypt=true wrap=true unwrap=true sign=true verify=true derive=true startdate= enddate= extractable=true local=true neverextractable=false alwayssensitive=true modifiable=true
如上所示,我生成的 3DES 密鑰的值為:
86016e6572617465642044455333204b6579000000000000
好吧,在下一步中,我使用 1-my HSM、2-OpenSSL、3-這個線上工具來加密我的文本文件。奇怪的是,所有的輸出都是不同的!
1-我的 HSM:
Enter your choice : 40 [ 1] DES-CBC [ 2] DES3-CBC [ 3] DES3-CTR [ 4] CAST3-CBC [ 5] DES-ECB [ 6] DES3-ECB [ 7] AES-CTR [ 8] CAST3-ECB [ 9] RC2-ECB [10] RC2-CBC [11] CAST5-ECB [12] CAST5-CBC [13] RC4 [14] RC5-ECB [15] RC5-CBC [16] RAW-RSA [17] DES-CBC-PAD [18] DES3-CBC-PAD [19] DES3-CBC-PAD-IPSEC [20] RC2-CBC-PAD [21] RC5-CBC-PAD [22] CAST3-CBC-PAD [23] CAST5-CBC-PAD [24] SEED-ECB [25] SEED-CBC [26] SEED-CBC-PAD [27] AES-ECB [28] AES-CBC [29] AES-CBC-PAD [30] AES-CBC-PAD-IPSEC [31] ARIA-ECB [32] ARIA-CBC [33] ARIA-CBC-PAD [34] RSA-PKCS [35] DES3-CFB8 [36] DES3-CFB64 [37] DES3-OFB [38] AES-CFB8 [39] AES-CFB128 [40] AES-OFB [41] ARIA-CFB8 [42] ARIA-CFB128 [43] ARIA-OFB [44] AES-GCM [45] XOR-BASE-DATA-KDF [50] RSA-OAEP [51] ECIES [52] ARIA-CTR [53] SEED-CTR Select mechanism for encryption: 6 Enter name of file to encrypt: plain.txt Enter key to use (-1 to list available objects) : -1 Handle 14 -- label: Generated DES3 Key Enter key to use (-1 to list available objects) : 14 Encrypted data stored in file ENCRYPT.BIN Status: Doing great, no errors (CKR_OK)
HSM 輸出文件內容:
2-OpenSSL:
D:\GnuWin32\bin>openssl.exe enc -des-ede3 -e -in in.txt -out out.bin -K 86016e6572617465642044455333204b6579000000000000 -iv 0
3-線上工具&輸出:
為什麼我有不同的輸出?
HSM 不應該公開其實際的密鑰材料;這就是它們的全部意義,通常:它們不像 PC 那樣容易被破壞,因為 PC 的關鍵材料在記憶體中,可能會洩漏等。
該值
86016e6572617465642044455333204b6579000000000000
只是在前兩個字節之後,“生成的 DES3 密鑰”的 ASCII 表示,這使得這很可能是與實際密鑰字節不同的野獸……如果有前兩個字節是 47 65(所以它會說 Generated…)RSA私鑰顯示其模數和公共指數並不奇怪,這些應該在公鑰加密中已知,用於加密和驗證簽名。同樣,實際的私鑰(私有指數,可能還有其他所謂的 CRT 參數,如兩個素數等)永遠不應該是可提取的。
要驗證實現,請為對稱密碼導入您自己的密鑰,然後用它進行加密;這應該是可驗證的。或者只是單個 DES 並暴力破解密鑰 :) 否則,您必須相信實現是正確的,因為否則您無法知道密鑰材料。
線上實現和 OpenSSL 之間的區別在於,在後者中,您將密鑰作為十六進制(然後將其轉換為字節值),而您連結到的線上工具使用密鑰的 ASCII 值作為其密鑰字節。因此,如果您在此處輸入 8103,您輸入的是四個字節 38 31 30 33,而不是兩個字節 0x81 和 0x03。我使用 openssl 命令行工具和網站上的測試向量對此進行了檢查。