OpenSSL 无法加载 Public 密钥

OpenSSL unable to load Public Key

尝试在 OSX Yosomite 10.10.2

上通过命令行加密短信

创建了 public .pem 密钥,如下所示:

ssh-keygen -f ~/.ssh/id_rsa.pub -e -t PKCS8 > id_rsa.pem

如果我尝试加密 myMessage.txt

openssl rsautl -encrypt -inkey ~/.ssh/id_rsa.pem -pubin -in ~/Desktop/myMessage.txt -out ~/Desktop/encrypted.txt

我得到unable to load Public key

如果我再输入:

openssl asn1parse -in id_rsa.pem

Returns: Error: offset too large

但我不知道如何修复它。 我应该更改什么才能使其正常工作?

仍然不知道我的问题出了什么问题,但找到了解决方案:

1) 生成 RSA 密钥:

$ openssl genrsa -out key.pem 1024 
$ openssl rsa -in key.pem -text -noout 

2) 在 pub.pem 文件中保存 public 键:

$ openssl rsa -in key.pem -pubout -out pub.pem 
$ openssl rsa -in pub.pem -pubin -text -noout 

3) 加密一些数据:

$ echo test test test > file.txt 
$ openssl rsautl -encrypt -inkey pub.pem -pubin -in file.txt -out file.bin 

4) 解密加密数据:

$ openssl rsautl -decrypt -inkey key.pem -in file.bin 

它就像一个魅力

感谢 Marek Marcola 提供的信息http://openssl.6102.n7.nabble.com/Re-Can-I-use-my-own-keys-with-openssl-for-RSA-enc-dec-td12506.html

我也遇到过这个问题,觉得这里有一个很好的提示:

How can I transform between the two styles of public key format, one "BEGIN RSA PUBLIC KEY", the other is "BEGIN PUBLIC KEY"

OpenSSL 加密命令似乎需要 SSL public 密钥而不是 RSA public 密钥。

我们现在知道的足够多,可以调整示例以使其工作。 可以使用

从 RSA public 密钥生成 SSL public 密钥
openssl rsa -in id_rsa.pem -RSAPublicKey_in -pubout > id_pub.pem

然后可以使用

进行加密步骤
openssl rsautl -encrypt -inkey id_pub.pem -pubin -in ~/Desktop/myMessage.txt -out ~/Desktop/encrypted.txt

在撰写本文时,MacOSX Yosemite 中的默认 OpenSSL 命令似乎是 0.9.8zg。此版本中的 rsa 命令不支持 运行 上面第一个命令的功能。我通过安装 OpenSSL 1.0.1p 解决了这个问题。

我在从证书中提取 public 密钥时遇到了同样的问题。

openssl x509 -pubkey -noout -in cert.crt > pubKey.pem

后来,我想用下面的命令打印有关密钥的信息。

openssl rsa -text -pubin -in pubKey.pem

并出现错误:unable to load Public Key

解决方案

我在记事本++中打开pubKey.pem,在编码菜单中选择了UCS-2 LE BOM。所以我改成了UTF-8编码。 pubKey.pem 的大小在更改编码后是原来的一半。然后它就像魅力一样。

在 Windows 和 powershell

中测试

您的初始解决方案应该有效,您只是有一个小错字:要指定密钥格式 (PKCS8),使用“-m”选项而不是“-t”选项(它代表密钥类型:dsa, ecdsa、ed25519 或 rsa)。请参阅 ssh-keygen 手册页。

ssh-keygen -f ~/.ssh/id_rsa.pub -e -m PKCS8 > id_rsa.pem

然后,你可以用这个加密:

openssl rsautl -encrypt -inkey ~/.ssh/id_rsa.pem -pubin -in ~/Desktop/myMessage.txt -out ~/Desktop/encrypted.txt

而且,您可以使用以下方式解密:

openssl rsautl -decrypt -inkey ~/.ssh/id_rsa -in ~/Desktop/encrypted.txt -out ~/Desktop/decrypted.txt

您可以使用文本编辑器或此 diff 命令检查原始文件和解密文件之间的差异:

diff ~/Desktop/myMessage.txt ~/Desktop/decrypted.txt

事实上,openssl rsautl -encrypt 命令需要一个 public 密钥和 "PEM PKCS8 public key" 编码格式,但 ssh-keygen 生成此格式的私钥和 public 其他格式的密钥,适用于 authorized_keys 目录中的 ~/.ssh 文件(您可以打开密钥使用文本编辑器查看格式之间的差异)。