我想了解openssl中2個加密模塊之間的特定區別。一個模塊是「openssl enc」,另一個是「openssl smime」。據我所知,SMIME通常用於電子郵件,而openssl enc用於通用加密/解密例程。我的困惑是openssl enc模塊允許你指定一個鍵,一個初始化向量和一個salt,但openssl smime模塊只允許你指定一個鍵。這是什麼原因? smime模塊是否假設發動機罩下有特定的IV和鹽?在這種情況下,我特別使用AES的CBC模式。SMIME模塊中的Openssl no IV
回答
這兩個命令是非常不同的。
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
這是很棒的信息。 「IV嵌入到消息中」是什麼意思?這是否意味着openssl爲你引發了一個隨機IV?怎麼樣鹽? – duffsterlp
哦,你確實指出密鑰和IV是隨機生成的。但是,鹽仍然是一個缺失的部分。 – duffsterlp
需要鹽以確保使用相同密碼加密的兩條消息仍然不同。如果你詳細地提供了密鑰和iv,那麼iv就是各種各樣的鹽。但嚴格來說,只有從用戶輸入aka密碼中獲得密鑰時才使用salt。在這種情況下,openssl enc在消息中嵌入salt,就像openssl smime嵌入了iv。 – wallenborn
- 1. OpenSSL的SMIME軌
- 2. openssl smime消息簽署
- 3. 用Bouncy Castle在Java中複製'openssl smime'?
- 4. Golang OpenSSL的壞IV大小
- 5. OpenSSL EVP_CIPHER_CTX獲得更新IV
- 6. 可以使用sha256證書openssl smime -verify
- 7. 使用Perl和OpenSSL驗證SMIME簽名
- 8. 將OpenSSL IV轉換爲十六進制?
- 9. GAE Python 2.7,no _io模塊?
- 10. Axis2C with OpenSSL - no OPENSSL_APPLINK error
- 11. 添加想法模塊openssl
- 12. 複製的OpenSSL SMIME在iPhone /可可命令
- 13. 未能使用OpenSSL解密AES加密的SMIME消息
- 14. OpenSSL smime驗證失敗,正確的證書和簽名
- 15. 無法通過SSH驗證openssl smime驗證
- 16. 安裝dbf- no模塊名爲枚舉
- 17. Perl模塊,做了OpenSSL相當於asn1parse
- 18. 無法設置AES IV GCM使用OpenSSL的
- 19. 使用OpenSSL從SMIME消息(pkcs7簽名)中提取公共證書
- 20. Openssl命令行無法驗證早先創建的分離的smime簽名
- 21. 你的文件應該驗證,並與`OpenSSL的SMIME -verify -inform DER -noverify`
- 22. SMIME解密
- 23. 如何通過openssl生成帶文件附件的smime(例如csv,pdf)
- 24. 在Django的/ No模塊中名爲'wsgi'導入錯誤
- 25. 如何爲openssl加密生成隨機密碼和IV
- 26. openssl-使用密鑰和IV解密base64字符串
- 27. 如何從OpenSSL加密數據獲得初始化向量(iv)
- 28. OpenSSL編成密碼隨機密鑰和IV-存放在DB
- 29. 劑量Ruby OpenSSL :: Cipher.reset清除鍵和iv以及?
- 30. 紅寶石OpenSSL的DES編碼「錯誤的最終塊長」
堆棧溢出是編程和開發問題的網站。這個問題似乎與題目無關,因爲它不涉及編程或開發。請參閱幫助中心的[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic)。也許[超級用戶](http://superuser.com/)或[Unix&Linux堆棧交換](http://unix.stackexchange.com/)會是一個更好的地方。另請參閱[我在哪裏發佈有關Dev Ops的問題?](http://meta.stackexchange.com/q/134306)。 – jww
@jww您列出的網站說您可以發佈關於: 1.軟件算法 2.程序員常用的軟件工具。 我看到這篇文章是關於這兩個問題。因此,這篇文章似乎與堆棧溢出有關。 – duffsterlp