1

我的代码看起来像这样,我将此处的每个未定义方法都追溯到包含相关参数的调用函数。

我很难理解 API。所以我这里有的是我可以生成公钥/私钥,我可以生成一个会话密钥,但是我怎样才能根据公钥生成一个会话密钥呢?我在这里缺少/假设(错误)什么?



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);
}
4

1 回答 1

1

会话密钥是对称密钥(意味着用于加密和解密的相同密钥)。它使用非对称密钥对(公钥和私钥)秘密地与另一个节点交换。

因此,您不会从公钥生成会话密钥,而是自己提出会话密钥(或者更好地通过评论中指出的某些协议进行协商,例如 DH 密钥交换)并使用其他节点的公钥对其进行加密,然后发送. 所以只有对方才能发现会话密钥,因为只有它可以使用其私钥解密数据。

阅读使用会话密钥的原因会有所帮助

于 2013-10-09T07:48:30.487 回答