C++ 基于PUBLICKEYBLOB/PRIVATEKEYBLOB生成会话密钥

C++ 基于PUBLICKEYBLOB/PRIVATEKEYBLOB生成会话密钥,c++,windows,winapi,cryptoapi,C++,Windows,Winapi,Cryptoapi,我的代码是这样的,我在这里跟踪了每个未定义的方法,找到了包含相关参数的函数 我很难理解API。因此,我在这里可以生成公钥/私钥,我可以生成会话密钥,但是如何基于公钥生成会话密钥呢? 我在这里遗漏了什么/假设了什么(错) 会话密钥是对称密钥(即用于加密和解密的同一密钥)。它使用非对称密钥对(公钥和私钥)与其他节点秘密交换 因此,您不会从公钥生成会话密钥,而是自己生成会话密钥(或者更好地通过注释中指出的某些协议进行协商,例如D-H密钥交换),并使用另一个节点的公钥对会话密钥进行加密并发送。因此,只有

我的代码是这样的,我在这里跟踪了每个未定义的方法,找到了包含相关参数的函数

我很难理解API。因此,我在这里可以生成公钥/私钥,我可以生成会话密钥,但是如何基于公钥生成会话密钥呢? 我在这里遗漏了什么/假设了什么(错)


会话密钥是对称密钥(即用于加密和解密的同一密钥)。它使用非对称密钥对(公钥和私钥)与其他节点秘密交换

因此,您不会从公钥生成会话密钥,而是自己生成会话密钥(或者更好地通过注释中指出的某些协议进行协商,例如D-H密钥交换),并使用另一个节点的公钥对会话密钥进行加密并发送。因此,只有另一方可以发现会话密钥,因为只有它可以使用其私钥解密数据


阅读将有助于

会话密钥是对称密钥(意思是用于加密和解密的同一密钥)。它使用非对称密钥对(公钥和私钥)与其他节点秘密交换

因此,您不会从公钥生成会话密钥,而是自己生成会话密钥(或者更好地通过注释中指出的某些协议进行协商,例如D-H密钥交换),并使用另一个节点的公钥对会话密钥进行加密并发送。因此,只有另一方可以发现会话密钥,因为只有它可以使用其私钥解密数据


阅读将有助于

或双方使用密钥协议独立协商。因此,在网络流的情况下,我将使用另一方的公钥加密会话密钥,他们将共享该密钥以加密网络流量。如果连接是长期存在的(并且每个新连接生成一个新会话密钥),则定期交换新会话密钥。在对文件进行加密的情况下,我只会使用公钥对其进行加密??开始时的一次交换(根据协商协议的不同,会有几个数据包)最终会导致双方都知道会话密钥。两个节点之间的所有后续数据包都将使用会话密钥进行加密和解密。这与您是否有文件或任何要发送的内容无关。在网络级别上,它只是数据包,当您尝试与另一端(SSL、IPsec)建立安全连接时,第一步将是使用非对称方法进行密钥交换(这种方法计算量更大,因此每个会话只执行一次)。如上所述,您为什么要尝试手动执行此操作?使用任何加密api(如OpenSSL)都可以做到这一点。@CS相反,这太令人兴奋了。密码学很难,不适合业余爱好者。或者双方使用密钥协议独立协商。因此,在网络流的情况下,我将使用另一方的公钥加密会话密钥,他们将共享该密钥以加密网络流量。如果连接是长期存在的(并且每个新连接生成一个新会话密钥),则定期交换新会话密钥。在对文件进行加密的情况下,我只会使用公钥对其进行加密??开始时的一次交换(根据协商协议的不同,会有几个数据包)最终会导致双方都知道会话密钥。两个节点之间的所有后续数据包都将使用会话密钥进行加密和解密。这与您是否有文件或任何要发送的内容无关。在网络级别上,它只是数据包,当您尝试与另一端(SSL、IPsec)建立安全连接时,第一步将是使用非对称方法进行密钥交换(这种方法计算量更大,因此每个会话只执行一次)。如上所述,您为什么要尝试手动执行此操作?使用任何加密api(如OpenSSL)都可以做到这一点。@CS相反,这太令人兴奋了。密码学很难,不适合业余爱好者。为什么要重新发明SSL?为什么要重新发明SSL?


void Crypto::GenerateKeyPair( Buffer& publicKey, Buffer& privateKey ) throw(WinError)
{
    /* CryptAcquireContext ( PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) */
    CryptContext context = CryptoProviders::NewContext(PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
    /* CryptGenKey( AT_KEYEXCHANGE, CRYPT_EXPORTABLE, &key) */
    CryptKey key = context.GenerateKeyExchangePair(); 
    /* CryptExportKey( PUBLICKEYBLOB, pPub); */
    key.ExportPublicKey(publicKey);
    /* CryptExportKey( PRIVATEKEYBLOB, pPriv); */
    key.ExportPrivateKey(privateKey);
}


void Crypto::GenerateSessionKey( Buffer& sessionKey ) throw(WinError)
{
    /* CryptAcquireContext ( PROV_RSA_FULL, 0 ) */
    CryptContext context = CryptoProviders::NewContext(PROV_RSA_FULL, 0);
    /* CryptGenKey( CALG_RC4, CRYPT_EXPORTABLE ) */
    /* CryptGetUserKey( AT_KEYEXCHANGE ) */
    /* CryptExportKey( SIMPLEBLOB ) */
    context.GenerateSessionKey(sessionKey);
}

void Crypto::EncryptData( const Buffer& publicKey, const Buffer& plaintext, Buffer& encrypted )
{
    /* CryptAcquireContext ( PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) */
    CryptContext hProvider(PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
    /* CryptImportKey( 0 ) */
    CryptKey key = hProvider.ImportKey(publicKey);
    /* CryptEncrypt() */
    key.Encrypt(plaintext, encrypted);

}

void Crypto::DecryptData( const Buffer& privateKey, const Buffer& encrypted, Buffer& plaintext )
{
    /* CryptAcquireContext ( PROV_RSA_FULL, CRYPT_VERIFYCONTEXT ) */
    CryptContext hProvider(PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
    /* CryptImportKey( 0 ) */
    CryptKey key = hProvider.ImportKey(privateKey);
    /* CryptDecrypt() */
    key.Decrypt(encrypted, plaintext);
}