【发布时间】:2019-09-04 18:07:38
【问题描述】:
我正在处理这个问题几天,但我不明白。我已经用谷歌搜索并尝试了这里指出的几种解决方案,但没有成功。我想用openssl生成的公钥加密消息(字符串)。
我正在使用这些命令生成密钥:
# Private key:
openssl genrsa -out private_key.pem 2048
# Public key:
openssl rsa -in private_key.pem -outform PEM -pubout -out public_key.pem
我想要完成的是打开公钥并用这个sn-p加密数据:
from Crypto.PublicKey import RSA
# Open RSA file
with open("public_key.pem", "r") as fk:
rsa_key = RSA.importKey(fk.read())
message_encrypted = rsa_key.encrypt("Hello.", <X>)
我不明白我要在<X> 写什么。但是当我写一些整数值时,它会因为这个错误而失败:
self = <Crypto.PublicKey._slowmath._RSAKey object at 0x7fcb153de748>, m = 'HELLO'
def _encrypt(self, m):
# compute m**d (mod n)
> return pow(m, self.e, self.n)
E TypeError: unsupported operand type(s) for pow(): 'str', 'int', 'int'
最好的问候!
【问题讨论】:
-
您使用的是 Pycrypto 还是 Pycryptodome?因为在 Pycrypto 中,K 被忽略 (ref) 并且在 Pycryptodome 中
.encrypt()引发NotImplementedError异常。因此,使用 Pycrypto,您应该能够使用任何 int 作为 K 的方法,而使用 Pycryptodome,您根本不能使用该方法。 -
从追溯看来,
._encrypt()在某个时候被调用了。该方法期望m是一个数字,但在这种情况下它是一个字符串,因此为了使用它,您应该将消息转换为一个数字。但是,此方法执行原始加密,最好避免使用它并改用OAEP。 -
@t.m.adam,我不打算使用那个参数,所以我不知道在
处写什么。 -
您可以将任何字符串或 int 作为
,无论如何都会被忽略。导致异常的是 m参数(消息)。 -
你是在告诉我这是图书馆的问题吗?
标签: python encryption openssl