l'éditeur php Xigua vous présente une méthode de décryptage des chaînes C# en langage GO - AES-GSM. AES-GSM est une norme de cryptage avancée qui combine les avantages de l'AES (Advanced Encryption Standard) et du GSM (Global System for Mobile Communications). En utilisant la méthode AES-GSM, nous pouvons décrypter efficacement les chaînes C# codées en GO, permettant une transmission sécurisée et une protection des données. Cet article présentera en détail les principes et les étapes d'utilisation d'AES-GSM pour aider les lecteurs à maîtriser facilement cette technologie de cryptage et de décryptage.
J'ai une chaîne cryptée avec aes-gcm en go et sa phrase secrète et j'essaie de la déchiffrer en c#. Cependant, je ne trouve pas la bonne façon de le décrypter en c#. L'erreur que je reçois mentionne que la taille du iv, la longueur du bloc ne convient pas à l'algorithme de décryptage c#. Voici les valeurs en 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
Voici le code de décryptage en 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 }
Voici le code de cryptage en 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) }
J'essaie de répliquer la même connexion déchiffrée en c# afin qu'elle puisse déchiffrer et générer la chaîne finale.
J'ai essayé plusieurs logiques de décryptage en c#, elles peuvent être trouvées ici :
https://dotnetfiddle.net/32sb5m Cette fonction utilise l'espace de noms system.security.cryptography mais entraîne une erreur de taille iv.
https://dotnetfiddle.net/wxkuyr Une version modifiée de ce qui précède pour .net 5 produira les mêmes résultats
https://dotnetfiddle.net/6iftps L'utilisation de la bibliothèque de château gonflable provoque l'erreur "échec de l'enregistrement Mac dans GCM"
https://dotnetfiddle.net/8mjs3g Une approche alternative utilisant la méthode rfc2898derivebytes produit une erreur disant "Le jeton d'authentification calculé ne correspond pas au jeton d'authentification d'entrée"
La méthode actuellement utilisée est-elle correcte ou existe-t-il un autre moyen de déchiffrer aes-gcm en c# ? Que peut-on faire pour contourner ces erreurs en matière de c# ?
Vous êtes proche du dernier code. go Ajoute la balise d'authentification à la fin du texte chiffré généré. Vous l'avez extrait correctement ici :
// extract the tag from the encrypted byte array byte[] tag = new byte[16]; array.copy(encrypteddata, encrypteddata.length - 16, tag, 0, 16);
Cependant, vous continuez à traiter le tableau avec le texte crypté + le jeton d'authentification comme contenant uniquement du texte crypté. Pour réparer, extrayez-le aussi :
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); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!