2008-09-26 15 views
1

Je suis assez nouveau pour le cryptage C++ et Cipher de bloc, et je suis actuellement en train d'écrire une fonction de décryptage pour AES (16 byte seed/16 byte blocks). Tout va bien, mais ma taille totale des données n'est pas toujours un multiple de ma taille de bloc. Je me demande quelle est la meilleure façon de gérer les données restantes à la fin de mes données. J'utilise Crypto ++ pour la bibliothèque AES.Meilleure façon de gérer les chiffrements de bloc en C++? (Crypto ++)

La fonction ProcessBlock() prend un tableau de caractères d'entrée et de sortie. Je suppose qu'il s'attend à ce qu'ils soient au moins assez gros pour la taille du bloc.

Quelle serait la meilleure façon de traiter tous les blocs de 16 octets dans un chiffrement par bloc, puis de traiter également les données restantes?

Répondre

0

Ce que vous voulez est un système de remplissage.

Check out this CodeProject article on Crypto++:

Lorsqu'un message est pas un multiple de taille de bloc de l'algorithme de chiffrement, BCE ou des messages en mode CBC doit être rembourré. La méthode et les valeurs de remplissage sont une source de problème en ce qui concerne l'interopérabilité entre les bibliothèques cryptographiques et les API. Comme le fait remarquer Garth Lancaster , si vous n'êtes pas au courant des détails du remplissage, utilisez le StreamTransformationFilter. Dans ce cas , le filtre Crypto ++ remplira pour vous.

0

Il y a une norme PKCS pour ce qu'on appelle « padding »

Voir la wikipedia page, mais il revient à un rembourrage avec l'un des:

01 
02 02 
03 03 03 
04 04 04 04 
05 05 05 05 05 

De cette façon, vous savez au cours de décryptage où le message d'origine termine ...

1

C'est plus qu'un simple rembourrage - vous avez besoin d'un mode de fonctionnement. Le Good Math, Bad Math blog écrit une excellente série sur ce qu'ils sont et comment les utiliser here. Voir aussi le wikipedia entry. Une chose qui est vraiment, vraiment importante: N'utilisez jamais, jamais, le mode ECB (Electronic Code Book) - où vous crypter chaque bloc indépendamment. C'est la manière évidente de le faire, mais elle fournit une sécurité effroyablement pauvre.

Idéalement, cependant, vous ne devriez même pas avoir à le faire vous-même. Votre bibliothèque de chiffrement devrait le fournir. Si ce n'est pas le cas, je suggérerais de passer à autre chose. comme OpenSSL.