2009-07-17 10 views
3

J'ai actuellement une fonction [C#] qui prend un octet [] et un alignement pour le régler, mais pendant le cryptage, une erreur est lancée de temps en temps.Pad octet [] à multiple de 16 octets pour AES Encryption

private byte[] AlignByteArray(byte[] content, int alignto) 
    { 
     long thelength = content.Length - 1; 
     long remainder = 1; 

     while (remainder != 0) 
     { 
      thelength += 1; 
      remainder = thelength % alignto; 
     } 
     Array.Resize(ref content, (int)thelength); 
     return content; 
    } 

Est-ce que quelqu'un voit des problèmes avec la fonction? J'obtiens des erreurs que la taille du contenu n'est pas valide pendant le cryptage AES, suggérant que ce n'est pas bourrage correct.

+1

Je ne pense pas que vous voulez "aligner". Ce dont vous parlez, c'est du rembourrage. – Cheeso

Répondre

10

Voici une solution simple:

private static void PadToMultipleOf(ref byte[] src, int pad) 
{ 
    int len = (src.Length + pad - 1)/pad * pad; 
    Array.Resize(ref src, len); 
} 
+0

Je pense que vous voudriez retourner src ou passer src par réf. – TrueWill

+0

Bonne capture @TrueWill – plinth

+1

c'est le bon pad. pour le tampon gauche? –

1

Etes-vous sûr que c'est 0x16 et non 16? (Je pensais qu'il était 16 donc je suppose que).

Éditer: Tout compilateur décent doit transformer (x/16) en (x >> 4).

int length = 16 * ((content.Length + 15)/16); 
Array.Resize(ref content, length); 

Edit 2: Pour usage général:

int length = alignment * ((content.Length + alignment - 1)/alignment); 
Array.Resize(ref content, length);