C++编写遍历文件RSA与AES加解密程序时需要注意的问题

遍历文件的程序架构

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);
	}
}

该函数是自己封装的一个函数,提供路径参数一WCHAR path[MAX_PATH] = “C:\enum”;和参数二WCHAR* filetail = L".json"即可遍历C盘enum目录下所有的json后缀文件。(WCHAR*等价于LPCWSTR)
遍历文件的程序网上很多,但是重点是路径的处理方式
传入函数参数路径形式:C:双斜杠enum
递归传给FindFirstFile的路径必须特殊处理wsprintf(enumpath, L"%s%s", path,L"双斜杠+星号");
记住这点,不管使用什么样形式的API,都可以轻松实现遍历文件。

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); //每次读取一个字节 
	

如果RSA密钥是以文件存储时,在读入到内存时一定要以二进制的方式读入。否则会出现解密过后的数据不正确的情况。

RSA加解密和AES加解密应该注意

一、AES本质是一种对称加密算法,AES的密钥长度为108字节,实质上是包含了key(100字节,即256位)和iv(8字节=32位)。这也就是我们所说的AES256。编写程序时大部分都把key和iv集成在库里当作一个密钥对待。AES的加密是不会改变原数据的大小。AES的加密可以理解为一种二进制数据的重新洗牌,AES加密一次你的原文件数据就被完全打乱一次(你肯定是不想去了解AES的复杂加密过程的,也不会去了解为什么自己的数据被加密成这样,因为太复杂了),加密两次就是原文件数据被完全打乱两次。
但这种打乱是可以恢复的,因为AES是一种对称加密算法。AES加密N次,就用同样的密钥解密N次。所以提及到AES加密我建议最好说明AES加密了几次。同时,逆向分析的时候,如果识别出AES算法,在做数据加解密验证时,一定尝试执行多次解密程序,AES等对称算法并不一定是加密了一次,有些勒索病毒可能加密几百次对称算法才会写入标记不再加密
二、RSA的加密是会改变原数据的大小,并且被同样的公钥加密后的数据总有固定的字节数据是不同的。RSA相对AES来说更安全,因为公私钥对不同,可以分别存储。RSA2048位是目前来说人类计算机很难破解的加密算法,我们生活中大部分的安全身份验证其实都来自于RSA2048。
RSA加密相对比较安全,但是AES加密速度比较快。所以市场上,包括勒索病毒,最常采用的方式就是用AES去加密大量的文件,完事儿后再用RSA加密AES的密钥,这样就可以又快又安全。
三、另外加密过后要考虑添加标记,如何判定文件已经被加密,防范重复加密。
四、密钥的存放。
在这里插入图片描述
Linux上枚举目录的C语言代码:https://www.cnblogs.com/xudong-bupt/p/3504442.html
Linux上安装openssl第三方库并生成RSA公私钥对:http://blog.chinaunix.net/uid-28595538-id-5056327.html如何编译安装和使用第三方库 OpenSSL ,并在 OpenSSL 提供的 API 的基础上生成存放 RSA 类型的公密钥对的文件。
Linux上依赖openssl库用RSA4096加解密程https://blog.csdn.net/u012939880/article/details/89004438

猜你喜欢

转载自blog.csdn.net/qq_43312649/article/details/107242671
今日推荐