4

現在、Windows 暗号化 API を試していて、公開鍵暗号化でいくつかの問題が発生しています。アイテムを暗号化する方法の例はたくさんありますが、最初から最後までの公開鍵モデルに直接対処するものはありません。

現在のコードで暗号化キー ペアを生成する方法の大まかな概要を次に示します。読みやすくするためにエラー チェック コードを削除しました。

// MAKE AN RSA PUBLIC/PRIVATE KEY:
    CryptGenKey(hProv, CALG_RSA_KEYX, CRYPT_EXPORTABLE, &hKey);

// NOW LET'S EXPORT THE PUBLIC KEY:
    DWORD keylen;
    CryptExportKey(hKey,0,PUBLICKEYBLOB,0,NULL,&keylen);
    LPBYTE KeyBlob;
    KeyBlob = (LPBYTE)malloc(keylen);
    CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,KeyBlob,&keylen);
    ofstream outputkey;
    outputkey.open("TestPublicKey.txt", ios_base::out | ios_base::binary);
    for(size_t i=0; i < keylen; ++i)
        outputkey<<KeyBlob[i];
    outputkey.close();
    free(KeyBlob);

// NOW LET'S EXPORT THE PRIVATE KEY:
    CryptExportKey(hKey, 0, PRIVATEKEYBLOB,0,NULL,&keylen);
    KeyBlob = (LPBYTE)malloc(keylen);
    CryptExportKey(hKey,NULL,PRIVATEKEYBLOB,0,KeyBlob,&keylen)
    outputkey.open("TestPrivateKey.txt", ios_base::out | ios_base::binary);
    for(size_t i=0;i<keylen;++i)
        outputkey<<KeyBlob[i];
    outputkey.close();
    free(KeyBlob);

// ENCRYPT A (SHORT) TEST MESSAGE [SHOULD JUST BE ANOTHER ALG'S KEY LATER]:
    DWORD encryptBufferLen=0;
    CryptEncrypt(hKey, 0, true, 0, NULL, &encryptBufferLen, 0); // how much space?
    BYTE* encryptionBuffer = (BYTE*)malloc(encryptBufferLen);
    memcpy(encryptionBuffer, TestMessage, TestMessageLen); // move for in-place-encrypt
    CryptEncrypt(hKey,0,true,0, encryptionBuffer, &bufferlen, encryptBufferLen );

    ofstream message;
    message.open("Message.txt", ios_base::out | ios_base::binary);
    for(size_t i=0;i<encryptBufferLen;++i)
        message<<encryptionBuffer[i];
    message.close();

エクスポートした 2 つのキーは異なりますが、どちらも他のキーを読み込まなくてもメッセージを復号化できます。さらに、エクスポートされた公開鍵をロードする新しいセッションで新しいメッセージを暗号化すると、どちらの鍵でも復号化できます。

私が間違っていることや行方不明になっている可能性があることについて、誰かが私にアドバイスできますか? 私は完全に間違った道を進んでいますか?

4

4 に答える 4

0

私はまだこの暗号化の専門家ではありません! しかし、私は現在これに取り組んでいるので、あなたの痛みを感じることができます...

暗号化ビットに問題があるようです

// ENCRYPT A (SHORT) TEST MESSAGE [SHOULD JUST BE ANOTHER ALG'S KEY LATER]:
DWORD encryptBufferLen=0;
CryptEncrypt(hKey, 0, true, 0, NULL, &encryptBufferLen, 0); // how much space?
BYTE* encryptionBuffer = (BYTE*)malloc(encryptBufferLen);
memcpy(encryptionBuffer, TestMessage, TestMessageLen); // move for in-place-encrypt
CryptEncrypt(hKey,0,true,0, encryptionBuffer, &bufferlen, encryptBufferLen );

メモリを割り当てることができるように、暗号化されたメッセージのサイズ、つまりサイズを関数に提供するように求めているようです...しかし、キー自体とは別に何も渡していないので、それができるとは思いませんその情報を確実に提供する..

CryptEncrypt(hKey, 0, true, 0, NULL, &encryptBufferLen, 0); があります。// しかし、暗号化する文字列を含むバッファを実際に渡す必要があるのに、なぜ「NULL」なので、サイズを計算して返すことができます! 次に、残りの部分に進むことができます..エクスポートビットがどのように機能するかはわかっています(そのコンテキストでキーを操作しているため)が、ここでは実際のメッセージを扱っています。パラメータを渡してみて、どうなるか見てみましょう。

実際にはまだ何も暗号化していないため、実際には両方のキーで復号化できないことがわかると思います???? メッセージをゼロサイズのバッファに暗号化すると思います。

専門家ではないと言いましたが、私には間違っているように見えます...奇妙なことに、先日あなたの投稿を見つけて、それを理解するのに役立つ作業ビットを収集したので、この情報があなたに役立つことを本当に願っています!

于 2011-05-04T14:55:14.390 に答える
0

マイクロソフトが提供する以下のリンクを参照してください

http://msdn.microsoft.com/en-us/library/windows/desktop/aa382358(v=vs.85).aspx

http://msdn.microsoft.com/en-us/library/windows/desktop/aa382044(v=vs.85).aspx

于 2013-07-22T11:45:33.070 に答える
0

私はあなたの質問を完全には理解していません。しかし、一般的に

  1. 公開鍵を使用してデータを直接暗号化することはありません。

  2. 暗号化中: セッション/対称/秘密キーを使用してデータを暗号化します。このセッション キーは、AT_EXCHANGE 公開キーによって暗号化されます。

  3. 復号化中: AT_EXCHANGE 秘密鍵がセッション キーを復号化します。次に、このセッション キーを使用して実際のデータを復号化します。

于 2011-04-15T12:42:11.470 に答える