我的代码看起来像这样,我在这里跟踪每个未定义的方法到包含相关参数的函数。
我很难绕过API。所以我在这里可以生成公钥/私钥,我可以生成 a 会话密钥,但是如何根据公钥生成会话密钥? 我在这里缺少什么/假设(错误)?
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);
}
答案 0 :(得分:1)
会话密钥是对称密钥(表示用于加密和解密的相同密钥)。与其他节点秘密使用非对称密钥对(公钥和私钥)进行交换。
所以你不从公钥生成会话密钥,而是你自己想出一个会话密钥(或者更好的是通过评论中指出的某些协议进行协商,例如DH密钥交换)并且使用其他节点的公钥对其进行加密并发送。因此,只有另一方才能发现会话密钥,因为它只能使用其私钥解密数据。