Problemas de C ++ que requieren atención al escribir programas de cifrado y descifrado RSA y AES para atravesar archivos

Arquitectura del programa para atravesar archivos

void EnumFile(LPCWSTR path, LPCWSTR filetail)
{
    
    
	wchar_t buffer[MAX_PATH] = {
    
     0, };
	wchar_t enumpath[MAX_PATH] = {
    
     0, };
	BOOL ret = FALSE;
	CHAR Filepath[MAX_PATH]{
    
    0};
	WIN32_FIND_DATA FindFileData;
	wsprintf(enumpath, L"%s%s", path,L"\\*");//重中之重

	HANDLE hFile = FindFirstFile(enumpath, &FindFileData);  //标准LPCWSTR
	if (hFile != INVALID_HANDLE_VALUE)//
	{
    
    
		do
		{
    
    
			if ((FindFileData.dwFileAttributes & 0x10) == 0x10)//是目录就递归进去
			{
    
    
				if (FindFileData.cFileName[0] != '.' && FindFileData.cFileName[0] != '..')
				{
    
    
					memset(buffer, 0, MAX_PATH);
					wsprintf(buffer, L"%s\\%s", path, FindFileData.cFileName);
					EnumFile(buffer, filetail);//递归
				}
			}
			else
			{
    
    				
				if (!lstrcmp(PathFindExtension(FindFileData.cFileName),filetail))//匹配到符合条件的文件后缀。屏蔽该条件判定,就是直接遍历所有文件。
				{
    
      					
					wsprintf(buffer, L"%s\\%s", path, FindFileData.cFileName);
					WideCharToMultiByte(CP_ACP, 0, buffer, -1, Filepath, _countof(buffer), NULL, NULL);
					cout << Filepath << endl;
					ret = AES_Dec_File(Filepath, AESKeypath);//AES对外接口,需要自己实现
					if (ret == 0)
					{
    
    
						cout << Filepath << "AES解密失败!" << endl;
					}
					encryptnumber = encryptnumber + 1;
				}
			}
		} while (FindNextFile(hFile, &FindFileData) != 0);
		FindClose(hFile);
	}
}

Esta función es una función encapsulada por sí misma, que proporciona el parámetro de ruta una ruta WCHAR [MAX_PATH] = "C: \ enum"; y el parámetro dos WCHAR * filetail = L ".json" para recorrer todos los archivos en el directorio enum de la unidad C json archivo de sufijo. (WCHAR * es equivalente a LPCWSTR)
Hay muchos programas para recorrer archivos en Internet, pero la atención se centra en la forma en que se procesa la ruta .
La forma de la ruta del parámetro de la función de entrada : C: doble barra inclinada enum que se
pasa recursivamente a FindFirstFile La ruta debe ser procesada especialmente wsprintf (enumpath, L "% s% s", ruta, L "doble barra + asterisco");
recuerde este punto, no importa qué forma de API se utiliza, es fácil atravesar archivos.

Nota al leer la clave RSA

	FILE* fp;
	errno_t err;
	PublicKey pub = {
    
     0 };
	PrivateKey pri = {
    
     0 };
err = fopen_s(&fp, Keypath, "rb");//必须要以二进制读入key密钥!!!!!!!!!!!!!!!!!!!!!!!!!!
	if (err != 0)
	{
    
    
		printf("RSA私钥文件打开失败!%s", err);
		return 0;
	}
	fseek(fp, 0, SEEK_SET); //指针定位到文件起初
	fread(&pri, 1, sizeof(PrivateKey), fp); //每次读取一个字节 
	

Si la clave RSA se almacena en un archivo, debe leerse en modo binario cuando se lee en la memoria. De lo contrario, los datos descifrados serán incorrectos.

Se debe prestar atención al cifrado y descifrado RSA y al cifrado y descifrado AES

1. AES es esencialmente un algoritmo de cifrado simétrico La longitud de la clave de AES es de 108 bytes, que esencialmente contiene la clave (100 bytes, 256 bits) y iv (8 bytes = 32 bits). Esto es lo que llamamos AES256. Al escribir programas, la mayoría de ellos tratan la clave y la iv integrada en la biblioteca como una clave. El cifrado AES no cambia el tamaño de los datos originales . La encriptación AES puede entenderse como una especie de reorganización de datos binarios. Una vez que AES se encripta, los datos de su archivo original se interrumpirán por completo una vez (ciertamente no querrá comprender el complejo proceso de encriptación de AES, ni entenderá por qué lo está haciendo). Los datos se cifran así, porque es demasiado complicado), cifrar dos veces significa que los datos del archivo original se codifican completamente dos veces.
Pero este tipo de codificación se puede recuperar, porque AES es un algoritmo de cifrado simétrico. AES cifra N veces, luego usa la misma clave para descifrar N veces. Entonces 提及到AES加密我建议最好说明AES加密了几次. Al mismo 逆向分析的时候,如果识别出AES算法,在做数据加解密验证时,一定尝试执行多次解密程序,AES等对称算法并不一定是加密了一次,有些勒索病毒可能加密几百次对称算法才会写入标记不再加密tiempo ,.
2. El cifrado RSA cambiará el tamaño de los datos originales, y los datos cifrados por la misma clave pública siempre tienen un byte fijo de datos que es diferente . RSA es más seguro que AES, porque los pares de claves pública y privada son diferentes y se pueden almacenar por separado. RSA2048-bit es actualmente un algoritmo de cifrado que es difícil de descifrar para las computadoras humanas. La mayor parte de la autenticación de seguridad en nuestras vidas en realidad proviene de RSA2048.
El cifrado RSA es relativamente seguro, pero el cifrado AES es más rápido. Por lo tanto, en el mercado, incluido el ransomware, la forma más común es usar AES para cifrar una gran cantidad de archivos y luego usar RSA para cifrar la clave AES después del incidente, de modo que pueda ser rápido y seguro.
3. Además, después del cifrado, debe considerar agregar una marca, cómo determinar que el archivo ha sido cifrado y evitar el cifrado repetido.
4. El almacenamiento de la llave.
Inserte la descripción de la imagen aquí
Código de lenguaje C para enumerar directorios en Linux: https://www.cnblogs.com/xudong-bupt/p/3504442.html
Instale la biblioteca de terceros openssl en Linux y genere un par de claves pública-privada RSA: http://blog.chinaunix.net/uid-28595538-id-5056327.html Cómo compilar, instalar y usar la biblioteca de terceros OpenSSL, y use la API proporcionada por OpenSSL En base a esto, se genera un archivo que almacena el par de claves públicas de tipo RSA.
Linux se basa en la biblioteca openssl para utilizar el proceso de cifrado y descifrado RSA4096 https://blog.csdn.net/u012939880/article/details/89004438

Supongo que te gusta

Origin blog.csdn.net/qq_43312649/article/details/107242671
Recomendado
Clasificación