代码之家  ›  专栏  ›  技术社区  ›  CS.

基于PUBLICKEYBLOB/PRIVATEKEYBLOB[已关闭]生成会话密钥

  •  1
  • CS.  · 技术社区  · 11 年前

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

    我很难理解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);
    }
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   fkl    11 年前

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

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

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