0

AES暗号化文字列を復号化するためにこの単純な関数を使用しています

unsigned char *aes_decrypt(EVP_CIPHER_CTX *e, unsigned char *ciphertext, int *len)
{
  int p_len = *len, f_len = 0;
  unsigned char *plaintext = (unsigned char*)malloc(p_len + 128);
  memset(plaintext,0,p_len);
  EVP_DecryptInit_ex(e, NULL, NULL, NULL, NULL);
  EVP_DecryptUpdate(e, plaintext, &p_len, ciphertext, *len);
  EVP_DecryptFinal_ex(e, plaintext+p_len, &f_len);

  *len = p_len + f_len;
  return plaintext;
}

問題は、len がデコードされた文字列全体と一致しない値を返すことです。何が問題なのですか?

4

2 に答える 2

2

あなたが「文字列」と言うとき、私はあなたがゼロで終わるテキスト文字列を意味すると思います。暗号化プロセスは暗号ブロックサイズに依存し、多くの場合パディングに依存します。実際にエンコードおよびデコードされるのはアプリケーション次第です...それはすべて暗号に対するバイナリデータです。テキスト文字列が復号化プロセスから返されるものよりも小さい場合、アプリケーションは有用な部分を決定する必要があります。したがって、たとえば、結果内の文字列がゼロで終了していることがわかっている場合は、単純なstrlenを実行して長さを取得できます。もちろん、入力を保証できない場合は危険です...デコードされた長さまでのnullを結果で検索する方がおそらく良いでしょう...

于 2012-09-21T13:06:40.810 に答える
1

ECB、CBC、またはその他の連鎖モードで暗号を使用している場合は、暗号ブロックの長さの倍数の長さにプレーンテキストをパディングする必要があります。たとえば、PKCS#5 標準を確認できます。OpenSSL のような高レベル関数は、プログラマーに対して透過的にパディングを実行できます。そのため、暗号化されたテキストは、追加の暗号ブロック サイズまでプレーン テキストよりも大きくなる可能性があります。

于 2012-10-16T05:48:42.437 に答える