0

暗号文を復号化する次の関数があります。

ただし、平文の長さを持たずにデータを復号化したいという問題があります。それ、どうやったら出来るの?暗号化されたデータを送信するかのように、平文の長さで暗号文を送信するのは適切ではありません。

int main()
{
/*some code*/
char input[] = "123456789abcdef";
int olen, len;
len = strlen(input)+1;

plaintext = (char *)aes_decrypt(&de, ciphertext, &len);
/*some code*/
}

復号方法

unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
    {
      /* plaintext will always be equal to or lesser than length of ciphertext*/
      int p_len = *len, f_len = 0;
      unsigned char *plaintext = (unsigned char *)malloc(p_len);

      if(!EVP_DecryptInit_ex(e, NULL, NULL, NULL, NULL)){
        printf("ERROR in EVP_DecryptInit_ex \n");
        return NULL;
      }

      if(!EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len)){
        printf("ERROR in EVP_DecryptUpdate\n");
        return NULL;
      }

      if(!EVP_DecryptFinal_ex(e, plaintext+p_len, &f_len)){
        printf("ERROR in EVP_DecryptFinal_ex\n");
        return NULL;
      }

      *len = p_len + f_len;
      return plaintext;
    }

前もって感謝します!!:)

4

2 に答える 2

4

平文の長さは実際には必要ありません。暗号文の長さだけです。

EVP は PKCS #7 パディングを「自動的に」実行および処理でき、デフォルトでこれを行います。PKCS #7 パディングは次のように機能します。暗号化のために平文をブロック アラインするために必要なパディングの文字数を決定し、その数を取得して平文の最後にその回数 (バイト形式で) 繰り返します。

たとえば、16 進形式のプレーンテキストの 14 バイト ブロックがあるとします。

61 74 74 61 63 6b 20 61 74 20 64 61 77 6e

暗号化のために16バイトにパディングする必要があります。02取得するために最後に2回追加します

61 74 74 61 63 6b 20 61 74 20 64 61 77 6e 02 02

平文がすでに 16 バイト境界に配置されている場合は、平文の末尾に 16 バイト10(つまり、16 進数で 16) を追加します。したがって、パディングが平文に存在すると常に想定できるため、推測する必要がなくなります。EVP のルーチンは、復号化後にパディングを検出して削除し、元の平文を正しい長さで返します。

于 2012-07-26T15:54:26.217 に答える
1

通常、暗号化の前に、クリアテキストの前に長さインジケータを付けます。これは、1 バイトの「最後のブロックの有効なバイト」と同じくらい小さい場合があります。

于 2012-07-26T16:07:33.880 に答える