3

PyCrypto エンジンを使用して Google API で実行される Web サイトを使用する署名検証システムを作成しようとしています。署名を生成するプログラムは非常に単純です。

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.......」のような 16 進文字列として返されます。

.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) を受け取ります。

4

2 に答える 2

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
于 2012-06-23T13:22:37.080 に答える
1

両方の行を見てください。

ダイジェスト = MD5.new(メッセージ).ダイジェスト()

rsa.VerifyData(hash_as_bytes, "SHA1", sig_as_bytes) を返す

MD5CryptoServiceProvider.NET コードで を使用している場合でも、検証に使用するように求められますがSHA1、それは機能しません。これを に変更してみてくださいMD5

于 2012-04-13T12:32:41.170 に答える