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 本机工具,那就太棒了,但这是一个很大的要求,我只是想把它扔进去,希望避免 Windows 宿主的接收者使用 gitbash。
我可以使用 gpg,但我们不想引入生成密码生成的密钥。
答案1
好吧,第一个问题是您确实不想使用非对称密码来加密大文件。没有人这样做,因为它们速度很慢,而且无论如何尺寸都有限。您要做的就是为对称密码创建会话密钥,使用非对称密码加密会话密钥,使用对称密码加密大文件,然后将它们打包在一起。这就是 SSL 和 PGP/GPG 所做的事情。
您发现的 rsautil 命令是一个用于执行非对称编码的低级工具。但是您需要几个其他命令来完成整个过程。
有两种基本解决方案。
- 使用您的私钥对您的公钥进行签名以创建证书。这应该可以
openssl smime
工作。 - 使用GPG。这就是它的设计目的。我根据你所描述的情况推荐这个。可能
gpg -se
,或者gpg -sea
如果您正在发送电子邮件。 (不要这样做gpg -c
,我认为这是你的“密码生成的密钥”。)
使用 SSL 或 GPG,双方都必须生成公钥和私钥,用私钥对公钥进行签名,并将签名的公钥发送给另一方。一般来说,涉及的唯一密码是对私钥进行加密,以便可以看到您文件的人无法解密您的数据。
SSL 和 PGP/GPG 之间的主要区别在于认证模型。 SSL 使用“证书颁发机构”。 PGP/GPG 使用证书链,其中 Anne 签署 Bob 的密钥,Bob 签署 Carol 的密钥,因此 Anne 可以相信 Carol 的密钥属于 Carol。
最后,如果您通过电子邮件发送文件,您可能只是想看看是否可以在电子邮件客户端中集成 SMIME 或 PGP。