Encryption

不同的工具對相同的輸入返回不同的密文值

  • April 27, 2016

我有一個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

OpenSSL 輸出文件內容: 在此處輸入圖像描述

3-線上工具&輸出:

在此處輸入圖像描述

為什麼我有不同的輸出?

HSM 不應該公開其實際的密鑰材料;這就是它們的全部意義,通常:它們不像 PC 那樣容易被破壞,因為 PC 的關鍵材料在記憶體中,可能會洩漏等。

該值86016e6572617465642044455333204b6579000000000000只是在前兩個字節之後,“生成的 DES3 密鑰”的 ASCII 表示,這使得這很可能是與實際密鑰字節不同的野獸……如果有前兩個字節是 47 65(所以它會說 Generated…)

RSA私鑰顯示其模數和公共指數並不奇怪,這些應該在公鑰加密中已知,用於加密和驗證簽名。同樣,實際的私鑰(私有指數,可能還有其他所謂的 CRT 參數,如兩個素數等)永遠不應該是可提取的。

要驗證實現,請為對稱密碼導入您自己的密鑰,然後用它進行加密;這應該是可驗證的。或者只是單個 DES 並暴力破解密鑰 :) 否則,您必須相信實現是正確的,因為否則您無法知道密鑰材料。

線上實現和 OpenSSL 之間的區別在於,在後者中,您將密鑰作為十六進制(然後將其轉換為字節值),而您連結到的線上工具使用密鑰的 ASCII 值作為其密鑰字節。因此,如果您在此處輸入 8103,您輸入的是四個字節 38 31 30 33,而不是兩個字節 0x81 和 0x03。我使用 openssl 命令行工具和網站上的測試向量對此進行了檢查。

引用自:https://crypto.stackexchange.com/questions/31118