是否可以使用 pycryptodome 或任何其他库在 python 中使用私钥加密消息?我知道你不应该用私钥加密并用公钥解密,但我的目的是用私钥加密,这样接收方就可以确定消息是由真正的作者发送的。不仅仅是安全加密我正在寻找某种混淆。我想做一个消息公开的应用程序,但只有拥有公钥才能看到。我试过这样做:
from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
import base64
def generate_keys():
modulus_lenght = 256 * 4
private_key = RSA.generate(modulus_lenght, Random.new().read)
public_key = private_key.publickey()
return private_key, public_key
def encrypt_private_key(a_message, private_key):
encryptor = PKCS1_OAEP.new(private_key)
encrypted_msg = encryptor.encrypt(a_message)
encoded_encrypted_msg = base64.b64encode(encrypted_msg)
return encoded_encrypted_msg
def decrypt_public_key(encoded_encrypted_msg, public_key):
encryptor = PKCS1_OAEP.new(public_key)
decoded_encrypted_msg = base64.b64decode(encoded_encrypted_msg)
decoded_decrypted_msg = encryptor.decrypt(decoded_encrypted_msg)
return decoded_decrypted_msg
private_key, public_key = generate_keys()
message = "Hello world"
encoded = encrypt_private_key(message, private_key)
decoded = decrypt_public_key(encoded, public_key)
print decoded
但它会引发下一个错误:TypeError: This is not a private key。
原文由 Cesar Cabrera 发布,翻译遵循 CC BY-SA 4.0 许可协议
简答
长答案
我很好奇你的问题然后我开始尝试编码
过了一会儿我意识到如果你运行这个片段你会看到它正常工作:
但是,如果您现在将最后两行 [即键的作用] 更改为:
并重新运行该程序,您将获得
TypeError: No private key
让我引用 这个很棒的答案:
“事实证明,PyCrypto 只是试图防止您在这里将一个误认为另一个,OpenSSL 或 Ruby OpenSSL 允许您同时执行以下操作:public_encrypt/public_decrypt 和 private_encrypt/private_decrypt
[…]
为了使结果在实践中可用,还需要注意其他事项。这就是为什么 PyCrypto 中有一个专用的 签名包——这有效地完成了你所描述的,而且还额外处理了我提到的事情”
调整 此链接 我得到以下代码应该可以解决您的问题:
最后说明:
print
s 有ascii
因为如此 处 所述“然而,在 base64 的情况下,所有字符都是有效的 ASCII 字符”