Python RSA使用NONEWithRSA为字符串签名

Python RSA使用NONEWithRSA为字符串签名,python,cryptography,rsa,pycrypto,pycryptodome,Python,Cryptography,Rsa,Pycrypto,Pycryptodome,我正在从事一个项目,在该项目中,客户端代码是Java,他们使用NONEWithRSA算法对字符串进行签名和验证 我使用PyCryptodome为给定字符串生成符号 但我还没有发现它使用了NONEWithRSA算法,因此它给出的签名与我的客户在服务器上期望的不同 python上有任何库支持此算法吗?是的,您可以将该库用于加密 这将假定您的数据已经是散列的输出,因此不会添加额外的散列: import hashlib from cryptography.hazmat.backends import d

我正在从事一个项目,在该项目中,客户端代码是Java,他们使用NONEWithRSA算法对字符串进行签名和验证

我使用PyCryptodome为给定字符串生成符号

但我还没有发现它使用了NONEWithRSA算法,因此它给出的签名与我的客户在服务器上期望的不同


python上有任何库支持此算法吗?

是的,您可以将该库用于加密

这将假定您的数据已经是散列的输出,因此不会添加额外的散列:

import hashlib
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding, rsa, utils

private_key = rsa.generate_private_key(
    public_exponent = 65537,
    key_size = 2048,
    backend = default_backend()
)
public_key = private_key.public_key()

# Compute the hash here
prehashed_msg = hashlib.sha256(b"A message I want to sign").digest()

# Sign the hash (do not perform any hashing)
signature = private_key.sign(
    prehashed_msg,
    padding.PSS(
        mgf = padding.MGF1(hashes.SHA256()),
        salt_length = padding.PSS.MAX_LENGTH),
    utils.Prehashed(hashes.SHA256())
)

# Verify
public_key.verify(
    signature,
    prehashed_msg,
    padding.PSS(
        mgf = padding.MGF1(hashes.SHA256()),
        salt_length = padding.PSS.MAX_LENGTH),
    utils.Prehashed(hashes.SHA256())
)

相关问题:签名前的哈希是签名安全性的必要组成部分。出于某种原因,Java提供了RSA签名和其他没有散列的签名,这对我来说并不清楚。这并不意味着它是安全的。停止使用NONEWithRSA,选择SHA系列。PyCryptodome在这个问题上很好,因为“不要让人们走错了路”。@Kelalalaka它的出现主要是为了允许人们实现他们自己的散列方式,例如,有一个OpenSSL散列,它在PKCS1 v1.5填充中结合了SHA-1和MD-5,但没有DER编码的散列指示,如果我没记错的话。最后这只是纯文本RSA。来自:RSA签名算法,不使用任何摘要算法,仅使用PKCS 1 v2.2中定义的RSASP1/RSAVP1原语。。顺便说一句,这并不完全正确,显然它还执行I2OSP和OS2IP函数,将大整数从字节编码到字节。所有工具包似乎都遵循PSS签名的PKCS1 v1.5。我甚至在GitHub上发现,使用原始RSA签名的功能被刻意拒绝。我猜你需要使用专门的lib,比如ChillKat或@kelalaka一个现代用途当然是RSA-KEM,尽管它是用于加密的。较旧的方案,如ISO979-UH6或7-signatures将是另一种方案。这不是明确要求的模式NoneWithRSA。恐怕仅仅是一个RSA示例是不行的。