7

メッセージを暗号化/復号化する簡単なテスト プログラムを作成しました。

私は持っていkeylengthます:

int keylength = 1024; // it can also be 2048, 4096

および最大入力長:

int maxlen = (keylength/8)-11;

そして、入力サイズが maxlen よりも小さい必要があることを知っています。次のようになります。

if(insize >= maxlen)
        printf("cannot encrypt/decrypt!\n");

私の質問は簡単です - より長いRSAメッセージで暗号化/復号化することは可能ですか(そうであれば、どうすればよいですか) maxlen?

メイン コードも非常に単純ですが、insize < maxlen の場合にのみ機能します。

   if((encBytes=RSA_public_encrypt(strlen(buff1)+1, buff1, buff2, keypair, RSA_PKCS1_PADDING)) == -1)
    {
        printf("error\n");
    }

    if((decBytes=RSA_private_decrypt(encBytes, buff2, buff3, keypair, RSA_PKCS1_PADDING)) == -1)
    {
        printf("error\n");
    }
4

4 に答える 4

6

長いメッセージを暗号化するには、複合スキームが必要です。RSA アルゴリズムはセッション キー (つまり AES キー) を暗号化し、データ自体はそのキーで暗号化されます。別の自転車を発明するのではなく、十分に確立されたスキーム、つまり PKCS#7/CMS または OpenPGP を必要に応じて使用することをお勧めします。

于 2013-10-13T11:51:26.897 に答える
1

「ブロック暗号」の種類のモードで RSA を実行する場合は、ループで実行する必要があります。

他のほとんどのコメンターと同様に、これは RSA の不適切な使用であることを指摘したいと思います。AES キーを RSA で暗号化してから、長いメッセージに AES を使用する必要があります。

ただし、私は実用性が学習の邪魔になることを許す人ではないので、次のようにします。あなたが使用しているライブラリがわからないため、このコードはテストされていません。また、読みやすくするために、少し冗長です。

int inLength = strlen(buff1)+1;
int numBlocks = (inLength / maxlen) + 1;

for (int i = 0; i < numBlocks; i++) {
    int bytesDone = i * maxlen;
    int remainingLen = inLength - bytesDone;
    int thisLen; // The length of this block

    if (remainingLen > maxlen) {
       thisLen = maxlen;
    } else {
        thisLen = remainingLen;
    }

    if((encBytes=RSA_public_encrypt(thisLen, buff1 + bytesDone, buff2 + bytesDone, keypair, RSA_PKCS1_PADDING)) == -1)
    {
        printf("error\n");
    }

    // Okay, IDK what the first parameter to this should be. It depends on the library. You can figure it out, hopefully.
    if((decBytes=RSA_private_decrypt(idk, buff2 + bytesDone, buff3 + bytesDone, keypair, RSA_PKCS1_PADDING)) == -1)
    {
        printf("error\n");
    }
}
于 2013-10-21T17:13:27.330 に答える