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