Red de conocimiento informático - Consumibles informáticos - Puntuación alta para el código fuente AES

Puntuación alta para el código fuente AES

#Definir descifrado verdadero

#Definir cifrado falso

#Definir tipo BOOL

typedef struct _AES{

int Nb

int Nr

int Nk

Palabra * larga sin firmar

Estado * largo sin firmar

} AES

/*

Datos cifrados

Byte *texto sin formato de entrada

Byte *inSize longitud del texto sin formato

bytes *Fuera del ubicación donde se almacena el texto cifrado

Byte *clave clave

byte *tamaño de clave longitud de clave

*/

Contraseña no válida (

entrada de caracteres* sin firmar,

int inSize,

salida de caracteres* sin firmar,

clave de caracteres* sin firmar,

int keySize);

/*

Descifrar datos

bytes*Ingresar texto cifrado

Int *inSize longitud del texto cifrado

Los bytes *out que almacenan el texto sin formato.

Byte *clave clave

Int *keySize longitud de clave

*/

void InvCipher(

Sin firmar entrada char*,

int inSize,

salida char* sin firmar,

clave char* sin firmar,

int keySize);

/*

Generar estructura AES de parámetros para cifrado

Int inSize tamaño de bloque

byte * clave

Int longitud de clave

Atributo largo sin firmar (tipo nominal)

Devuelve un puntero de estructura AES

*/

AES *InitAES(AES *aes ,

int inSize,

clave char* sin firmar,

int keySize, TYPE TYPE);

/*

Generar estructura AES de parámetros para cifrado

Tamaño de bloque Int inSize

Byte * clave

Longitud de clave Int

Devolver estructura AES puntero

*/

AES *InitAES(

int inSize,

Clave char* sin firmar,

int keySize, BOOL);

/*

Realizar Nr rondas de operaciones durante el cifrado.

Parámetros de tiempo de ejecución AES * aes

*/

Ciclo de contraseña no válido (

AES * AES);

/*

Realice Nr operación de inversión de ronda durante el descifrado.

Parámetros de tiempo de ejecución AES * aes

*/

void InvCipherLoop(

AES * AES);

/*

Publicar estructura y estado de AES y palabras del almacén de claves

*/

void free (

AES * AES);

//AES.cpp

#Incluye " stdafx.h "

#Incluye

#Incluye

# Contiene "AES.h"

Subpalabra char* sin firmar (palabra char * sin firmar);

expansión de clave larga * sin firmar (clave char * sin firmar, int Nk, int Nr, int) ;

/*

Datos cifrados

Byte *texto sin formato de entrada

Byte *inTamaño longitud del texto sin formato

Byte * fuera de la ubicación donde se almacena el texto cifrado

Byte *clave clave

Byte * tamaño de clave longitud de clave

* /

contraseña nula (entrada de caracteres sin firmar*, int inSize, salida de caracteres sin firmar*, clave de caracteres sin firmar*, int keySize)

{

AES aes

init AES (& aes, inSize, key, keySize, encrypt

memcpy(aes. status, input, inSize

Bucle de contraseña (&AES);

memcpy(out, aes. State, inSize);

}

/*

Descifrar datos

Bytes *entrada de texto cifrado

Int *inSize longitud del texto cifrado

Bytes *out que almacenan texto sin formato.

Byte *clave clave

Int *keySize longitud de clave

*/

void InvCipher(entrada char* sin firmar, int inSize, char* sin firmar, clave char* sin firmar, int keySize)

{

AES aes

init AES(& aes, inSize, clave, keySize, descifrar

memcpy(aes. status, input, inSize);

inv cipher loop(& amp; AES

memcpy(aes.State, out, inSize);

}

/*

Generar estructura AES de parámetros para cifrado

Int inSize Tamaño de bloque

Bytes * clave

Longitud de clave int

Devolver puntero de estructura AES

*/

AES *InitAES(AES *aes , int inSize, unsigned char *key, int keySize, TYPE type)

{

int Nb = inSize & gt& gt2,

Nk = keySize >.

& gt2,

Nr = Nb & ltNk? NK:n b+ 6;

AES-& gt; Nb = Nb

AES-& gt; Nr

AES-& gt; Palabra = keyExpansion(key, Nb, Nr, Nk);

AES-& gt; estado = nuevo sin firmar largo[n b+ 3];

if (tipo)

AES-& gt; estado += 3;

return aes

}

/*

Generar estructura AES de parámetros para cifrado

Tamaño de bloque Int inSize

byte * clave

Longitud de clave Int

p>

Devolver puntero de estructura AES

*/

AES *InitAES(int inSize, clave char* sin firmar, int keySize, tipo largo sin firmar)

{

Devuelve InitAES(nuevo AES(), inSize, clave, keySize, tipo);

}

/*

*/

Bucle de contraseña no válida (AES *aes)

{

Temperatura de carácter sin firmar[4];

Longitud sin firmar * palabra 8 = AES->Palabra,

* Estado = AES->Estado;

int Nb = AES->Nb,

NR = AES->NR;

int r;

for(r = 0;r<nb;++r)

{

estado[r]^= palabra 8[r];

}

for(int ronda = 1; ronda{

palabra 8+= Nb;

/*

Supongamos Nb = 4;

-

| s0 | >-

| s4 | s5 | s6 | s7 |

- s8 |

| es | sd |

-

| >| | |

-

| |

-

* /

| (Estado+Nb, Estado, 12);

/*

nb = 4;

-

| |

-

| s4 | s5 | |

-

|

-

| sd | se |

-

| -

| | s6 | s7 |

-

| */

for(r = 0; r {

/*

temp = {Sbox[s0], Sbox[s5], Sbox[sa] , Sbox[SF]};

*/

temp[0] = Sbox[*((carácter sin firmar*) estado)] ;

>temp[1] = Sbox[*((carácter sin firmar *)(Estado+1)+1)];

temp[2] = Sbox[*((carácter sin firmar *)(Estado +2 )+2)];

temp[3] = Sbox[*((carácter sin firmar *)(Estado+3)+3)];

*(( Carácter sin firmar * )estado)= log _ 02[temp[0]]^ log _ 03[temp[1]]^ temp[2]^ temp[3];

*((unsigned char *)state+ 1)= log _ 02[temp[1]]^ log _ 03[temp[2]]^ temp[3]^ temp[0];

*((unsigned char *)estado+2 )= log _ 02[temp[2]]^ log _ 03[temp[3]]^ temp[0]^ temp[1];

*((unsigned char *)estado+3) = log _ 02[temp[3]]^ log _ 03[temp[0]]^ temp[1]^ temp[2];

* estado ^= palabra 8 [r];

estado++;

}

estado-= Nb;

}

memcpy( Estado+Nb, Estado, 12);

palabra 8+= Nb;

for(r = 0; r {

*((unsigned char *)Estado) = Sbox[ *(unsigned char *)Estado];

*((unsigned char*)estado+1) = Sbox[*((unsigned char*)(estado+ 1)+1)];

*((carácter sin firmar*)Estado+2) = Sbox[*((carácter sin firmar *)(Estado+2)+2)];

*((carácter sin firmar*)Estado+ 3) = Sbox[*((unsigned char *)(Estado+3)+3)];

* estado ^= palabra 8 [r];

estado++;

}

}

/*

Ejecutar Nr rondas durante el descifrado Operación inversa.

Parámetros de tiempo de ejecución AES * aes

*/

void InvCipherLoop(AES *aes)

{

Largo sin firmar * Palabra = AES->Palabra,

* Estado = AES->Estado;

int Nb = AES->Nb,

p>

NR = AES->NR;

Temperatura de carácter sin firmar[4];

int r = 0;

palabra+= Nb * Nr;

for(r = 0; r & ltnb; ++r)

{

estado[r] ^=palabra[r] ;

}

Estado-= 3;

for(int round = Nr-1; round & gt0;-round)

{

/*

Supongamos Nb = 4;

-

| /p>

| | |

-

| | s2 | s3 |

-

| s4 | s5 | s7 |

-

| | sb |

-

| sc | sd |

-

*/

memcpy(Estado, Estado+Nb, 12);

/*

nb = 4;

-

| | s7 |

-

| | sa | sb |

-

| p>

-

| s0 | s1 | s2 |

-

| p>-

| s8 | s9 |

-

|

*/

palabra-= Nb;

estado+= n b+ 2;

for(r = n b-1; r & gt= 0;r -)

{

/*

temp = {iSbox[s0],iSbox[sd],iSbox[sa], es caja[ S7]};

*/

temp[0]= es box[*(byte *)State];

temp[1] = iSbox[ *((byte *)(Estado-1)+1)];

temp[2] = iSbox[*((byte*)(Estado-2)+2)];

temp[3] = iSbox[*((byte*)(estado-3)+3)];

*(unsigned long*)temp ^=palabra[ r];

*(carácter sin firmar *)estado = log _ 0e[temp[0]]^ log _ 0b[temp[1]]^ log _ 0d[temp[2]]^ log _ 09[temp[3] ];

*((unsigned char *)state+1)= log _ 0e[temp[1]]^ log _ 0b[temp[2]]^ log _ 0d [temp[3]] ^ iniciar sesión _ 09[temp[0]];

*(

(carácter sin firmar *)estado+2)= log _ 0e[temp[2]]^ log _ 0b[temp[3]]^ log _ 0d[temp[0]]^ log _ 09[temp[1]];

*((unsigned char *)state+3)= log _ 0e[temp[3]]^ log _ 0b[temp[0]]^ log _ 0d[temp[1]]^ log _ 09[temp[2]];

Estado-;

}

Estado-= 2;

}

palabra-= Nb;

memcpy(Estado, Estado+Nb, 12);

estado+= n b+ 2;

for(r = n b-1; r & gt= 0; r -)

{

*(carácter sin firmar *)Estado = iSbox[*(carácter sin firmar *)Estado];

*((Unsigned char*)State+1) = iSbox[*((Unsigned char*)(State-1)+1)];

*((Ninguno símbolo char *)Estado+2) = iSbox[*((carácter sin firmar *)(Estado-2)+2)];

*((carácter sin firmar*)Estado+3) = iSbox [*(( carácter sin firmar *)(Estado-3)+3)];

*Estado^=Palabra[r];

Estado-;

}

}

/*

* -

* | k0 | k2 | k3 | k8 | K9 |.....|Nk*4|

* -

*Nr almacén de claves de rueda

*La longitud de cada columna de clave es Nb .

* -

*| k0 | k1 | k2 | k3 |

* -

*| k7 |

* -

*| k8 | k9 | kb |

* -

*| ke | kf |

* -

*/

Expansión de clave larga* sin firmar(byte* clave, int Nb, int Nr, int Nk)

{

Unsigned long * w = new unsigned long [Nb *(Nr+1)] // 4 columnas de bytes corresponden a una palabra

memcpy(w , clave, Nk & lt& lt2);

Tipo entero largo sin signo;

for(int c = Nk; c & ltnb *(Nr+ 1);++c)

{

//Pon la última línea de la última ronda en temp.

temp = w[c-1];

//Determina si es la primera línea de cada ronda de claves.

if (c % Nk == 0)

{

//8 bits izquierdo

temp =(temp & lt; <8)|(temp>>24);

//Verificar tabla Sbox

Subpalabra ((byte*)&temp);

Temperatura^ = rcon[c/NK];

}

si no(Nk & gt; 6 & amp& amp(c % Nk == 4))

{

Subword ((byte*)&temp);

}

//w[c-Nk] es la primera línea de la ronda final llave.

^Temperatura;

}

Devolver w;

}

Carácter sin firmar * subpalabra ( Carácter sin firmar * palabra)

{

palabra[0]= Sbox[palabra[0]];

palabra[1]= Sbox[palabra[ 1]] ;

palabra[2]= Sbox[palabra[2]];

palabra[3]= Sbox[palabra[3]];

Devolver palabra ;

}

/*

Publicar estructura y estado de AES y palabra del almacén de claves

*/

No válido AES libre(AES *aes)

{

//for(int I = 0; iNbi++)

// {

// printf("%d\n ", I);

//Gratis (AES-& gt; estado [I]); gt; palabra[I]);

// }

//printf(" SD ffd ");

}