Diese beiden Funktionen sollten äquivalent sein, aber VerifyBouncyCastle()
gibt false (fehlgeschlagene Verifizierung) für dieselbe Eingabe zurück, die VerifyDotNet()
wahr zurückgibt. Die Nachricht wurde mit .Net DSACryptoServiceProvider.SignHash()
signiert. Was ist los mit VerifyBouncyCastle()
, die es anders als die .Net-Version verhält?Äquivalente DSA-Verifier mit BouncyCastle und DSACryptoServiceProvider
.Net in Krypto-Bibliothek gebaut:
Private Function VerifyDotNet(hash() As Byte, p() As Byte, q() As Byte, g() As Byte, y() As Byte, r() As Byte, s() As Byte) As Boolean
'Public key
Dim dotNetDSA As New DSACryptoServiceProvider()
Dim dotNetParameters As New DSAParameters
dotNetParameters.P = p
dotNetParameters.Q = q
dotNetParameters.G = g
dotNetParameters.Y = y
dotNetDSA.ImportParameters(dotNetParameters)
'Signature
Dim signature(39) As Byte
Array.ConstrainedCopy(r, 0, signature, 0, 20)
Array.ConstrainedCopy(s, 0, signature, 20, 20)
'Verify
Return dotNetDSA.VerifyHash(hash, "SHA1", signature)
End Function
BouncyCastle:
Private Function VerifyBouncyCastle(hash() As Byte, p() As Byte, q() As Byte, g() As Byte, y() As Byte, r() As Byte, s() As Byte) As Boolean
'Public key
Dim pBigInt As New Org.BouncyCastle.Math.BigInteger(p)
Dim qBigInt As New Org.BouncyCastle.Math.BigInteger(q)
Dim gBigInt As New Org.BouncyCastle.Math.BigInteger(g)
Dim yBigInt As New Org.BouncyCastle.Math.BigInteger(y)
Dim bouncyParameters As New Org.BouncyCastle.Crypto.Parameters.DsaParameters(pBigInt, qBigInt, gBigInt)
Dim bouncyPublicKey As New Org.BouncyCastle.Crypto.Parameters.DsaPublicKeyParameters(yBigInt, bouncyParameters)
Dim bouncyDSA As New Org.BouncyCastle.Crypto.Signers.DsaSigner
bouncyDSA.Init(False, bouncyPublicKey)
'Signature
Dim signatureR As New Org.BouncyCastle.Math.BigInteger(r)
Dim signatureS As New Org.BouncyCastle.Math.BigInteger(s)
'Verify
Return bouncyDSA.VerifySignature(hash, signatureR, signatureS)
End Function
Ich habe versucht, das Byte-Arrays Umkehren und auch bestätigt, dass BouncyCastle des Sha1Digest.DoFinal()
den gleichen Hash für die gleiche Nachricht erzeugt als .Net SHA1Managed.ComputeHash()
, die verwendet wurde, um den Hash für die Unterzeichnung zu generieren.