


Nyahsulit rentetan C# yang dikodkan dalam GO menggunakan kaedah AES-GSM
editor php Xigua memperkenalkan anda kepada kaedah menyahsulit rentetan C# dalam bahasa GO - AES-GSM. AES-GSM ialah standard penyulitan lanjutan yang menggabungkan kelebihan AES (Advanced Encryption Standard) dan GSM (Global System for Mobile Communications). Dengan menggunakan kaedah AES-GSM, kami boleh menyahsulit rentetan C# yang dikodkan dalam GO dengan berkesan, membolehkan penghantaran dan perlindungan data yang selamat. Artikel ini akan memperkenalkan prinsip dan langkah penggunaan AES-GSM secara terperinci untuk membantu pembaca menguasai teknologi penyulitan dan penyahsulitan ini dengan mudah.
Kandungan soalan
Saya mempunyai rentetan yang disulitkan dengan aes-gcm dalam go dan frasa laluannya dan cuba menyahsulitnya dalam c#. Walau bagaimanapun, saya tidak dapat mencari cara yang betul untuk menyahsulitnya dalam c#. Ralat yang saya dapat menyebut bahawa saiz iv, panjang blok tidak sesuai untuk algoritma penyahsulitan c#. Berikut adalah nilai-nilai dalam perjalanan:
aes encr/decr passphrase: this-is-a-test-passphrase
input string: text to encrypt hello world 123
encrypted string: 94b681ef29d9a6d7-e6fa36c4c00977de1745fc63-a1ad0481bdbeeaa02c013a2dce82520ddd762355e18f1e2f20c0ea9d001ece24e9b8216ed4b9c6a06e1ef34c953f80
kod go: https://go.dev/play/p/jn8ie61ntzw
Ini ialah kod penyahsulitan dalam 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 }
Ini ialah kod penyulitan dalam 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) }
Saya cuba meniru log masuk yang dinyahsulit yang sama dalam c# supaya ia akan dapat menyahsulit dan menjana rentetan akhir.
Saya mencuba beberapa logik penyahsulitan dalam c#, ia boleh didapati di sini:
https://dotnetfiddle.net/32sb5m Fungsi ini menggunakan ruang nama system.security.cryptography tetapi menyebabkan saiz iv menjadi salah.
https://dotnetfiddle.net/wxkuyr Versi yang diubah suai di atas untuk .net 5 akan menghasilkan keputusan yang sama
https://dotnetfiddle.net/6iftps Menggunakan perpustakaan bouncy castle menyebabkan ralat "mac check in gcm failed"
https://dotnetfiddle.net/8mjs3g Pendekatan alternatif menggunakan kaedah rfc2898derivebytes menghasilkan ralat mengatakan "Token pengesahan yang dikira tidak sepadan dengan token pengesahan input"
Adakah kaedah yang digunakan pada masa ini betul atau adakah terdapat cara lain untuk menyahsulit aes-gcm dalam c#? Apakah yang boleh dilakukan untuk memintas ralat ini apabila ia berkaitan dengan c#?
Penyelesaian
Anda hampir dengan kod terakhir. go Menambahkan teg pengesahan pada penghujung teks sifir yang dijana. Anda mengekstraknya dengan betul di sini:
// extract the tag from the encrypted byte array byte[] tag = new byte[16]; array.copy(encrypteddata, encrypteddata.length - 16, tag, 0, 16);
Walau bagaimanapun, anda terus menganggap tatasusunan dengan teks yang disulitkan + token pengesahan sebagai hanya mengandungi teks yang disulitkan. Untuk membetulkannya, ekstraknya juga:
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); }
Atas ialah kandungan terperinci Nyahsulit rentetan C# yang dikodkan dalam GO menggunakan kaedah AES-GSM. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Perpustakaan yang digunakan untuk operasi nombor terapung dalam bahasa Go memperkenalkan cara memastikan ketepatannya ...

Masalah Threading Giliran di GO Crawler Colly meneroka masalah menggunakan Perpustakaan Colly Crawler dalam bahasa Go, pemaju sering menghadapi masalah dengan benang dan permintaan beratur. � ...

Perbezaan antara percetakan rentetan dalam bahasa Go: perbezaan kesan menggunakan fungsi println dan rentetan () sedang ...

Masalah menggunakan redisstream untuk melaksanakan beratur mesej dalam bahasa Go menggunakan bahasa Go dan redis ...

Apa yang perlu saya lakukan jika label struktur tersuai di Goland tidak dipaparkan? Apabila menggunakan Goland untuk Pembangunan Bahasa GO, banyak pemaju akan menghadapi tag struktur tersuai ...

Perpustakaan mana yang dibangunkan oleh syarikat besar atau projek sumber terbuka yang terkenal? Semasa pengaturcaraan di GO, pemaju sering menghadapi beberapa keperluan biasa, ...

Dua cara untuk menentukan struktur dalam bahasa Go: perbezaan antara VAR dan jenis kata kunci. Apabila menentukan struktur, pergi bahasa sering melihat dua cara menulis yang berbeza: pertama ...

Apabila menggunakan SQL.Open, mengapa DSN tidak melaporkan ralat? Dalam bahasa Go, sql.open ...
