AES remplissage PKCS7
Je viens de commencer à apprendre à Château Gonflable pour les AES chiffrement/déchiffrement. Je suis à l'aide de AES/CBC/PKCS7PADDING
avec une clé de 256 bits.
La colombie-britannique peuvent chiffrer et de déchiffrer un texte avec succès, cependant, après déchiffrement je remarque qu'il y a toujours un peu de rembourrage de null (0x00), qui par conséquent n'est pas mon hachage de comparaison. Par exemple, supposons que l'origine de la chaîne d'entrée est “1234567890”
, décryptée tableau d'octets est toujours:
{0x49,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x48,0x00,0x00,0x00,0x00,0x00,0x00}
Pourquoi le rembourrage n'est pas 0x06,0x06,0x06,0x06,0x06,0x06
? Et est-il possible de façon déterministe dire le rembourrage longueur (peut être à 0) après le cryptage de sorte que je peux obtenir exactement la même chaîne de caractères avant le cryptage?
OriginalL'auteur user908645 | 2015-02-18
Vous devez vous connecter pour publier un commentaire.
Lorsque vous spécifiez PKCS7, BC va ajouter le rembourrage pour les données avant de les crypter et de les enlever à nouveau lors du déchiffrement. PKCS7 avec AES serait toujours ajouter au moins 1 octet de remplissage, et ajouter assez de données pour faire l'entrée d'un multiple de l'AES de la taille du bloc. Lors de déchiffrer le rembourrage est vérifié pour être correcte, et dans le cas de PKCS7 aussi servir comme un indicateur de la quantité du dernier bloc de données déchiffrées est de rembourrage, et combien est-réel des données.
Si vous essayez de décryptage chiffré et collier de données sans préciser PKCS7 dans le déchiffrer étape, le rembourrage en serait encore à la restitution des données.
Edit:
Pour illustrer mon point de vue .. voici quelques code Java qui permet de crypter "1234567890" avec AES/SRC/PKCS7, et le déchiffre à nouveau à la fois avec et sans le PKCS7 padding:
De sortie:
Lors du déchiffrement avec le rembourrage en option, la sortie ont été rayé de la marge et le chiffre qui indique 10 octets de données déchiffrées - le reste de la mémoire tampon est de 0 rempli. Décryptage sans le rembourrage en option, les résultats dans le rembourrage maintenant partie de la restitution des données.
Edit2:
Voyons maintenant le code d'origine, confirme mon intuition. La methode
GetOutputSize
n'avez pas de retour de la taille de sortie de la chaîne déchiffrée, mais seulement le maximum d'espace dans la mémoire tampon de sortie. La methode avoir les documents suivants dans le code BC:DoFinal retourne la longueur réelle de la restitution des données dans la mémoire tampon.
Donc dans
La
plainTextBuffer
serait légèrement plus grand que le réel les données déchiffrées - la longueur réelle de données serait enlength
.00
.Un octet de remplissage est toujours ajoutée et ensuite retirées de la déchiffrer. Vous n'avez pas l'habitude de voir le rembourrage. Ma conjecture est que vous imprimez plus de la mémoire tampon de est en fait retourné par le déchiffrer. Quelle langue utilisez-vous? Quelle est la longueur de la restitution des données tel que rapporté par la colombie-britannique?
Bodewes - pouvez-vous élaborer sur le downvote? Un déchiffrer ala cela en java:
byte[] plainData = new byte[encryptedData.length];
int length = cipher.doFinal(encryptedData, 0);
donnerait la sortie en tant que cités dans la question, si l'on fait abstraction de la longueur retourné par l'algorithme de chiffrement.Sans le code dans le commentaire, je ne pense pas qu'il est clair que vous attendez le zéro octets à la teneur initiale d'un ensemble nouvellement créé. En fait, si vous venez de mettre à jour votre réponse pour inclure le code ci-dessus et inscrivez votre réponse autour d'elle, je serais heureux de upvote.
Bodewes prendre un coup d'oeil à nouveau ..
OriginalL'auteur Ebbe M. Pedersen
je suis à l'aide de c# à partir de bouncycastle. ce me semble peut-être un bug de bouncycastle, ou au moins bouncycastle c# de mise en œuvre ne suit pas pkcs7 spec exactement.
ma solution est de couper la fuite d'octets qui ne sont pas inclus dans le retour de la longueur de DoFinal. toujours pas très bien pourquoi il y a un rembourrage de 0x00, qui comme l'a dit ne devraient pas exister du tout.
ci-dessous est le code. j'ai utilisé AES/SRC/PKCS7PADDING pour le chiffrement et le déchiffrement.
de chiffrement --->
décryptage --->
OriginalL'auteur user908645