首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在WinCrypt中生成和使用公钥密码

如何在WinCrypt中生成和使用公钥密码
EN

Stack Overflow用户
提问于 2011-02-02 08:11:12
回答 4查看 5.6K关注 0票数 4

我目前正在试验Windows Cryptography,并且遇到了一些公钥加密的问题。我可以找到许多如何加密项目的示例,但没有直接涉及到从头到尾的公钥模型。

以下是生成加密密钥对的当前代码的大致轮廓,为了可读性,我删除了错误检查代码

代码语言:javascript
复制
// 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();

我的两个导出的密钥是不同的,但都能够在不加载另一个密钥的情况下解密消息。此外,如果我在加载导出的公钥的新会话中加密新消息,我仍然可以使用任一密钥解密它。

有没有人能告诉我我可能做错了什么或遗漏了什么?我是不是走错了路?

EN

回答 4

Stack Overflow用户

发布于 2011-04-15 20:42:11

我不完全理解你的问题。但总体来说

  1. 不使用公钥直接加密数据。
  2. 加密过程:使用会话/对称/私钥对数据进行加密。然后使用AT_EXCHANGE公钥对该会话密钥进行加密。
  3. During Decryption: AT_EXCHANGE私钥将对会话密钥进行解密。反过来,此会话密钥将用于解密实际数据。
票数 0
EN

Stack Overflow用户

发布于 2011-05-04 22:55:14

我现在还不是加密方面的专家!但我现在正在做这件事,所以我可以感受到你的痛苦……

加密位看起来有问题

代码语言:javascript
复制
// 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“,而实际上你应该传入包含要加密的字符串的缓冲区,这样它就可以计算出大小并为你返回它!然后你就可以继续下一步了..我知道导出位是如何工作的(因为您在该上下文中使用键),而在这里您处理的是实际的消息。试着传入参数,看看结果如何?

我想你会发现你实际上不能用两个密钥解密,因为你实际上还没有加密任何东西?我想你是把消息加密到一个零大小的缓冲区中。

正如我所说,不是专家,但在我看来确实是错误的.最奇怪的是,我前几天找到了你的帖子,并收获了帮助我理解它的工作片段,所以我真的希望这些信息能对你有所帮助!

票数 0
EN

Stack Overflow用户

发布于 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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4869454

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档