Heim >Backend-Entwicklung >Golang >Entschlüsseln Sie in GO codierte C#-Zeichenfolge mithilfe der AES-GSM-Methode
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.
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?
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!