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

PHPz
Freigeben: 2024-02-10 09:39:09
nach vorne
1119 Leute haben es durchsucht

使用 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
Nach dem Login kopieren
input string:  text to encrypt hello world 123
Nach dem Login kopieren
encrypted string:  94b681ef29d9a6d7-e6fa36c4c00977de1745fc63-a1ad0481bdbeeaa02c013a2dce82520ddd762355e18f1e2f20c0ea9d001ece24e9b8216ed4b9c6a06e1ef34c953f80
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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);
Nach dem Login kopieren

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);
}
Nach dem Login kopieren

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!