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?
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
@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). –
[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