繁体   English   中英

RSA 签名与 Python 验证与 C#

[英]RSA signing with Python verifying with C#

我试图在 Python 中使用 RSA 签署消息,然后在 C# 中验证数据,但经过数小时的测试/战斗后仍然失败。

用于签名的 Python 代码:

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

message = b"Test string"

with open("id_rsa", "rb") as key_file:

    private_key = serialization.load_pem_private_key(
        key_file.read(),
        password=None,
    )

    signature = private_key.sign(
        message,
        padding.PKCS1v15(),
        hashes.SHA256()
    )

    signaturefile = open('signed.dat', 'wb')
    signaturefile.write(signature)
    signaturefile.close()
    
datafile = open('message.dat', 'wb')
datafile.write(message)
datafile.close()

以及用于验证的 C# 代码:

private void button_Click(object sender, EventArgs e)
{
    byte[] data = File.ReadAllBytes("message.dat");
    byte[] signature = File.ReadAllBytes("signed.dat");

    try
    {
        using (var reader = File.OpenText("id_rsa.pub"))
        {
            var pem = new PemReader(reader);
            var o = (RsaKeyParameters)pem.ReadObject();
            using (var rsa = new RSACryptoServiceProvider())
            {
                var parameters = new RSAParameters();
                parameters.Modulus = o.Modulus.ToByteArray();
                parameters.Exponent = o.Exponent.ToByteArray();
                rsa.ImportParameters(parameters);

                bool ok = rsa.VerifyData(data, signature, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);

                if (ok) Console.WriteLine("Verified");
            }
        }
    }
    catch (CryptographicException exc)
    {
        Console.WriteLine(exc.Message);
    }
}

我总是从 rsa.VerifyData 失败。 有人可以指出我有什么问题吗?

在 Python 中可以很好地验证相同的文件。

RSAParameters#ModulusRSAParameters#Exponent预计系数和指数无符号,所以Org.BouncyCastle.Math.BigInteger#ToByteArrayUnsigned()必须被用来代替Org.BouncyCastle.Math.BigInteger#ToByteArray() 通过此更改,验证成功。

此外,需要大端字节顺序,但这适用于两种方法。

请注意, System.Numerics.BigInteger#ToByteArray()返回以小端顺序签名的数据。


您当前的方法使用 BC 进行密钥导入,并使用内置的 .NET 方法进行验证。 或者,BC 类也可用于验证,从而使整体实现稍微更有效。

using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Security;
...
ISigner signer = SignerUtilities.GetSigner("SHA256withRSA");
signer.Init(false, o);
signer.BlockUpdate(data, 0, data.Length);
bool verified = signer.VerifySignature(signature);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM