Heim  >  Artikel  >  Backend-Entwicklung  >  Entschlüsseln Sie in GO codierte C#-Zeichenfolge mithilfe der AES-GSM-Methode

Entschlüsseln Sie in GO codierte C#-Zeichenfolge mithilfe der AES-GSM-Methode

PHPz
PHPznach vorne
2024-02-10 09:39:091114Durchsuche

使用 AES-GSM 方法解密在 GO 中编码的 C# 字符串

php-Editor Xigua stellt Ihnen eine Methode zum Entschlüsseln von C#-Strings in der GO-Sprache vor – AES-GSM. AES-GSM ist ein fortschrittlicher Verschlüsselungsstandard, der die Vorteile von AES (Advanced Encryption Standard) und GSM (Global System for Mobile Communications) vereint. Mithilfe der AES-GSM-Methode können wir in GO codierte C#-Strings effektiv entschlüsseln und so eine sichere Übertragung und den Schutz von Daten ermöglichen. In diesem Artikel werden die Prinzipien und Nutzungsschritte von AES-GSM im Detail vorgestellt, um den Lesern die einfache Beherrschung dieser Verschlüsselungs- und Entschlüsselungstechnologie zu erleichtern.

Frageninhalt

Ich habe eine mit aes-gcm in go verschlüsselte Zeichenfolge und ihre Passphrase und versuche, sie in c# zu entschlüsseln. Ich kann jedoch nicht den richtigen Weg finden, es in c# zu entschlüsseln. Der Fehler, den ich erhalte, besagt, dass die Größe des iv, die Länge des Blocks, nicht für den C#-Entschlüsselungsalgorithmus geeignet ist. Hier sind die Werte in go:

aes encr/decr passphrase:  this-is-a-test-passphrase
input string:  text to encrypt hello world 123
encrypted string:  94b681ef29d9a6d7-e6fa36c4c00977de1745fc63-a1ad0481bdbeeaa02c013a2dce82520ddd762355e18f1e2f20c0ea9d001ece24e9b8216ed4b9c6a06e1ef34c953f80

Go-Code: https://go.dev/play/p/jn8ie61ntzw

Dies ist der Entschlüsselungscode in go

func appdecryptimpl(passphrase, ciphertext string) string {
arr := strings.split(ciphertext, "-")
salt, _ := hex.decodestring(arr[0])
iv, _ := hex.decodestring(arr[1])
data, _ := hex.decodestring(arr[2])
key, _ := appderivekey(passphrase, salt)
b, _ := aes.newcipher(key)
aesgcm, _ := cipher.newgcm(b)
data, _ = aesgcm.open(nil, iv, data, nil)
return string(data)
}

func appderivekey(passphrase string, salt []byte) ([]byte, []byte) {
if salt == nil {
    salt = make([]byte, 8)
    rand.read(salt)
}
return pbkdf2.key([]byte(passphrase), salt, 1000, 32, sha256.new), salt
}

Dies ist der Verschlüsselungscode in go

func AppEncryptImpl(passphrase string, plaintext string) string {
key, salt := appDeriveKey(passphrase, nil)
iv := make([]byte, 12)
rand.Read(iv)
b, _ := aes.NewCipher(key)
aesgcm, _ := cipher.NewGCM(b)
data := aesgcm.Seal(nil, iv, []byte(plaintext), nil)
return hex.EncodeToString(salt) + "-" + hex.EncodeToString(iv) + "-" + hex.EncodeToString(data)
}

Ich versuche, denselben entschlüsselten Login in c# zu replizieren, damit er die endgültige Zeichenfolge entschlüsseln und generieren kann.

Ich habe mehrere Entschlüsselungslogiken in c# ausprobiert, sie finden Sie hier:

  • https://dotnetfiddle.net/32sb5m Diese Funktion verwendet den Namespace system.security.cryptography, führt jedoch zu einer falschen iv-Größe.

  • https://dotnetfiddle.net/wxkuyr Eine modifizierte Version des oben Gesagten für .net 5 führt zu denselben Ergebnissen

  • https://dotnetfiddle.net/6iftps Die Verwendung der Hüpfburg-Bibliothek verursacht den Fehler „Mac Check-in GCM fehlgeschlagen“

  • https://dotnetfiddle.net/8mjs3g Ein alternativer Ansatz, der die Methode rfc2898derivebytes verwendet, erzeugt die Fehlermeldung „Berechnetes Authentifizierungstoken stimmt nicht mit eingegebenem Authentifizierungstoken überein“

Ist die derzeit verwendete Methode korrekt oder gibt es eine andere Möglichkeit, aes-gcm in c# zu entschlüsseln? Was kann getan werden, um diese Fehler in Bezug auf C# zu umgehen?

Lösung

Sie sind kurz vor dem letzten Code. go Hängt das Authentifizierungs-Tag an das Ende des generierten Chiffretexts an. Du hast es hier richtig extrahiert:

// extract the tag from the encrypted byte array
byte[] tag = new byte[16];
array.copy(encrypteddata, encrypteddata.length - 16, tag, 0, 16);

Allerdings behandeln Sie das Array mit dem tatsächlichen verschlüsselten Text + Authentifizierungstoken weiterhin so, als ob es nur verschlüsselten Text enthält. Um das Problem zu beheben, extrahieren Sie es ebenfalls:

public static void Main() {
    // This is the encrypted string that you provided
    string encryptedString = "a6c0952b78967559-2953e738b9b005028bf4f6c0-7b8464d1ed75bc38b4503f6c8d25d6bfc22a19cc1a8a92bc6faa1ed6cd837b97072bc8e16fd95b6cfca67fccbad8fc";

    // This is the passphrase that you provided
    string passphrase = "this-is-a-test-passphrase";

    string[] splitStrs = encryptedString.Split('-');

    byte[] salt = Convert.FromHexString(splitStrs[0]);
    byte[] iv = Convert.FromHexString(splitStrs[1]);
    // this is encrypted data + tag
    byte[] encryptedDataWithTag = Convert.FromHexString(splitStrs[2]);
    // Extract the tag from the encrypted byte array
    byte[] tag = new byte[16];
    // But also extract actual encrypted data
    byte[] encryptedData = new byte[encryptedDataWithTag.Length - 16];
    Array.Copy(encryptedDataWithTag, 0, encryptedData, 0, encryptedData.Length);
    Array.Copy(encryptedDataWithTag, encryptedDataWithTag.Length - 16, tag, 0, 16);
    byte[] key = new Rfc2898DeriveBytes(passphrase, salt, 1000, HashAlgorithmName.SHA256).GetBytes(32);
    // Create an AesGcm object
    AesGcm aesGcm = new AesGcm(key);
    int textLength = encryptedData.Length;
    // Decrypt the ciphertext
    byte[] plaintext = new byte[textLength];
    aesGcm.Decrypt(iv, encryptedData, tag, plaintext);
    // Convert the plaintext to a string and print it
    string decryptedString = Encoding.UTF8.GetString(plaintext);
    Console.WriteLine(decryptedString);
}

Das obige ist der detaillierte Inhalt vonEntschlüsseln Sie in GO codierte C#-Zeichenfolge mithilfe der AES-GSM-Methode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen