Experimento de algoritmo de cifrado de flujo C++

1. Propósito del experimento

Familiarizado con el algoritmo de cifrado de flujo RC4. Sobre esta base, mediante el uso de lenguaje de programación de alto nivel, diseñar e implementar

Algoritmo RC4.

  1. Escriba la idea de diseño de la herramienta de cifrado RC4
  2. Notas sobre código importante

2. Principio experimental

El algoritmo RC4 fue desarrollado por R. Rivest, uno de los miembros del trío RSA, en 1987. Es uno de los algoritmos de cifrado de flujo más utilizados en el mundo. No solo se usa en Microsoft Windows, Lous Notes y otras aplicaciones. pero también se utiliza en sockets seguros.La capa (Secure Sockets Layer, SSL) / Transport Layer Security (TLS) protege los flujos comerciales en Internet. RC4 es un cifrado de flujo con longitud de clave variable. Se basa en una tabla de datos s y realiza una transformación no lineal en s para generar una secuencia de flujo de clave no lineal. La longitud de la tabla de datos S puede tener cualquier valor, pero generalmente es de 256 bytes. La generación de secuencias de flujo de claves incluye dos procesos: algoritmo de programación de claves (algoritmo de programación de claves, KSA) y algoritmo de generación de secuencias de subclaves pseudoaleatorias (algoritmo de generación pseudoaleatoria, PRGA).

(1) Algoritmo de arreglo de teclas

El algoritmo de disposición de claves también se denomina algoritmo de inicialización de RC4. Tome la tabla de datos S con una longitud de 256 bytes como ejemplo, y marque la clave semilla de entrada como Clave, y registre la longitud de Clave como keylen Primero, llene linealmente los elementos en S en orden ascendente, es decir, S[ 0]= 0, S[1]=1,...,S[255]=255. Cree una matriz temporal T256] y asigne Key a T. Si la longitud de Key es menor que T, los elementos de T se rellenan con el valor de Key repetidamente hasta que se asignan todos los elementos de T. Luego use T para generar la permutación inicial de S, es decir, para cada S[i] (i es 0~255), calcule j=(j+ S[i]+ T[i]) mod256, y luego intercambie S[ q] y S [j] Debe quedar claro que, debido a que la operación en la tabla de datos s es solo un reemplazo, s todavía contiene todos los elementos de 0-255.

(2) Algoritmo de generación de secuencias de subclaves pseudoaleatorias

La inicialización de la tabla de datos S se completa y la clave de inicialización Key ya no se usa. La generación de la secuencia de subclave pseudoaleatoria SubKey comienza desde i=0, j=0, y se calcula de acuerdo con los siguientes pasos:

①i=(i+ 1) mod 256。

②j=(j+ S[i]) mod 256。

③Intercambiar S[i] y S[j].

④t= (S[I) + S[j]mod 256。

⑤S[4] es la subclave para este momento.

Si la longitud del texto sin formato supera los 256 bytes, después de que los 256 bytes en s completen la permutación redonda,

La operación continuará repitiéndose hasta que se genere la subclave para cifrar/descifrar el último carácter del texto sin formato.

3. Pasos experimentales

    [Ejemplo] Suponga que la longitud de la tabla de datos RC4 es de 8 bytes, explique la disposición de claves de RC4 y los pasos de generación de la secuencia de subclaves pseudoaleatorias:

Paso 1: inicialice cada elemento de la tabla de datos S como S[0]=OS[1]=1, S[2]=2, S[3]=3.S[4]=4.S[5]= 5, S[6]=6, S[7]=7.

int main () {
   
cout << " Ingrese la longitud de la tabla de datos s : " << endl;
   
cin >> n ;
   
cout << " Inicialice s como: " << endl;
   
for ( int i = 0 ; i < n ; i ++){
       
s [ i ] = i ;
       
cout << s [ i ];
    }

[Captura de pantalla de la parte de ejecución del código]

 

Paso 2: seleccione una clave, cada elemento del cual es un número del 0 al 7, por ejemplo, seleccione Key[O]=5

Clave[1]=6, Clave[2]=7. Llene la matriz T[8].Obtenga T0]=5, T[1]=6, T[2]=7, T[3]=5, T[4]=6, T[5]=

7,T[6]=5,T[7]=6。

cout << endl << "初始化t为:" << endl; 

for ( int i = 0 ; i < n ; i ++) { 

    int k [] = {
     
    5 , 6 , 7 }; 

    int m = i % longitud( k ); 

    t [ yo ] = k [ metro ]; 

    cout << t [ i ]; 

}

[Captura de pantalla de la parte de ejecución del código]

 

Paso 3: a partir de i=0 y j=0, actualice la tabla de datos S 8 veces en un bucle. Por ejemplo, el primer cálculo de j=(j+S[i]+S[j]mod8, es decir, j=(0+0+5)mod8=5. Intercambiar S[0] y S[5] para obtener una nueva La tabla de datos S es S[0]=5, S[1]=1, S[2]=2, S[3]=3, S[4]=4, S[5]=0, S [6] = 6, S [7] = 7. Después de que finaliza el ciclo, la tabla de datos S se actualiza a S [0] = 5, S [1] = 4, S [2] = 0, S [3 ]=2, S[4]=1, S[5]=6, S[6]=3, S[7]=2.

cout << endl << "循环更新后的s为:" << endl; 

int j = 0 ; 

for ( int i = 0 ; i < n ; i ++) { 

    j = ( j + s [ i ] + t [ i ]) % n ; 

    intercambiar( s [ i ], s [ j ]); 

    cout << s[ yo ]; 

}

[Captura de pantalla de la parte de ejecución del código]

 

Paso 4: Comenzando con i=0 y j=0, genere una secuencia de subclave pseudoaleatoria utilizando la tabla de datos s. Por ejemplo, la primera subclave SubKey[0] se calcula de la siguiente manera: i=(i+1)mod8=(0+1)mod8=1,j=(j+S[i])mod8=(0+S[ 1])

mod8=(0+4)mod8=4. Intercambiar S[i] y S[j], es decir, intercambiar S[1] y S[4]t=(S[i])+S[j])mod8=(S[1]+S[4] )mod8 =(1+4)mod8=5, Subclave[0]=S[t]=S[5]=6. Este proceso se repite hasta que el número de dígitos binarios generados sea igual a los dígitos binarios del texto sin formato.

cout << endl << " El flujo de claves generado es: " << endl; 

    int x = 0 ; 

    int y = 0 ; 

    int tt ; 

    int key [ 10010 ]; 

    for ( int k = 0 ; k < n ; k + +){ 

// cout << endl << " Un byte del flujo de claves generado es: " << endl;

         x = ( x + 1 ) % n ; 

        y= ( y + s [ x ]) % n ; 

        swap( s [ x ], s [ y ]); 

        tt = ( s [ x ] + s [ y ]) % n ; 

        tecla [ k ] = s [ tt ] ; 

        cout << clave [ k ]; 

// cout << " Cifrado, XOR " << clave << " con el siguiente byte de texto sin formato "<<endl; 

// break;

     }

[Captura de pantalla de la parte de ejecución del código]

 

【Código completo】

 

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_55988897/article/details/127999843
Recomendado
Clasificación