Encryption

如何使用未簽名的公鑰使用 openssl 加密大文件?

  • October 19, 2020

openssl 這種方式只能加密小文件:

openssl rsautl -encrypt -pubin -inkey public_key.pem -in secret.txt -out secret.enc

我發現這裡建議的openssl會引發錯誤:

openssl smime -encrypt -aes-256-cbc -binary -in secret.txt -outform DER -out secret.txt.der public_key.pem

並不是說您應該使用 smime,因為那是用於郵件的,但仍然會看到錯誤:

unable to load certificate
140222726453056:error:0909006C:PEM routines:get_name:no start line:crypto/pem/pem_lib.c:745:Expecting: TRUSTED CERTIFICATE

為什麼 openssl 抱怨信任證書?那是我的事。我知道這意味著它希望 PEM 採用不同的格式,而不是個人使用。

我想要什麼?

我想使用 bash 使用公共 PEM 文件(或其他公鑰)對任何具有強加密的文件進行加密,以便我的項目對應方可以使用他們的私鑰對其進行解密。如果我也可以使用 powershell 本機工具,那就太棒了,但這是一個很大的問題,我只是想我會把它扔進去,希望避免 gitbash 用於 Windows 宿主的收件人。

我可以使用 gpg,但我們不想介紹生成密碼生成的密鑰。

嗯,第一個問題是你真的不想用非對稱密碼加密一個大文件。沒有人這樣做,因為它們很慢,而且在任何情況下都受到限制。您所做的是為對稱密碼創建會話密鑰,使用非對稱密碼加密會話密鑰,使用對稱密碼加密大文件,然後將所有內容打包在一起。這就是 SSL 和 PGP/GPG 所做的。

您找到的 rsautil 命令是一個關於進行非對稱編碼的低級工具。但是您需要幾個其他命令來完成整個過程。

有兩個基本的解決方案。

  1. 使用您的私鑰簽署您的公鑰以創建證書。這應該可以openssl smime工作。
  2. 使用 GPG。這就是它的設計目的。對於您所描述的內容,我建議您這樣做。可能gpg -se,或者gpg -sea如果您正在發送電子郵件。(不要這樣做gpg -c,我認為這是您的“密碼生成的密鑰”。)

無論是使用 SSL 還是 GPG,雙方都必須生成公鑰和私鑰,用私鑰對公鑰進行簽名,並將簽名後的公鑰發送給對方。通常,所涉及的唯一密碼是加密私鑰,這樣可以看到您文件的人就無法解密您的數據。

SSL 和 PGP/GPG 之間的主要區別在於認證模型。SSL 使用“證書頒發機構”。PGP/GPG 使用證書鏈,Anne 簽署 Bob 的密鑰,Bob 簽署 Carol 的密鑰,因此 Anne 可以相信 Carol 的密鑰屬於 Carol。

最後,如果您正在通過電子郵件發送文件,您可能只是看看是否可以在您的電子郵件客戶端中獲得 SMIME 或 PGP 集成。

引用自:https://unix.stackexchange.com/questions/615162