Maison > développement back-end > Golang > le corps du texte

Décrypter la chaîne C# codée en GO à l'aide de la méthode AES-GSM

PHPz
Libérer: 2024-02-10 09:39:09
avant
1119 Les gens l'ont consulté

使用 AES-GSM 方法解密在 GO 中编码的 C# 字符串

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.

Contenu de la question

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
Copier après la connexion
input string:  text to encrypt hello world 123
Copier après la connexion
encrypted string:  94b681ef29d9a6d7-e6fa36c4c00977de1745fc63-a1ad0481bdbeeaa02c013a2dce82520ddd762355e18f1e2f20c0ea9d001ece24e9b8216ed4b9c6a06e1ef34c953f80
Copier après la connexion

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
}
Copier après la connexion

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)
}
Copier après la connexion

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# ?

Solution

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);
Copier après la connexion

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);
}
Copier après la connexion

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!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!