【问题标题】:rsa sha1 encrypt using pythonrsa sha1 使用 python 加密
【发布时间】:2019-02-04 11:52:00
【问题描述】:

我想在 python 中使用 Rsa Sha1 加密来加密一个字符串。我有 C# 代码,但我不知道它在 python 中是怎样的。如果可以,请帮助我!

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(“<RSAKeyValue><Modulus>oQRshGhLf2Fh...”);
string data = "something";
 byte[] signMain = rsa.SignData(Encoding.UTF8.GetBytes(data), new
SHA1CryptoServiceProvider());
 sign = Convert.ToBase64String(signMain);

【问题讨论】:

标签: python encryption rsa


【解决方案1】:

我会在这里使用cryptography project。它有full RSA signing support。请参阅cryptography section of the Hitchhiker's Guide to Python 了解替代选项。

.NET RSACryptoServiceProvider 对象 doesn't let you set a padding algorithm,它将始终使用 PKCS1v15,因此请在 Python 代码中选择该填充。

首先,我要convert that XML document to a PEM format,这样你就可以load the public key from that format。我不知道有任何 Python 库可以直接加载 .NET / XKMS 2.0 XML format

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

private_key_pem = b'-----BEGIN {format}-----\n...\n-----END {format}-----'
private_key = serialization.load_pem_private_key(
    private_key_pem,
    password=None,
    backend=default_backend()
)

或者,使用Python XML parser,您可能可以将该XML 文档中的数据提供给RSAPublicNumbers()RSAPrivateNumbers() 对,然后使用RSAPrivateNumbers.private_key() method 生成一个RSA 私钥对象以进行签名。您必须使用 big endian byte ordering 对 XML 数据和 convert from bytes to integer 进行 base64 解码。

然后您可以使用私钥进行签名:

from base64 import b64encode

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding

data = "something"
signature = private_key.sign(data.encode('utf8'), padding.PKCS1v15(), hashes.SHA1())
signature_base64 = b64encode(signature)

【讨论】:

  • 我有以下错误:AttributeError: '_RSAPrivateKey' object has no attribute 'sign' @martijn-pieters
  • @MaZaN:嗯,我得看看这到底是什么意思。我无法重现该错误,我的 cryptography.hazmat.backends.openssl.rsa._RSAPrivateKey 有一个 sign 方法。
  • @MaZaN:你安装了哪个版本的cryptographyRSAPrivateKey.sign() method requires version 1.4 or newer。使用import cryptography 然后cryptography.__version__ 找出答案。我用 2.3.1 和 2.5(最新)测试了这段代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-08
  • 2021-08-18
  • 2011-09-12
  • 1970-01-01
  • 2013-07-04
  • 2017-06-20
相关资源
最近更新 更多