编辑:我已经考虑了更多,并决定只加密内存中的变量会更好,更容易,而当我想使用它时,只需对其解密即可。我尝试使用以下代码:
DWORD blockSize = CRYPTPROTECTMEMORY_BLOCK_SIZE;
int* protectedBlock = (int*)LocalAlloc(LPTR, (SIZE_T)blockSize);
protectedBlock[0] = 1234;
printf("Before encryption: %d\n", protectedBlock[0]);
// OUTPUT: 1234
CryptProtectMemory(protectedBlock, blockSize, CRYPTPROTECTMEMORY_SAME_PROCESS);
printf("After encryption: %d\n", protectedBlock[0]);
// OUTPUT: The encrypted string
CryptUnprotectMemory(protectedBlock, blockSize, CRYPTPROTECTMEMORY_SAME_PROCESS);
printf("After decryption: %d\n", protectedBlock[0]);
//OUTPUT: 1234
SecureZeroMemory(protectedBlock, blockSize);
LocalFree(protectedBlock);
当我想加密整数时,它工作正常,但是当我尝试使用字符串(LPCSTR)时,字符串仍保留在内存中。这是我使用的代码:
DWORD blockSize = CRYPTPROTECTMEMORY_BLOCK_SIZE;
LPTSTR* protectedBlock = (LPTSTR*)LocalAlloc(LPTR, (SIZE_T)blockSize);
protectedBlock[0] = (LPTSTR)"Test String";
printf("Before encryption: %d\n", protectedBlock[0]);
CryptProtectMemory(protectedBlock, blockSize, CRYPTPROTECTMEMORY_SAME_PROCESS);
printf("After encryption: %d\n", protectedBlock[0]);
// OUTPUT: The encrypted string
CryptUnprotectMemory(protectedBlock, blockSize, CRYPTPROTECTMEMORY_SAME_PROCESS);
cout << "After decryption: " << (char*)protectedBlock[0] << endl;
//OUTPUT: Test String
SecureZeroMemory(protectedBlock, blockSize);
LocalFree(protectedBlock);
答案 0 :(得分:2)
哪个“内存”。 CPU寄存器,内存,高速缓存,交换磁盘等。您要问的是一个复杂的问题,您可能会写一本书。
实际上,它在汇编中可能仅是可行的(多数民众赞成在辩论中),在这种情况下,您可以确定编译器不会进行某些未知的优化。即使这样也不能总是停止cpu寄存器/缓存等。
您应该问自己的真正问题是,您试图保护谁免受其侵害。
这里的一些内容可以帮助您开始处理少量必须解决的问题。
我首先来看一下对内存中的变量进行加密(这本身可能是一个很大的话题)。
Google和您的朋友在这里读书。
答案 1 :(得分:1)
for(int[] row : grid){
for(int square : row){
System.out.print(square + " ");
}
System.out.println();
}
这是错误的,原因有两个:
通过在代码中使用字符串文字protectedBlock[0] = (LPTSTR)"Test String";
,可以使该字符串文字成为程序的一部分。您将不得不以其他方式将字符串组装到内存中。
"Test String"
是指向字符串的长指针。因此,您在受保护的块中放置了一个指向字符串的指针。然后,通过保护该块,可以保护该指针。但是指针不是您想要保护的,而是您想要保护字符串本身的。因此,您需要将字符串数据本身放入受保护的块中,而不是指向它的指针。