2016-07-19 34 views
-1

我想了解openssl中2個加密模塊之間的特定區別。一個模塊是「openssl enc」,另一個是「openssl smime」。據我所知,SMIME通常用於電子郵件,而openssl enc用於通用加密/解密例程。我的困惑是openssl enc模塊允許你指定一個鍵,一個初始化向量和一個salt,但openssl smime模塊只允許你指定一個鍵。這是什麼原因? smime模塊是否假設發動機罩下有特定的IV和鹽?在這種情況下,我特別使用AES的CBC模式。SMIME模塊中的Openssl no IV

+1

堆棧溢出是編程和開發問題的網站。這個問題似乎與題目無關,因爲它不涉及編程或開發。請參閱幫助中心的[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic)。也許[超級用戶](http://superuser.com/)或[Unix&Linux堆棧交換](http://unix.stackexchange.com/)會是一個更好的地方。另請參閱[我在哪裏發佈有關Dev Ops的問題?](http://meta.stackexchange.com/q/134306)。 – jww

+0

@jww您列出的網站說您可以發佈關於: 1.軟件算法 2.程序員常用的軟件工具。 我看到這篇文章是關於這兩個問題。因此,這篇文章似乎與堆棧溢出有關。 – duffsterlp

回答

2

這兩個命令是非常不同的。

Openssl加密根據您的規格。因此,如果你想AES-256-CBC,例如,你可以說:

$ more foo.txt 
The quick brown fox jumps over the lazy dog 
$ openssl rand -hex 16 
12b53ed0a13749832fe92d1e00f8b4db 
$ openssl rand -hex 32 
8cc103b653a10f0ea884482e4cdd0615160930e840d00af12e33ac560a830bd0 
$ openssl enc -e -aes-256-cbc -in foo.txt -out foo.enc -K 8cc103b653a10f0ea884482e4cdd0615160930e840d00af12e33ac560a830bd0 -iv 12b53ed0a13749832fe92d1e00f8b4db 
$ base64 foo.enc 
7wiOhwD9WEm4h2Y9ooDFlEFPkIX6gU+6Xm6ca9P1t+z7S83Vk95WwOezSd2Hv2A1 
$ openssl enc -d -aes-256-cbc -in foo.enc -K 8cc103b653a10f0ea884482e4cdd0615160930e840d00af12e33ac560a830bd0 -iv 12b53ed0a13749832fe92d1e00f8b4db 
The quick brown fox jumps over the lazy dog 

在這個例子中,是foo.txt的44個字節長,所述加密的消息是48個字節(3 *塊長度,包括填充),所以這是原始的AES加密數據。

Openssl smime根據RFC 3447構造S/MIME消息。這意味着它使用hybrid encryption,其中實際的消息是對稱加密的,具有隨機密鑰和IV。 IV嵌入到消息中,然後使用您在命令行中指定的證書中的public key加密密鑰。如果還要對消息進行簽名,則私鑰將從-signer參數的證書中獲取,或直接從-inkey指定的文件中獲取。

該消息然後編碼在ASN.1。一個典型的openssl smime輸出可能看起來像這樣在decoder

SEQUENCE(2 elem) 
    OBJECT IDENTIFIER 1.2.840.113549.1.7.3 
    [0](1 elem) 
    SEQUENCE(3 elem) 
     INTEGER 0 
     SET(1 elem) 
     # Certificate information, issuer and serial number 
     OCTET STRING(128 byte) 73CE9886...       # RSA encrypted key 
     SEQUENCE(3 elem) 
     OBJECT IDENTIFIER1.2.840.113549.1.7.1 
     SEQUENCE(2 elem) 
      OBJECT IDENTIFIER2.16.840.1.101.3.4.1.2    # AES-128-CBC 
      OCTET STRING(16 byte) D2A3ECBAE792CFC19DD696AEF9593BB3 # random IV 
     [0](48 byte) A14F3F76...         # encrypted message 
+0

這是很棒的信息。 「IV嵌入到消息中」是什麼意思?這是否意味着openssl爲你引發了一個隨機IV?怎麼樣鹽? – duffsterlp

+0

哦,你確實指出密鑰和IV是隨機生成的。但是,鹽仍然是一個缺失的部分。 – duffsterlp

+0

需要鹽以確保使用相同密碼加密的兩條消息仍然不同。如果你詳細地提供了密鑰和iv,那麼iv就是各種各樣的鹽。但嚴格來說,只有從用戶輸入aka密碼中獲得密鑰時才使用salt。在這種情況下,openssl enc在消息中嵌入salt,就像openssl smime嵌入了iv。 – wallenborn

相關問題