PyCrypto在.NET RSACryptoServiceProvider中对消息进行签名并验证签名

PyCrypto在.NET RSACryptoServiceProvider中对消息进行签名并验证签名,.net,cryptography,digital-signature,pycrypto,rsacryptoserviceprovider,.net,Cryptography,Digital Signature,Pycrypto,Rsacryptoserviceprovider,我正在尝试创建一个签名验证系统,该系统使用我的网站,该网站运行在带有PyCrypto引擎的googleapi上。 生成签名的程序非常简单: from Crypto.PublicKey import RSA from Crypto.Hash import MD5 def sign(key, message): digest = MD5.new(message).digest() signature = key.sign( digest, None )[0] signature =

我正在尝试创建一个签名验证系统,该系统使用我的网站,该网站运行在带有PyCrypto引擎的googleapi上。 生成签名的程序非常简单:

from Crypto.PublicKey import RSA
from Crypto.Hash import MD5
def sign(key, message):
   digest = MD5.new(message).digest()
   signature = key.sign( digest, None )[0]
   signature = hex(signature).replace("0x","").replace("L","").upper()
   if len(signature) % 2==1:
      signature = "0" + sig 
   return signature
密钥“key”由以下人员提供:

RSA.construct((m, e, d, p, q))
签名以十六进制字符串的形式返回,例如:“A12D……”

.NET程序是:

    Private Function Verify(ByVal message As String, ByVal sign As String) As Boolean
    Dim md5 As New MD5CryptoServiceProvider
    Dim f As New StreamReader("D:/KEY.XML")
    Dim xml As String = f.ReadToEnd
    f.Close()

    Dim rsa As New RSACryptoServiceProvider
    rsa.FromXmlString(xml)

    Dim msg_as_bytes As Byte() = Encoding.Default.GetBytes(message)
    Dim hash_as_bytes As Byte() = md5.ComputeHash(msg_as_bytes)

    ''Dim sig_as_bytes As Byte() = convtobytes(sign)

    Dim sig_as_bytes As Byte() = New Byte(sign.Length / 2 - 1) {}
    For i As Integer = 1 To sign.Length / 2
        sig_as_bytes(i - 1) = CByte("&H" & Mid(sign, (i - 1) * 2 + 1, 2))
    Next

    Return rsa.VerifyData(hash_as_bytes, "SHA1", sig_as_bytes)
End Function
但是它不起作用!!!为什么

Pycrypto和.NET接收相同的参数(模数、指数、d、p、q)

请查看两行:

digest=MD5.new(message).digest()

返回rsa.VerifyData(哈希为字节,“SHA1”,sig为字节)

即使在.NET代码中使用了
MD5CryptoServiceProvider
,您仍然要求验证使用
SHA1
,这是行不通的。尝试将此更改为
MD5

我完成了

解决方案是使用Crypto.Signature.PKCS1_v1_5

from Crypto.Hash import SHA
from Crypto.PublicKey import RSA
from Crypto.Util import number
from Crypto.Signature import PKCS1_v1_5

m = 123....
e = 1111....
d = 123....
p = 365...
q = 657...

key = RSA.construct((m, e, d, p, q))

message = "message to be signed"

def assina(message):
    h = SHA.new(message)
    signer = PKCS1_v1_5.new(key)
    signature = signer.sign(h)
    return ByteToHex(signature)
和.NET代码来验证:

Private Function Verify(ByVal message As String, ByVal sign As String) As Boolean
    Dim rsa As New RSACryptoServiceProvider()
    rsa.FromXmlString(_pubKey)

    Dim msg_as_bytes As Byte() = Encoding.Default.GetBytes(message)

    Dim sig_as_bytes As Byte() = New Byte(CInt(sign.Length / 2) - 1) {}

    For i As Integer = 1 To sign.Length / 2
        sig_as_bytes(i - 1) = CByte("&H" & Mid(sign, (i - 1) * 2 + 1, 2))
    Next

    Return rsa.VerifyData(msg_as_bytes, "SHA", sig_as_bytes)
End Function

不工作。。。rsa.VerifyData(哈希为字节,“MD5”,sig为字节)位转换器.ToString(rsa.SignData(哈希为字节,“MD5”))。替换(“-”,”)不等于python函数返回的值…使用rsa的数字签名使用填充(例如PKCS 1或OAEP),其中包括随机数据。因此,您不能期望
SignData
ok具有相同的值,那么为什么要使用该程序呢。NET未按预期返回TRUE。NET fix:rsa.VerifyData(hash_as_字节,“MD5”,sig_as_字节)我做了这些更改,但不起作用,pycrypto和.NET中的签名不相等……您还可以在Python中使用
Crypto.hash.SHA256
,在C中使用
rsa.VerifyData(msg_as_字节,“SHA256”,sig_as_字节)