Beberapa minggu lalu saya menghadapi masalah yang menarik: Saya terpaksa memindahkan algoritma penyulitan AES daripada C# ke Go. Dalam pelaksanaan Go, kami sudah mempunyai algoritma penyulitan AES, tetapi ia tidak serasi dengan pelaksanaan C# dan beberapa ujian gagal kerana hasilnya tidak sepadan, terutamanya dalam aksara terakhir.
Masalahnya ialah saya tidak mempunyai kod sumber pelaksanaan C#, hanya binari, DLL yang digunakan dalam projek .NET.
Saya cuba mendapatkan kod sumber pelaksanaan C#, tetapi tidak berjaya. Sebagai projek lama, tiada dokumentasi tersedia. Nasib baik, bos saya adalah orang yang membangunkan pelaksanaan ini, tetapi saya tidak ingat butiran yang tepat. Walau bagaimanapun, saya tahu bahawa pada penghujung proses penyulitan AES, fungsi pengekodan base64 telah digunakan.
Dengan petunjuk ini, saya membuka projek dalam .NET dan memasang sambungan JetBrains untuk menyahkompilasi kod sumber dan memperoleh kod perpustakaan yang digunakan untuk menyulitkan maklumat.
Akhirnya, saya mendapati bahawa masalahnya bukan dengan algoritma penyulitan AES, tetapi dengan pengekodan base64.
Dalam kod C#, pada penghujung proses penyulitan AES, fungsi berikut digunakan untuk pengekodan base64: HttpServerUtility.UrlTokenEncode.
Fungsi UrlTokenEncode ialah fungsi .NET yang mengekod tatasusunan bait ke dalam rentetan teks base64 untuk penghantaran dalam URL. Fungsi ini melaksanakan tiga tindakan utama yang menerangkan perbezaan hasil:
Pengekodan Base64 yang selamat dengan URL: menggunakan varian Base64 yang sesuai untuk URL, menggantikan aksara dengan - dan / dengan _.
Penyingkiran Aksara Padding: Fungsi mengeluarkan padding = aksara yang biasanya digunakan dalam pengekodan Base64 standard.
Menambah nombor pada penghujung: Fungsi menambah nombor pada penghujung rentetan untuk menunjukkan bilangan aksara padding telah dialih keluar.
Saya dapati semua ini terima kasih kepada ChatGPT, bukan kerana saya pakar dalam base64. Dengan maklumat ini, saya dapat mengubah suai pelaksanaan dalam Go agar serasi dengan C#.
Dalam Go, selepas menyulitkan maklumat dengan AES, pengekodan base64 dilakukan seperti berikut:
encode := base64.RawURLEncoding.EncodeToString(paddedBytes)
Dan akhirnya, bilangan aksara padding yang dialih keluar ditambah pada penghujung rentetan:
// Calcular el número de caracteres de relleno (`=`) que se habrían añadido paddingCount := (4 - len(paddedBytes)%3) % 4 // Añadir el conteo de relleno al final de la cadena codificada (como hace UrlTokenEncode de C#) if paddingCount > 0 { encoded += strconv.Itoa(paddingCount) }
Dalam baris paddingCount := (4 - len(paddedBytes)%3) % 4, bilangan aksara padding (=) dikira dan kemudian ditambahkan pada penghujung rentetan berkod base64:
Ringkasnya, masalahnya bukanlah algoritma penyulitan AES, tetapi pengekodan base64. Terima kasih kepada maklumat yang diperoleh daripada ChatGPT, saya dapat mengubah suai pelaksanaan dalam Go agar serasi dengan C#. Dalam kes ini, menggunakan ChatGPT sangat membantu kerana ia menjimatkan banyak masa dan sakit kepala saya; Sudah tentu, saya terpaksa melaraskan setiap jawapan sehingga keputusan kedua-dua pelaksanaan adalah sama.
Atas ialah kandungan terperinci Dari C# to Go: Mencapai Keserasian Pengekodan AES dan Base64. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!