【问题标题】:Generate session key based on PUBLICKEYBLOB / PRIVATEKEYBLOB [closed]基于 PUBLICKEYBLOB / PRIVATEKEYBLOB 生成会话密钥 [关闭]
【发布时间】:2013-10-09 07:34:45
【问题描述】:

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

我很难理解 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);
}

【问题讨论】:

  • 为什么要重新发明 SSL?

标签: c++ windows winapi cryptoapi


【解决方案1】:

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

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

阅读reasons for using session keys 会有所帮助

【讨论】:

  • 或双方使用密钥协商协议独立协商。
  • 所以在网络流的情况下,我会用对方的公钥加密会话密钥,他们会共享这个密钥来加密网络流量。如果连接长期存在(并且每个新连接都会生成一个新的会话密钥),则定期交换新的会话密钥。在加密文件的情况下,我只会使用公钥来加密它?
  • 一开始的一次交换(几个数据包取决于协商协议)最终会导致双方都知道会话密钥。两个节点之间的所有后续数据包都将使用会话密钥进行加密和解密。这与您是否有文件或要发送的任何内容无关。在网络级别它只是数据包,当您尝试与另一端(SSL,IPsec)建立安全连接时,第一步将是使用非对称方法进行密钥交换(计算量更大,因此每个会话只完成一次) .
  • 如上所述,您为什么要手动执行此操作?使用任何加密 API(例如 open ssl)都可以为您做到这一点。
  • @CS 相反,它令人兴奋。密码学很难,不适合业余爱好者。
猜你喜欢
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 2016-10-06
  • 2023-04-06
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多