Quali API di CryptoPP generano risultati arrotondati per round per crittografia / decrittografia AES?

3

Ho creato un programma utilizzando le API CryptoPP per implementare la modalità ECB AES con una chiave a 128 bit per la crittografia / decrittografia del testo in chiaro dell'input dell'utente. So che la BCE è la modalità AES meno sicura ma è sufficiente per il mio programma che è solo per scopi dimostrativi di base.

Vorrei catturare l'output del round in base ai risultati quando il mio programma applica le operazioni di crittografia e decrittografia AES ECB. CryptoPP fornisce API per fare questo?

In altre parole, quando il mio programma esegue la crittografia sull'input dell'utente come testo in chiaro, vorrei esportare il testo cifrato prodotto da ciascuno dei 10 round coinvolti nell'operazione di crittografia. Allo stesso modo, quando il mio programma esegue la decrittografia sul testo cifrato generato da AES ECB, vorrei produrre il testo in chiaro recuperato prodotto da ciascuno dei 10 round coinvolti nell'operazione di decrittografia.

Il mio programma genera una chiave (con API GenerateBlock di AutoSeededRandomPool), esegue la crittografia (passando un'istanza "ECB_Mode :: Encryption" in un StreamTransformationFilter) ed esegue la decrittografia (passando un'istanza "ECB_Mode :: Decryption" in un StreamTransformationFilter) . Il mio programma richiede all'utente di operare in chiaro, emette il testo cifrato prodotto applicando l'API di crittografia AES ECB di CryptoPP sul testo in chiaro e quindi restituisce il testo in chiaro recuperato applicando l'API di decrittografia AEC ECB di CryptoPP.

Sto postando questa domanda dopo aver ricercato senza successo le risorse di CryptoPP per i modi in cui generare round per round di risultati delle operazioni AES. Molte grazie per qualsiasi assistenza fornita.

    
posta ad479 03.11.2015 - 17:29
fonte

1 risposta

0

In effetti, "l'output di ogni round" non è ben definito. La struttura della crittografia AES è una sequenza di operazioni simile a questa:

Cipher(byte in[4*Nb], byte out[4*Nb], word w[Nb*(Nr+1)])
begin
   byte  state[4,Nb]
   state = in
   AddRoundKey(state, w[0, Nb-1]) 
   // See Sec. 5.1.4
   for round = 1 step 1 to Nr–1
      SubBytes(state) 
      // See Sec. 5.1.1
      ShiftRows(state) 
      // See Sec. 5.1.2
      MixColumns(state) 
      // See Sec. 5.1.3
      AddRoundKey(state, w[round*Nb, (round+1)*Nb-1])
   end for
   SubBytes(state)
   ShiftRows(state)
   AddRoundKey(state, w[Nr*Nb, (Nr+1)*Nb-1])
   out = state
end

Questo pesudo-codice è estratto direttamente dalla specifica AES ( FIPS 197 ) . AES (con una chiave a 128 bit) può essere definito come costituito da dieci round, in cui ogni round consiste in alcune operazioni (SubByte, ShiftRows, MixColumns, AddRoundKey). Tuttavia, tale descrizione dovrebbe essere modificata con un AddRoundKey aggiuntivo e senza un MixColumn nel round finale. Lo pseudo-codice sopra è strutturato come round nove , dove ogni round è la sequenza SubBytes-ShiftRows-MixColumns-AddRoundKey; e ci sono alcune operazioni prima e dopo questa sequenza di nove round.

Ciò che costituisce un "round" è arbitrario qui; sarebbe stato altrettanto valido definire un round come la sequenza ShiftRows-MixColumns-AddRoundKey-SubBytes; le operazioni iniziali e finali sarebbero state un po 'diverse. Nessuna descrizione è più standard o corretta di qualsiasi altra.

Un'ulteriore complicazione è che la sequenza di operazioni è suscettibile di trasformazioni algebriche. Ad esempio, ShiftRows e SubByte commutano; e AddRoundKey e MixColumns possono essere eseguiti in ordine inverso, a condizione che le sottochiavi vengano trasformate di conseguenza; questo è descritto in FIPS 197, sezione 5.3.5, per la decrittografia AES ("Equivalent Inverse Cipher"). Questo aumenta il numero di possibili descrizioni dei round AES.

Inoltre, le implementazioni "normali" di AES (basate su tabelle) uniranno alcune operazioni insieme, in genere SubByte, ShiftRows e MixColumns, con la magia dell'algebra lineare. Dal momento che non si verificano realmente come fasi separate, i singoli output non esistono.

Poiché l'output tondo non è ben definito, le implementazioni per fornire un accesso a questi valori non hanno molto senso.

Se vuoi, per scopi pedagogici, stampare i valori intermedi, allora è meglio selezionare un'implementazione che segue la lettera della specifica (a scapito delle prestazioni), cioè non Crypto ++; di fatto, dovresti scrivere il tuo (se stampi valori intermedi, quindi non stai facendo nulla in modo sicuro , quindi scrivere il tuo codice è giustificato).

    
risposta data 03.11.2015 - 20:07
fonte

Leggi altre domande sui tag