Programación del algoritmo Rsa
#Contiene? & ltstdio.h & gt
¿#Definición? ¿MAX_NUM? 63001
#Definición? ¿MAX_PRIME? 251
//!? Código de retorno
#¿Definición? ¿Bueno? 100
#Definición? ¿ERROR_NOEACHPRIME? 101
¿#Definición? ¿ERROR_NOPUBLICKEY? 102
#¿Definición? ¿ERROR_GENERROR? 103
¿No firmado? int? MakePrivateKeyd(? ¿Sin firmar? ¿int? ¿uiP? ¿Sin firmar? ¿int? uiQ?);
¿Sin firmar? int? GetPrivateKeyd(? ¿Sin firmar? ¿int? ¿Qué soy?);
¿Sin firmar? int? MakePairkey(? ¿Sin firmar? ¿int? uiP? ¿Sin firmar? ¿int? uiQ,? ¿Sin firmar? ¿int? uiD?);
¿Sin firmar? int? GetPairKey(?Unsigned?int?&d,?Unsigned?int?&e?);
¿No es válido? rsa_encrypt(?int?n,?int?e,?char?*mw,?int?iLength?int?*&cw?);
¿No es válido? rsa_decrypt(?int?n,?int?d,?int?*&cw,?int?length?char?*mw?);
¿No es válido? clave de salida();
//rsa.c
#Contiene? " rsa.h "
//!¿Guardar la clave privada d set
estructura? pKeyset
{
¿Sin firmar? int? configuración[? ¿MAX_NUM? ];
¿No está firmado? int? Tamaño;
} pset
//!? ¿Guardar pares de claves públicas y privadas
estructura? Palki
{
¿Sin firmar? int? d;
¿Sin firmar? int? e;
¿Sin firmar? int? n;
} pairkey
//?Nombre: isPrime
//?Función: Determinar si dos números son primos relativos.
//Parámetro:m:? Número a;? norte:? Número b
//?Retorno: m, n es primo relativo y devuelve verdadero. De lo contrario, devuelve falso.
¿Booleano? isPrime(? ¿sin firmar? int? m,? ¿sin firmar? int? n?)
{
¿Sin firmar? int? I = 0;
¿Booleano? ¿bandera? =?Verdadero;
Si (?m & lt2?||?n & lt2?)
¿Devolver? Falso;
¿Sin firmar? int? tema? =?(?m?& gt?n?)?n? :?m;
para (?i=2;?i<=tem?&&?flag;?i++?)
{
¿Booleano? mFlag? =?Verdadero;
¿Booleano? n¿Bandera? =?Verdadero;
Si (?m?%?I?==?0?)
mFlag? =?Falso;
Si (?n?%?I?==?0?)
nFlag? =?False;
Si (?!mFlag?& amp& amp?!nFlag?)
¿Marcar? =?Falso;
}
Si (?Marca?)
¿Devolver? Real;
Otros
¿Volver? Falso;
}
//?Nombre: MakePrivateKeyd
//?Función: Generar clave privada D a partir de números primos Q y Q.
//Parámetro:uiP:? Número primo p;? uiQ:? Número primo q
//?Retorno: Clave privada d
¿Sin firmar? int? MakePrivateKeyd(? ¿Sin firmar? ¿int? ¿uiP? ¿Sin firmar? ¿int? uiQ?)
{
¿Sin firmar? int? Yo = 0;
//!? Obtener todos los números que son primos relativos con respecto a z (? ¿El conjunto de claves privadas?)
¿Sin firmar? int? z? =?(?uiP?-1?)?*?(?uiQ?-1?);
pset.size? =?0;
for (?i = 0;?i<z;?i++?)
{
si (?isPrime(?i, ? z ? )?)
{
pset.set[? pset.tamaño++? ]?=?Yo;
}
}
¿Volver? pset.size
}
//?Nombre: MakePairKey
//?Función: Genera pares de claves públicas y privadas RSA.
//Parámetro:uiP:? Número primo p;? uiQ:? Número primo q;? uiD:? Clave privada d
//?Retorno: código de error
¿No está firmado? int? MakePairkey(? ¿unsigned? int? uiP? unsigned? int? uiQ,? unsigned? int? uiD?)
{
¿Booleano? ¿Bandera? =?Verdadero;
¿Sin firmar? int? ¿I? =?0,?e;
¿Sin firmar? int? z? =?(?uiP-1?)?*?(?uiQ-1?);
¿Sin firmar? int? ¿d? =?pset .set[uiD];
//d = uiD;
if (?!isPrime(?z,?d?)?)
¿Regresar? ERROR _ NOEACHPRIME
for (?i = 2;?i<z;?i++?)
{
si (?(i*d)% z? ==?1?)
{
e? =?Yo;
bBandera? =?Falso;
}
}
Si (?bFlag?)
¿Devolver? ERROR _ NOPUBLICKEY
Si (?(d*e)%z?!=?1?)
ERROR _ GENERROR
pairkey.d? =?d;
pairkey.e? =?e;
parekey.n? =?uiP? *?uiQ
¿Devolver? OK;
}
//?Nombre: GetPairKey
//?Función: proporciona una interfaz externa para obtener un par de claves públicas y privadas.
//Parámetro:uiP:? Número primo p;? uiQ:? Número primo q;? uiD:? Clave privada d
//?Retorno:
¿Sin firmar? int? GetPairKey(?unsigned?int?&d,?unsigned?int?&e?)
{
d? =?pairkey.d
e? =?pairkey.e
¿Devolver? pairkey.n
}
//?Nombre: GetPrivateKeyd
//?Función: Proporciona una interfaz externa, el usuario puede seleccionar la ID para obtener la clave privada d.
//Parámetro:iCuál:? El usuario selecciona el ID de la clave privada d
//? Devuelve: clave privada d valor
¿Sin firmar? int? GetPrivateKeyd(? unsigned? int? ¿mi qué?)
{
if (? pset.size?& gt=? ¿mi qué?)
¿Regresar? pset.conjunto[? ¿Yo qué? ];
Otros
¿Volver? 0;
}
//?Nombre: rsa_encrypt
//?Función: operación de cifrado RSA
//Parámetro: n :? Clave pública n;? mi:? Clave pública e;? mw:? Cifrar texto sin formato;? iLongitud:? Longitud del texto sin formato;? cw:? Salida de texto cifrado
//?Retorno: Ninguno
¿No es válido? rsa_encrypt(?int?n,?int?e,?char?*mw,?int?mLength?int?*&cw?)
{
int? i=0,? j = 0;
__int64? ¿temInt? =?0;
For (?I = 0;?i<mLength?i++?)
{
temInt? =?MW[I];
Si (?e!=0?)
{
Para (?j = 1;?j & lte; ? j++? )
{
temInt? =?(?temInt?*?mw[i]?)?%?n;
}
}
Otros
{
temInt? =?1;
}
cw[i]? =?(int)temInt;
}
}
//?Nombre: rsa_decrypt
//?Función: descifrado RSA Operación
//Parámetro:n:? Clave privada n;? d:? clave privada d;? cw:? texto cifrado;? longitud:? Longitud del texto cifrado;? mw:? Salida de texto sin formato
//?Retorno: Ninguno
¿Nulo? rsa_decrypt(?int?n,?int?d,?int?*&cw,?int?length?char?*mw?)
{
int? i=0,? j =-1;
__int64? ¿temInt? =?0;
Para (?I = 0;?i<cl ength/4;?++i?)
{
mw[i ]? =?0;
temInt? =?CW[I];
Si (?d?!=?0?)
{
Para (?j = 1;?j & ltd;? j++? )
{
temInt? =?(__int64)(?temInt?*?cw[i]?)?%?n;
}
}
Otros
{
temInt? =?1;
}
mw[i]? =?(char)temInt;
}
}
¿No es válido? clave de salida()
{
printf("PublicKey(e, n):? (%d, %d)\n ", pairkey.e, pair key . n);
printf("PrivateKey(d, n):? (%d, %d)\n ", pairkey.d, pair key . n); >
//main.c
//?Proyecto: RSA
//?Función: cifrado y descifrado de archivos RSA
//Autor: jlcss|ExpNIS
<p>#incluir? & ltstdio.h & gt
¿#Contiene? & ltafxwin.h & gt
¿#Contiene? & ltmath.h & gt
¿#Contiene? " rsa.h "
#¿Definición? descifrar_archivo? "Texto cifrado RSA.txt "
#¿Definición? ¿Cifrar archivos? "RSA descifra texto sin formato. txt "
//!? El archivo de restricción máxima es 2M.
¿#Definición? ¿MAX_FILE? 1024*1024*2
//?Nombre: Propósito
//?Función: Información de ayuda
//Parámetro: Nombre de la aplicación
//?Return: Mensaje rápido
¿No es válido? Uso(?const?char?*appname?)
{
printf(?" \n \Usage:rsa?-k?Número primo p?Número primo Q\n " ? );
printf(?" \tUso:?rsa?-e?Archivo de texto sin formato?Clave pública e?Clave pública n\n "?);
printf(? " \tUso:? ? archivo de texto cifrado? clave privada n\n "?);
//?Nombre:IsNumber p>
//?Función: Determinar la matriz de caracteres numéricos
//Parámetro: strNumber: Matriz de caracteres
//?Return: Matriz de palabras numéricas devuelve verdadero; de lo contrario, devuelve falso
¿Booleano? IsNumber(?const?char?*strNumber?)
{
¿Sin firmar? int? Yo;
Si (?!strNumber?)
¿Volver? Falso;
¿Para qué? (?i?=?0?i?<?strlen(strNumber)?;?i++?)
{
¿Si? (?strNumber[i]?<?'0'?||?strNumber[i]?>?'9'?)
¿Regresión? Falso;
}
¿Devolver? True;
}
//?Nombre: IsPrimeNumber
//?Función: Determinar número primo
//Parámetro: num : ? Ingrese un número entero
//?Retorno: el número primo devuelve verdadero; de lo contrario, devuelve falso;
¿Booleano? IsPrimeNumber(? unsigned? int? num?)
{
¿Sin firmar? int? Yo;
Si (?num?& lt=?1?)
¿Volver? Falso;
¿Sin firmar? int? cuadrado? =?(unsigned?int)sqrt((double)num);
For (?i?=?2;?i?<=?sqr?i++?)
{
Si (?num?%?i?==?0?)
¿Devolver? Falso;
}
¿Devolver? True;
}
//?Nombre: FileIn
//?Función: Leer archivos de disco en la memoria.
//Parámetros: strFile: nombre del archivo; apunta al búfer de contenido del archivo.
//?Retorno: tamaño real del contenido leído (bytes)
int? FileIn(?const?char?*strFile,?unsigned?char?*&inBuff?)
{
int? iFileLen=0,? iBuffLen = 0;
//!? Abrir archivo de texto cifrado
¿CFile? Archivo(?strFile,?CFile::modeRead?);
iFileLen? =?(?int?) archivo.
GetLength();
If (?iFileLen & gtMAX_FILE?)
{
printf(?"La longitud del archivo no puede ser mayor que?%dM!\ n", ?MAX_FILE/(1024 * 1024)? fuera;
}
iBuffLen? =?iFileLen
enBuff? =?Nuevo? ¿No firmado? char[iBuffLen];
si (?! ¿enBuff?)
¿ir a? Fuera;
Memoria cero (? ¿En el búfer? ¿iBuffLen?);
Archivo. Leer(?en buffer?iFileLen?);
Archivo. close();
Fuera:
¿Regresar? iBuffLen
}
//?Nombre: FileOut
//?Función: envía los resultados de cifrado/descifrado al archivo de disco en el directorio actual.
//Parámetros: strOut apunta al búfer de caracteres de salida, y el tamaño de salida len y strFile son los archivos de salida.
//?Devolución: Ninguna
¿Anulado? FileOut(?const?void?*strOut,?int?line.const?char?*strFile?)
{
//!? Salida a archivo
¿CFile? outfile(?strFile?,?CFile::modeCreate?|?CFile::modeWrite?);
Salida del archivo. write(?Strout?,?Lane.);
Salida del archivo. close();
}
//?Nombre: CheckParse
//?Función: verifica los parámetros de entrada de la aplicación.
//Parámetros: argc es igual al parámetro argc de la función principal y argv apunta al parámetro argv de la función principal.
//?Retorno: si el parámetro es legal, devuelve verdadero; de lo contrario, devuelve falso.
//Observaciones: Verificación de parámetros de entrada simple
¿Booleano? CheckParse(?int?argc,?char**?argv?)
{
¿Booleano? ¿Blaise? =?false;
if (?argc?!=?4?& amp& amp?argc?!=?5?)
ir a? fuera;
if (?argc?==?4?& amp& amp?argv[1][1]?==?ok?)
{
//!? Generar pares de claves públicas y privadas
If (?!IsNumber(?argv[2]?)?||?
!IsNumber(?argv[3]?)?| |
Atoy(?argv[2]?)?& gt? ||
Atoy(?argv[3]?)?& gt )
>¿ir a? Fuera;
}
¿Y si? if(?(argc?==?5)?& amp& amp?(argv[1][1]?==?Sí?||?argv[1][1]?==?d')?)
{
//!? Operaciones de cifrado y descifrado
If (?!IsNumber(?argv[3]?)?||
!IsNumber(?argv[4]?)?||
Atoy(?argv[3]?)?& gt? ||
Atoy(?argv[4]?)?& gt? out;
}
Otro
Uso (* argv);
¿Apoyo? =?Verdadero;
Salida:
¿Regresar? Brace;
}
//?Nombre: ko opción 1
//?Función: Programar operación de opción k: Generar números privados a partir de números primos p y q Tecla d configurada.
//Parámetro:uiP:? Parámetro de entrada del programa p;? uiQ:? Parámetro de entrada del programa q
//?Return: Devuelve correctamente el número de claves privadas generadas; de lo contrario, devuelve 0.
¿No está firmado? int? kOption1(? ¿Sin firmar? ¿int? uiP? ¿Sin firmar? ¿int? uiQ?)
{
¿Sin firmar? int? uiRes? =?0;
Si (?!IsPrimeNumber(?uiP?)?)
{
printf(?"p error de entrada, p debe ser ( 0,? %d]Prime",?MAX_PRIME?);
Retorno?uiRes
}
Si (?!IsPrimeNumber(?uiQ?)? )
{
printf(? "q error de entrada, q debe ser (0, %d] número primo",? MAX_PRIME?);
Regresión uiRes
}
if (?uiP?==?uiQ?)
{
printf(?"Número primo P y número primo Igual que Q, es fácil obtener los números primos P y Q basándose en la raíz cuadrada de la clave pública n. Este tipo de cifrado no es seguro, cambie el número primo \n "?);
¿Regresión?uiRes
}
printf(?"Generando clave privada d set...\n "?);
uiRes ? =?MakePrivateKeyd(?uiP?uiQ?) ;
Regresar? uiRes
}
//!? >int? main(?int?argc,? char? **argv? )
unsigned? p?,?n?prime?p?q,?public?key(n?,?d )
>
d = 4828? //uid
if (argc?==?4)
{
p?=?Atoy( ? argv[2]? );
q = ?argv[3]?);
MakePrivateKeyd(p,?q);
MakePairkey(p, q, ?d?);
tecla de salida();
}
¿Qué pasa si (argc?== ?5 )
{
Char? nombre de archivo[20];
strcpy(nombre de archivo, argv[2]);
int?len
if(argv[1][1]?==?Sí?)
{
¿Sin firmar? *inBuffer=(¿sin firmar?char?*) malloc(MAX_FILE);? //Búfer de entrada
int? *cw=(int?*)malloc(MAX_FILE);
Carril. =?FileIn(nombre de archivo?,?en el búfer);
e? =?atoi(argv[3]);
n? =?atoi(argv[4]);
rsa_encrypt(?n,?e,?(char?*)inBuffer,?lane.cw?);
FileOut(? cw,? 4*len,? decrypt_file );
¿Y si? if(argv[1][1]?==?d’)
{
Carácter? *Buffer=(char?*)malloc(MAX_FILE);? //búfer de entrada
int? *cw=(int?*)malloc(MAX_FILE);
Carril.
=?FileIn(nombre de archivo, (unsigned?char?*&)CW);
d? =?atoi(argv[3]);
n? =?atoi(argv[4]);
rsa_decrypt(?n,?d,?cw,?len.buffer?);
FileOut(?buffer,?len/ 4. ¿Archivos cifrados? );
}
¿Volver? 0;
}