我目前正在试验Windows Cryptography,并且遇到了一些公钥加密的问题。我可以找到许多如何加密项目的示例,但没有直接涉及到从头到尾的公钥模型。
以下是生成加密密钥对的当前代码的大致轮廓,为了可读性,我删除了错误检查代码
// MAKE AN RSA PUBLIC/PRIVATE KEY:
CryptGenKey(hProv, CALG_RSA_KEYX, CRYPT_EXPORTABLE, &hKey);
// NOW LET'S EXPORT THE PUBLIC KEY:
DWORD keylen;
CryptExportKey(hKey,0,PUBLICKEYBLOB,0,NULL,&keylen);
LPBYTE KeyBlob;
KeyBlob = (LPBYTE)malloc(keylen);
CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,KeyBlob,&keylen);
ofstream outputkey;
outputkey.open("TestPublicKey.txt", ios_base::out | ios_base::binary);
for(size_t i=0; i < keylen; ++i)
outputkey<<KeyBlob[i];
outputkey.close();
free(KeyBlob);
// NOW LET'S EXPORT THE PRIVATE KEY:
CryptExportKey(hKey, 0, PRIVATEKEYBLOB,0,NULL,&keylen);
KeyBlob = (LPBYTE)malloc(keylen);
CryptExportKey(hKey,NULL,PRIVATEKEYBLOB,0,KeyBlob,&keylen)
outputkey.open("TestPrivateKey.txt", ios_base::out | ios_base::binary);
for(size_t i=0;i<keylen;++i)
outputkey<<KeyBlob[i];
outputkey.close();
free(KeyBlob);
// ENCRYPT A (SHORT) TEST MESSAGE [SHOULD JUST BE ANOTHER ALG'S KEY LATER]:
DWORD encryptBufferLen=0;
CryptEncrypt(hKey, 0, true, 0, NULL, &encryptBufferLen, 0); // how much space?
BYTE* encryptionBuffer = (BYTE*)malloc(encryptBufferLen);
memcpy(encryptionBuffer, TestMessage, TestMessageLen); // move for in-place-encrypt
CryptEncrypt(hKey,0,true,0, encryptionBuffer, &bufferlen, encryptBufferLen );
ofstream message;
message.open("Message.txt", ios_base::out | ios_base::binary);
for(size_t i=0;i<encryptBufferLen;++i)
message<<encryptionBuffer[i];
message.close();我的两个导出的密钥是不同的,但都能够在不加载另一个密钥的情况下解密消息。此外,如果我在加载导出的公钥的新会话中加密新消息,我仍然可以使用任一密钥解密它。
有没有人能告诉我我可能做错了什么或遗漏了什么?我是不是走错了路?
发布于 2011-04-15 20:42:11
我不完全理解你的问题。但总体来说
发布于 2011-05-04 22:55:14
我现在还不是加密方面的专家!但我现在正在做这件事,所以我可以感受到你的痛苦……
加密位看起来有问题
// ENCRYPT A (SHORT) TEST MESSAGE [SHOULD JUST BE ANOTHER ALG'S KEY LATER]:
DWORD encryptBufferLen=0;
CryptEncrypt(hKey, 0, true, 0, NULL, &encryptBufferLen, 0); // how much space?
BYTE* encryptionBuffer = (BYTE*)malloc(encryptBufferLen);
memcpy(encryptionBuffer, TestMessage, TestMessageLen); // move for in-place-encrypt
CryptEncrypt(hKey,0,true,0, encryptionBuffer, &bufferlen, encryptBufferLen );看起来你是在请求函数给你加密消息的大小,以便你可以分配它的内存,即大小...但是,除了密钥本身,您没有传递任何内容,所以我认为它不能肯定地提供该信息。
你有CryptEncrypt(hKey,0,true,0,NULL,&encryptBufferLen,0);//但是为什么要"NULL“,而实际上你应该传入包含要加密的字符串的缓冲区,这样它就可以计算出大小并为你返回它!然后你就可以继续下一步了..我知道导出位是如何工作的(因为您在该上下文中使用键),而在这里您处理的是实际的消息。试着传入参数,看看结果如何?
我想你会发现你实际上不能用两个密钥解密,因为你实际上还没有加密任何东西?我想你是把消息加密到一个零大小的缓冲区中。
正如我所说,不是专家,但在我看来确实是错误的.最奇怪的是,我前几天找到了你的帖子,并收获了帮助我理解它的工作片段,所以我真的希望这些信息能对你有所帮助!
发布于 2013-07-22 19:45:33
浏览下面由microsoft提供的链接
http://msdn.microsoft.com/en-us/library/windows/desktop/aa382358(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa382044(v=vs.85).aspx
https://stackoverflow.com/questions/4869454
复制相似问题