2016-03-29 20 views
0

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.

Antwort

0

Die Byte-Arrays von BouncyCastle für die öffentlichen Schlüsselparameter p, q, g, y haben eine führende 0, während .Nets dies nicht tun. Pad mit einer führenden Null, damit BouncyCastle an .Net-Schlüsselparametern arbeitet.

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 bouncyCastleP(p.Length) As Byte 
    Dim bouncyCastleQ(q.Length) As Byte 
    Dim bouncyCastleG(g.Length) As Byte 
    Dim bouncyCastleY(y.Length) As Byte 
    Array.ConstrainedCopy(p, 0, bouncyCastleP, 1, p.Length) 
    Array.ConstrainedCopy(q, 0, bouncyCastleQ, 1, q.Length) 
    Array.ConstrainedCopy(g, 0, bouncyCastleG, 1, g.Length) 
    Array.ConstrainedCopy(y, 0, bouncyCastleY, 1, y.Length) 
    Dim pBigInt As New Org.BouncyCastle.Math.BigInteger(bouncyCastleP) 
    Dim qBigInt As New Org.BouncyCastle.Math.BigInteger(bouncyCastleQ) 
    Dim gBigInt As New Org.BouncyCastle.Math.BigInteger(bouncyCastleG) 
    Dim yBigInt As New Org.BouncyCastle.Math.BigInteger(bouncyCastleY) 
    Dim bouncyParameters As New Org.BouncyCastle.Crypto.Parameters.DsaParameters(pBigInt, qBigInt, gBigInt) 
    Dim bouncyPublicKey As New Org.BouncyCastle.Crypto.Parameters.DsaPublicKeyParameters(yBigInt, bouncyParameters) 

    'Signature 
    Dim bouncyDSA As New Org.BouncyCastle.Crypto.Signers.DsaSigner 
    bouncyDSA.Init(False, bouncyPublicKey) 
    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 

Alternativ können Sie Org.BouncyCastle.Security.DotNetUtilities.GetDsaPublicKey() verwenden, um die .Net Public-Key-Parameter BouncyCastle des zu konvertieren.