3

Я пытаюсь создать систему проверки подписи, которая использует мой сайт, который работает на API Google с помощью PyCrypto Engine. Программа, которая генерирует подпись довольно проста:PyCrypto Sign Message and Verify Signature в .NET RSACryptoServiceProvider

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 

Ключ «ключ» обеспечивается:

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 получают одни и те же параметры (модуль, показатель, д, р, д)

ответ

1

Посмотрите на обеих линиях:

переваривать = MD5.new (сообщение) .digest()

Возвращение rsa.VerifyData (hash_as_bytes, "SHA1", sig_as_bytes)

Даже если вы с помощью MD5CryptoServiceProvider в коде .NET ты еще попросив проверка на использование SHA1, и это не сработает. Попробуйте изменить это на MD5.

+0

не работает ... rsa.VerifyData (hash_as_bytes, "MD5", sig_as_bytes) –

+0

BitConverter.ToString (rsa.SignData (hash_as_bytes, «MD5»)) Замените («-», «») не равным значению, возвращаемому функцией python .... –

+0

Цифровая подпись с использованием дополнения RSA (например, PKCS # 1 или OAEP), который включает случайные данные. Таким образом, вы не можете ожидать того же значения из 'SignData' – poupou

4

Я закончил!

Решение заключается в использовании 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 
+0

Вы также можете использовать 'Crypto.Hash.SHA256' в Python и' rsa.VerifyData (msg_as_bytes, "SHA256", sig_as_bytes) 'в C#. –

Смежные вопросы