2016-04-29 5 views
1

Ich benutze BouncyCastle, um Daten in C# zu verschlüsseln, mit dem AES256 GCM-Algorithmus. Dazu benutze ich die implementation provided by James Tuley. Unten ist ein Ausschnitt aus diesem Code:Wie bekomme ich ein Authentifizierungs-Tag von AES-GCM

public byte[] SimpleEncrypt(byte[] secretMessage, byte[] key, byte[] nonSecretPayload = null) 
{ 
    if (key == null || key.Length != KeyBitSize/8) 
     throw new ArgumentException($"Key needs to be {KeyBitSize} bit!", nameof(key)); 

    if (secretMessage == null || secretMessage.Length == 0) 
     throw new ArgumentException("Secret Message Required!", nameof(secretMessage)); 

    nonSecretPayload = nonSecretPayload ?? new byte[] { }; 

    byte[] nonce = _csprng.RandomBytes(NonceBitSize/8); 

    var cipher = new GcmBlockCipher(new AesFastEngine()); 
    var parameters = new AeadParameters(new KeyParameter(key), MacBitSize, nonce, nonSecretPayload); 
    cipher.Init(true, parameters); 

    var cipherText = new byte[cipher.GetOutputSize(secretMessage.Length)]; 
    int len = cipher.ProcessBytes(secretMessage, 0, secretMessage.Length, cipherText, 0); 
    cipher.DoFinal(cipherText, len); 

    using (var combinedStream = new MemoryStream()) 
    { 
     using (var binaryWriter = new BinaryWriter(combinedStream)) 
     { 
      binaryWriter.Write(nonSecretPayload); 
      binaryWriter.Write(nonce); 
      binaryWriter.Write(cipherText); 
     } 

     return combinedStream.ToArray(); 
    } 
} 

Ich brauche die Authentifizierung Tag (erwähnt in RFC 5084) zu erhalten. Er erwähnt, dass das Authentifizierungs-Tag Teil der Ausgabe ist:

AES-GCM generiert zwei Ausgaben: einen Chiffretext- und Nachrichtenauthentifizierungscode (auch als Authentifizierungs-Tag bezeichnet).

Ich verstehe nicht, obwohl, wie man die Authentifizierungsmarke von diesem Code erhält? Kann mir jemand helfen?

+0

Am Ende dieser Funktion werden drei Teile zu einem Byte-Array kombiniert (das zum Rückgabewert wird). Da "nonSecretPayload" ein Pass-Through-Parameter ist und "cipherText" eine der Ausgaben nach Standards ist, bleibt uns "nonce". Könnte es sein, dass sie sich im Standard auf das "Nonce" als "Authentifizierungs-Tag" beziehen? – dlatikay

+0

@dlatikay Ich denke nicht: "AES-GCM hat vier Eingänge: einen AES-Schlüssel, einen Initialisierungsvektor (IV), einen Klartext-Inhalt und optional zusätzliche authentifizierte Daten (AAD) .AES-GCM erzeugt zwei Ausgaben: a Chiffretext- und Nachrichtenauthentifizierungscode (auch als Authentifizierungs-Tag bezeichnet). Um einen gemeinsamen Satz von Begriffen für AES-CCM und AES-GCM zu erhalten, wird der AES-GCM IV im Rest dieses Dokuments als Nonce bezeichnet. Die IV ist also eine Eingabe, die Sicherheitskennung ist keine Eingabe, sondern eine Ausgabe (oder ein Teil davon). –

+1

[dies] (http://crypto.stackexchange.com/questions/25249/where-is-the-authentication-tag-stored-in-file-encrypted-using-aes-gcm?rq=1) deutet darauf hin, dass die Das Authentifizierungs-Tag könnte bereits ein Teil des cipherText sein, was zu der Frage führen würde, bei welchem ​​Offset es beginnen würde. Wenn dies nicht der Fall ist, muss eine zusätzliche kryptografische Hash-Funktion aufgerufen werden, um das Tag aus dem Chiffretext [here] (https://en.wikipedia.org/wiki/Authenticated_encryption#Encrypt-and-MAC_.28E.26M) zu generieren. 29) Wie auch immer, schauen wir uns den Quellcode dieser BC-Bibliothek an. – dlatikay

Antwort

1

Rufen Sie die GetMac() Funktion des cipher Objekt den Authentifizierungs-Tag zu erhalten:

... 
cipher.DoFinal(cipherText, len); 
var auth_tag = cipher.GetMac(); 
... 

Quelle: http://www.bouncycastle.org/docs/docs1.5on/org/bouncycastle/crypto/modes/GCMBlockCipher.html "Gibt den Wert des MAC mit dem letzten Strom verarbeitet assoziiert" MAC = „Message Authentication Code "

Die Dokumentation der DoFinal() Funktionsstatus" Beenden Sie den Vorgang entweder Anhängen oder Verifizieren der MAC am Ende der Daten ", die das EA zu bestätigen scheint RL-Hypothese, dass die cipherText wird auch bereits die MAC enthalten. Mit GetMacSize() sollten Sie in der Lage sein, den Offset vom Ende des cipherText zu bestimmen.

+0

Vielen Dank, das hat funktioniert. Die Ausgabe stimmt mit der Ausgabe überein, die ich in Forge (javascript) habe. –

+0

Ich weiß, dass Entschlüsselung in der Frage nicht erwähnt wird, aber seien Sie vorsichtig mit diesen spezifischen APIs, die versuchen, das Tag in einer benutzerdefinierten Weise zu verwenden, da beim Entschlüsseln eine Ausnahme ausgelöst wird, wenn es nicht automatisch überprüft. – jbtule