2010-08-09 19 views
6

Je vais faire une longue histoire courte. Cela fait longtemps que je veux implémenter mon propre programme de cryptage/décryptage AES. Le programme de cryptage s'est bien passé et a crypté sans aucune erreur ou sortie étrange (Depuis que j'ai comparé la sortie de mon programme avec une sortie commerciale et le résultat était le même). Wikipedia a été (est) mon guide dans cette implémentation dans laquelle je lis "Un ensemble de tours inverses sont appliqués pour transformer le texte chiffré en texte brut original en utilisant la même clé de chiffrement."Algorithme de décryptage AES

Il y a quelques modules que je mis en œuvre:

  1. Ajouter ronde clés
  2. lignes Shift
  3. Sub octets
  4. Mix colonne

I couple a également mis en œuvre de la mise en œuvre inverse des modules ci-dessus:

  1. lignes de décalage inverse
  2. inverse Sub Byte
  3. Mix inverse Colonne

NOTE: Je ne mettent pas en œuvre clé ronde inverse depuis, il est XOR ing le texte en clair avec la clé de chiffrement et inverse de XOR est lui-même XOR (corrigez-moi si je me trompe)

Je ces modules dans roulés l'ordre inverse que je l'ai fait le cryptage, mais jamais j'ai obtenu mon texte brut retour:

expandkey128(key); 
rev_subbytes(data); 
rev_shiftrows(data); 
addroundkey(data,key,10); 

for(int i = 9; i>= 1; i--) { 
    rev_subbytes(data); 
    rev_shiftrows(data); 
    rev_mixColum(data); 
    addroundkey(data,key,i); 
} 

addroundkey(data,key,0); 

// Please note that I also did from 0 to 10 , 
// instead of 10 to 0 and didn't workout 

Et aussi je pensais, peut-être que je ne devrais pas implémenter le modèle inverse des modules, peut-être que je dois utiliser ces modules que j'ai fait crypter, seulement dans l'ordre inverse; bien devinez quoi? n'a pas fonctionné! :

expandkey128(key); 
addroundkey(data,key,0); 

for(int i = 1; i<= 9; i++) { 
    subbytes(data); 
    shiftrows(data); 
    mixColum(data); 
    addroundkey(data,key,i); 
} 

subbytes(data); 
shiftrows(data); 
addroundkey(data,key,10); 

Alors voici la question: quel est le problème? || Quelle est la séquence correcte d'application de ces soi-disant modules ou fonctions si vous voulez?

+1

Avez-vous calculé correctement votre s-box, car vous ne pouvez pas utiliser le même que celui que vous utilisez pour le cryptage. http://en.wikipedia.org/wiki/S-box Ce commentaire est manquant dans la version anglaise dans wikipedia. Jetez un oeil à la spécification directement: http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf Vous avez faire calculer l'inverse s-box à déchiffrer. – evildead

+0

Oui en fait à rev_subbytes J'ai In-S-boîte de Rijndael –

+1

il y a un excellent outil là-bas: http://www.cryptool.de/ Dans ce que vous pouvez faire une transformation à la main.Peut-être que vous devez déboguer chaque étape, peut-être que l'outil vous aidera à vérifier chaque étape. – evildead

Répondre

7

Votre ordre des opérations semble erroné. Je pense que vous voulez ceci:

expandkey128(key); 

addroundkey(data,key,10); 
rev_shiftrows(data); 
rev_subbytes(data); 

for(int i = 9; i>= 1; i--) { 
    addroundkey(data,key,i); 
    rev_mixColumn(data); 
    rev_shiftrows(data); 
    rev_subbytes(data); 
} 

addroundkey(data,key,0); 

Pour plus de détails, voir my stick figure explanation of AES avec sa mise en œuvre de référence qui l'accompagne.

AVERTISSEMENT: Comme mentionné dans Act 3, Scene 2, there be dragons par écrit votre propre implémentation AES pour une utilisation en production.

+0

Je n'utiliserais pas non plus une implémentation propre pour aes. Arrangement de Nice;) – evildead

+0

Eh bien, je ne vais pas l'utiliser n'importe où, était juste pour le plaisir! et j'ai essayé votre commande qui n'a pas fonctionné, aussi j'ai vérifié le lien (http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf), dit l'ordre différent –

+1

Cela fonctionne sur ma machine et dans ma mise en œuvre :). Si vous avez un peu de temps, téléchargez ma mise en œuvre C# et parcourez-la et comparez chaque étape à votre implémentation. Notez que l'ordre que j'ai donné est effectivement le même que celui de la figure 12. Je le préfère simplement dans l'ordre que j'ai donné pour bien faire comprendre qu'il est en train de tout inverser. Il m'a fallu quelques essais comparant ma sortie à la sortie ronde du livre de Rijndael pour m'assurer que j'avais les bonnes choses. Vous pourriez simplement avoir une petite erreur dans l'une de vos fonctions inverses. Je recommande d'aller lentement sur chaque tour comme votre prochaine étape. –