6 votes

comment rembourrer les données avant le cryptage avec Bouncy Castle

J'essaie de chiffrer mes données avec l'algorithme AES en mode CBC. Pour cette raison, j'utilise la bibliothèque .Net 'Bouncy Castle'. Je n'ai pas de connaissances en cryptographie, j'essaie donc de l'utiliser de manière simple. Voici mon code de cryptage

public byte[] encrypt(byte[] key, byte[] iv,byte[] data) 
    {
        IBlockCipher engine=new AesFastEngine();
        KeyParameter keyParam = new KeyParameter(key);
        CbcBlockCipher cipher = new CbcBlockCipher(engine);

        ICipherParameters parameters = new ParametersWithIV(keyParam, iv);

        byte[] output=new byte[16+data.Length];
        cipher.Init(true, parameters);
        cipher.ProcessBlock(data, 0, output, data.Length);

        //process output
        byte[] cipherArray = new byte[data.Length];
        /*
        int k=0;
        for (int i = 0; i < output.Length; i++) 
        {
            if (output[i]!= 0) 
            {
                cipherArray[k++] = output[i];
            }
        }
         */
        return cipherArray;

    }

Lorsque j'essaie une entrée qui n'est pas un multiplicateur de 16, j'obtiens une exception. Lorsque je complète le tableau à droite avec un nombre de (16-length%16) avec des zéros à gauche, je peux obtenir un résultat. Mais ce résultat me pose également un problème. Il me donne un résultat comme celui-ci :

[0][0][0][0[111][22][33][44][66][77][33][12][32][23][0][0][0][0][0] 

des zéros à gauche et à droite.

Je pensais que c'était peut-être à cause de mon utilisation de ProcessBlock(data, 0, output, data.Length) fonction. Je l'utilise en supposant que la sortie sera mon texte chiffré, mais il semble que la sortie devrait être plus longue que la longueur d'entrée. Comme je n'ai pas de documentation sur cette fonction, je l'utilise peut-être de manière incorrecte. Toute aide serait appréciée

5voto

jbtule Points 11159

Le château gonflable fera le rembourrage pour vous. Pour commencer, vous devez installer votre château comme suit :

  PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CbcBlockCipher(engine), new Pkcs7Padding());

Pour que le reste de votre code fonctionne, il faudrait utiliser cipher.GetOutputSize(data.Length) ProcessBytes et DoFinal pour que le rembourrage soit ajouté correctement.

byte[] output = new byte[cipher.GetOutputSize(data.Length)];
int len = cipher.ProcessBytes(data, 0, data.Length, output, 0);
cipher.DoFinal(output, len);

J'ai un exemple simple sur l'utilisation de AES-GCM dans le château gonflable sur CodeReview

AES-GCM ajoute le chiffrement authentifié, mais le principe de base de l'utilisation de l'api est le même.

J'ai également un portage C# du cadre de cryptage de haut niveau, Kecyzar que j'ai utilisé Bouncy Castle comme backend, bien que ce soit un exemple plus difficile, le code de chiffrement abstrait SymmetricStream est configuré pour utiliser AES-CBC dans BouncyAesKey

3voto

Duncan Points 22780

En général, on utilise un algorithme de remplissage standard pour s'assurer que les données du texte en clair sont alignées sur la taille du bloc pour un chiffrement.

Vous êtes en train de coder à la main Rembourrage zéro . Ce n'est pas un bon choix, car il interdit aux données originales de se terminer par un octet zéro - comment le distinguer du remplissage ?

Je vous recommande d'utiliser un rembourrage standard, tel que Rembourrage PKCS #7 . Notez que l'on parle souvent de " Rembourrage PKCS #5 ", car ils sont très similaires.

Vous pouvez vous référer à cette autre question sur l'OS. Cryptage/décryptage avec Bouncy Castle en C# - pour un exemple d'utilisation du rembourrage standard.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X