¿Cómo utilizar VB para implementar el algoritmo de cifrado RSA? Encontré un código en Internet. No puedo entenderlo sin comentarios. ! !
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
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>
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 p>
#水云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
{ p>
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)