如何通过命令行参数导入 RSA 密钥



我一直在使用 Pycrypto 模块来生成 RSA 公钥/私钥对,并尝试通过将公钥作为命令行参数发送来导入密钥:

from Crypto.PublicKey import RSA
from Crypto import Random
import sys
input_key = sys.argv[1]
print('n')
print(type(input_key))
print('n')
print(input_key)
print('n')
public_key = RSA.importKey(input_key)
print(type(public_key))

但我得到输出:

$ python3 encrypt.py '-----BEGIN PUBLIC KEY-----nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaIRYO3hxr0ObcYcgKtxFequ6pn9HVV8E95ghUUHmydVJYy16Ip9F6ik7G8wBU7X3VIfjdxHAtrwY9doCy8Ype6NNionS/ErGRtUQ1jgyT2f9okIdroEipnh1zwbXQcxveaxlwBhp7OFGZ/0W3FKgJLYtyzWnEhfPO+8GkT0eLH5FaQIDAQABn-----END'
  >>> <class 'str'>
-----BEGIN PUBLIC KEY-----nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaIRYO3hxr0ObcYcgKtxFequ6pn9HVV8E95ghUUHmydVJYy16Ip9F6ik7G8wBU7X3VIfjdxHAtrwY9doCy8Ype6NNionS/ErGRtUQ1jgyT2f9okIdroEipnh1zwbXQcxveaxlwBhp7OFGZ/0W3FKgJLYtyzWnEhfPO+8GkT0eLH5FaQIDAQABn-----END PUBLIC KEY-----
   Traceback (most recent call last):
File "encrypt.py", line 13, in <module>
  public_key = RSA.importKey(input_key)
File "/usr/lib/python3/dist-packages/Crypto/PublicKey/RSA.py", line 638, in importKey
if lines[1].startswith(b('Proc-Type:4,ENCRYPTED')):
  IndexError: list index out of range

但是当我将相同的密钥复制到 Python 解释器中时,我得到这些:

>>> input_key = '-----BEGIN PUBLIC KEY-----nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaIRYO3hxr0ObcYcgKtxFequ6pn9HVV8E95ghUUHmydVJYy16Ip9F6ik7G8wBU7X3VIfjdxHAtrwY9doCy8Ype6NNionS/ErGRtUQ1jgyT2f9okIdroEipnh1zwbXQcxveaxlwBhp7OFGZ/0W3FKgJLYtyzWnEhfPO+8GkT0eLH5FaQIDAQABn-----END PUBLIC KEY-----'
>>> pub_key = RSA.importKey(input_key)
>>> type(pub_key)
    <class 'Crypto.PublicKey.RSA._RSAobj'>

如何将它们导入为命令行参数?

执行时

$ python3 encrypt.py '-----开始公钥-----MIG..."

shell 不会将n解释为换行转义,而是解释为文字反斜杠+n,这就是您的程序在 sys.argv[1] 中看到的。

您可以在转义的外壳字符串中使用换行符,因此这应该有效:

$ python3 encrypt.py '-----开始公钥-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaIRYO3hxr0ObcYcgKtxFequ6p9HVV8E95ghUUHmydVJYy16Ip9F6ik7G8wBU7X3VIfjdxHAtrwY9doCy8Ype6NNioS/ErGRtUQ1jgyT2f9okIdroEipnh1zwbXQcxveaxlwBhp7OFGZ/0W3FKgJLYtyzWEhfPO+8GkT0eLH5FaQIDAQAB-----结束公钥-----"

如果你真的想使用带有转义的字符串,你可以通过执行input_key = sys.argv[1].replace('\n', 'n')在程序中自己处理转义,或者让 shell 执行转义,例如通过 echo: $ python3 encrypt.py "$(echo -ne '-----BEGIN PUBLIC KEY-----nMIG...')" 传递字符串。

最新更新