Red de conocimiento informático - Problemas con los teléfonos móviles - Programación del algoritmo Rsa

Programación del algoritmo Rsa

//rsa.h

#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;

}