2016-10-02 3 views
0

Der Versuch, AES entschlüsseln die Daten mit BounceCastle, Mac-Check in GCM fehlgeschlagen Fehler bei Zeile: output = cipher.DoFinal (cipherData);C# AES Entschlüsselung - Mac Check-in GCM fehlgeschlagen

https://github.com/psraju1/CSharpApplePayDecrypter für vollständige Code

Fehler:

mac check in GCM failed 
BouncyCastle.Crypto 
    at Org.BouncyCastle.Crypto.Modes.GcmBlockCipher.DoFinal(Byte[] output, Int32 outOff) 
    at Org.BouncyCastle.Crypto.BufferedAeadBlockCipher.DoFinal(Byte[] output, Int32 outOff) 
    at Org.BouncyCastle.Crypto.BufferedAeadBlockCipher.DoFinal(Byte[] input, Int32 inOff, Int32 inLen) 
    at Org.BouncyCastle.Crypto.BufferedCipherBase.DoFinal(Byte[] input) 
    at ApplePayDecrypter.ApplePay.DoDecrypt(Byte[] cipherData, Byte[] encryptionKeyBytes) in ApplePayDecrypter.cs:line 107 

Code:

protected byte[] RestoreSymmertricKey(byte[] sharedSecretBytes) 
{ 
    byte[] merchantIdentifier = GetHashSha256Bytes("");//applePayRequest.MerchantIdentifier); 

    ConcatenationKdfGenerator generator = new ConcatenationKdfGenerator(new Sha256Digest()); 
    byte[] COUNTER = { 0x00, 0x00, 0x00, 0x01 }; 
    byte[] algorithmIdBytes = Encoding.UTF8.GetBytes((char)0x0d + "id-aes256-GCM"); 
    byte[] partyUInfoBytes = Encoding.UTF8.GetBytes("Apple"); 
    byte[] partyVInfoBytes = merchantIdentifier; 
    byte[] otherInfoBytes = Combine(Combine(algorithmIdBytes, partyUInfoBytes), COUNTER);//, partyVInfoBytes); 

    generator.Init(new KdfParameters(sharedSecretBytes, otherInfoBytes)); 
    byte[] encryptionKeyBytes = new byte[16]; 
    generator.GenerateBytes(encryptionKeyBytes, 0, encryptionKeyBytes.Length); 
    return encryptionKeyBytes; 
} 

private byte[] DoDecrypt(byte[] cipherData, byte[] encryptionKeyBytes) 
{ 
    byte[] output; 
    try 
    { 
     KeyParameter keyparam = ParameterUtilities.CreateKeyParameter("AES", encryptionKeyBytes); 
     ParametersWithIV parameters = new ParametersWithIV(keyparam, symmetricIv); 
     IBufferedCipher cipher = GetCipher(); 
     cipher.Init(false, parameters); 
     try 
     { 
      output = cipher.DoFinal(cipherData); 
     } 
     catch (Exception ex) 
     { 
      throw new ApplicationException("Invalid Data"); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw new ApplicationException("There was an error occured when decrypting message."); 
    } 

    return output; 
} 

public IBufferedCipher GetCipher() 
{ 
    return CipherUtilities.GetCipher("AES/GCM/NoPadding"); 
} 



private static byte[] GetHashSha256Bytes(string text) 
{ 
    byte[] bytes = Encoding.UTF8.GetBytes(text); 
    SHA256Managed hashstring = new SHA256Managed(); 
    byte[] hash = hashstring.ComputeHash(bytes); 
    return hash; 
} 

protected static byte[] Combine(byte[] first, byte[] second) 
{ 
    byte[] ret = new byte[first.Length + second.Length]; 
    Buffer.BlockCopy(first, 0, ret, 0, first.Length); 
    Buffer.BlockCopy(second, 0, ret, first.Length, second.Length); 
    return ret; 
} 

Eigentlich bin ich versucht, dies für ApplePay zu entschlüsseln und zu C# Beispiel-Java-Code zu konvertieren. Lassen Sie mich wissen, wenn Sie einen Blick auf JAVA Code

werfen möchten Hier ist der vollständige Code in JAVA & C#. Überprüfen Sie bitte das.

https://github.com/psraju1/CSharpApplePayDecrypter

+0

Ja, natürlich ist es notwendig, den Code suchen Sie diese aus sind zu übersetzen. –

+0

Überprüfen Sie diese Github für vollständigen Code in C# und Java. https://github.com/psraju1/CSharpApplePayDecrypter –

Antwort

0

hatte das gleiche Problem. Bitte versuchen Sie nicht, die Händler-ID zu hashen. Es ist bereits Hashed. Und ignorieren Sie die ersten zwei Bytes davon, bevor Sie auf partyVInfo gesetzt werden. Wenn Sie merchterIdentifier von certifcate erhalten, gibt es ". @" Am Anfang des Hashs. Dies muss

byte[] partyVInfo = ExtractMIdentifier(); 

private byte[] ExtractMIdentifier() 
{ 
    X509Certificate2 merchantCertificate = InflateCertificate(); 
    byte[] merchantIdentifierTlv = merchantCertificate.Extensions["1.2.840.113635.100.6.32"].RawData; 
    byte[] merchantIdentifier = new byte[64]; 

    Buffer.BlockCopy(merchantIdentifierTlv, 2, merchantIdentifier, 0, 64); 

    return Hex.Decode(Encoding.ASCII.GetString(merchantIdentifier)); 
} 

Partei V Info Die SHA-256 Hash-Wert der Händlerkennung gelöscht werden. Dieser Wert ist eine Bitfolge fester Länge.

Ich verwende SHA-256-Hash nicht und löschte die ersten zwei Bytes der Händlerkennung. Jetzt funktioniert es.

0

Nachdem ich Lous Ratschlag befolgt hatte, brauchte ich zwei weitere Änderungen, um es zum Laufen zu bringen.

  • I wurde von COUNTER rid und verwenden partyVInfoByes
  • I encryptionKeyBytes geändert ein Array von 32 anstelle von 16 Bytes sein, da es 256-Bit ECC (32 * 8 = 256)

RestoreSymmetricKey jetzt sieht wie folgt aus:

protected byte[] RestoreSymmertricKey(byte[] sharedSecretBytes) 
{ 
    byte[] merchantIdentifier = ExtractMIdentifier(); 

    ConcatenationKdfGenerator generator = new ConcatenationKdfGenerator(new Sha256Digest()); 
    byte[] algorithmIdBytes = Encoding.UTF8.GetBytes((char)0x0d + "id-aes256-GCM"); 
    byte[] partyUInfoBytes = Encoding.UTF8.GetBytes("Apple"); 
    byte[] partyVInfoBytes = merchantIdentifier; 
    byte[] otherInfoBytes = Combine(Combine(algorithmIdBytes, partyUInfoBytes), partyVInfoBytes); 

    generator.Init(new KdfParameters(sharedSecretBytes, otherInfoBytes)); 
    byte[] encryptionKeyBytes = new byte[32]; 
    generator.GenerateBytes(encryptionKeyBytes, 0, encryptionKeyBytes.Length); 
    return encryptionKeyBytes; 
} 
Verwandte Themen