Red de conocimiento informático - Material del sitio web - ¿Cómo utilizar VB para implementar el algoritmo de cifrado RSA? Encontré un código en Internet. No puedo entenderlo sin comentarios. ! !

¿Cómo utilizar VB para implementar el algoritmo de cifrado RSA? Encontré un código en Internet. No puedo entenderlo sin comentarios. ! !

El algoritmo RSA es muy simple y se puede resumir de la siguiente manera:

Encontrar dos números primos p y q

Sea n=p*q

T=( p-1 )*(q-1)

Para tomar cualquier número e, debe satisfacer e

Tome d*et==1

En este De esta manera, finalmente obtenemos tres Número: n d e

Deje que el mensaje sea m (m

Establezca c=(M**d)n para obtener el mensaje cifrado c.

Establezca m=( c**e)n y luego m == M, completando así el descifrado de c

Nota: * * representa potencia, y D y E en las dos fórmulas anteriores. se pueden intercambiar

p>

En cifrado simétrico:

Dos números N d forman una clave pública, que se puede comunicar a otros;

Dos números forman una clave privada, que se guarda sola. No dejes que nadie lo sepa.

La información enviada a otros está encriptada, siempre que otros puedan usar D para descifrarla. la información fue enviada por usted. Esto constituye un mecanismo de firma.

Cuando otros le envían información, utilizan el cifrado D, de modo que solo usted que tiene E puede descifrarlo. La seguridad de rsa es que no existe una forma efectiva de descomponer un número grande n.

Por lo tanto, cuando se conoce n d, e no se puede encontrar

ltSecond>Práctica

<. p>A continuación, practiquemos y veamos la operación real:

Encontrar dos números primos:

p=47

q=59

p>

Así

n=p*q=2773

t=(p-1)*(q-1)= 2668

Toma e=63 y satisface e

Usando el método exhaustivo simple de Perl, puedes obtener el número D con el principal completo e*dt == 1:

c: \ Temp gt; perl -e "foreach $i (1..9999){ print $ I, último si $i*632668==1 } "

847

Es decir, d = 847

Finalmente, obtuvimos la clave

n=2773

d=847

e= 63

Obtener mensaje M=244, echemos un vistazo

Cifrado:

c=M**dn = 244**8472773

.

Utilice el cálculo de números grandes de Perl para calcular:

c:\Temp gt;perl-mbi gint-e " print 244 * * 847 2773 "

465

Es decir, usando D Después de cifrar M, se obtiene la información cifrada C = 465.

Descifrado:

Podemos usar E para descifrar el C cifrado y restaurar M:

m=c**en=465**632773:

p>

c:\ Temp gt; perl -Mbigint -e "Print 465**632773 "

244

Es decir, C es descifrado por E, y se obtiene m=244, que es igual a la información original m.

ltThird>Cifrado de cadenas

Al integrar el proceso anterior, podemos implementar un ejemplo de cifrado y descifrado de una cadena.

Cada vez, el valor ascii de un carácter en la cadena se toma como m para el cálculo y la salida se cifra con 16.

Un número en forma de cadena, representado por 3 bytes, como por ejemplo 01F.

El código es el siguiente:

#!/usr/bin/perl -w

#Programa de prueba escrito por el plan de aprendizaje del proceso de cálculo RSA

#水云2003-8-12

<#

Usar estrictamente;

Usar Math::BigInt;

Mi RSA_CORE =(n=gt;2773,e=>63,d=gt847);#p=47,q=59

mi$N=new Math::BigInt($RSA_CORE { N });

mi $E = nuevo Math::BigInt($RSA_CORE {E});

mi $D = nuevo Math::BigInt($RSA _ CORE { D });

Imprimir "N = $N D = $D E = $E\N";

Sub RSA_ENCRYPT

{

Mi $r_mess = shift@_

mi ($c, $i, $M, $c, $cmess);

for($ I = 0; $i lt longitud ($$r_mess);$i )

{

$c=ord(substr($$r_mess,$i,1)) ;

$ M = Matemáticas::BigInt-gt;new($c);

$C = $M-gt;copia();$C->bmodpow ($D, $N);

$C = sprintf "03X", $C;

$cmess. = $c;

}

return \$cmess

}

niño RSA_DECRYPT

{

Mi $r_mess = shift@_

mi ($c, $i, $M, $c, $dmess);

for($ I = 0 ; $i longitud ($$r_mess); $i =3)

{

$c=substr($$r_mess, $i, 3) ;

$c = Hexadecimal($c);

$M = Math::BigInt-gt; new($c);

$C = $M- gt; copiar();$C->bmodpow($E,$N);

$C = chr($C);

$dmess.

= $c;

}

return \ $dmess

}

Mi $mess="RSA bebé jajaja~~ ";

$mess = $ARGV[0] if @ARGV gt; = 1;

Imprimir "Cadena original: ", $mess, "\n";

p>

mi $r_cmess = RSA_ENCRYPT(\$mess);

Imprimir "cadena cifrada:", $$r_cmess, "\n";

mi $ r_dmess = RSA_DECRYPT($r_cmess);

Imprimir "Cadena descifrada: ", $$r_dmess, "\n";

#EOF

Pruébalo:

c:\Temp gt;perl rsa-test.pl

N=2773 D=847 E=63

Cadena original: RSA baby jajaja~ ~ ~

Cadena cifrada: 5 CB 6 CD 6 BC 58 a 7709470 a 70 aa 0 aa 70 a 6 c 70 a 46 c 70 a 46 c 70 a 46 c 70 a 46 c 70 a 4.

Cadena descifrada: RSA baby jajaja~~~

c:\Temp gt; Perl rsa-test.pl Enfoque de seguridad

N=2773 D= 847 E=63

Cadena original: Enfoque de seguridad (xfocus)

Cadena cifrada: 3393 EC 12f 0a 466 e0aa 9510d 025d 7 ba 0712 DC 379 f 47d 51c 325d 67 b.

Descifrar cadena: foco de seguridad (xfocus)