1

私は AES 暗号化で遊んでいますが、この問題に遭遇しました。ネットのどこかでコード例を見つけたので、それで遊んでみました。(Gladman AES ライブラリを使用しています)

#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include "aes.h"

void encrypt(const char *fileIn, const char *fileOut, const unsigned char *key);

void decrypt_string(const char *fileIn, const unsigned char *key);

int main() {

  const unsigned char key[] = "password";
  srand(time(NULL));
  aes_init();
  encrypt("TEST.raw", "TEST.raw.encrypted", key);
  decrypt_string("TEST.raw.encrypted", key);
  return 0;
}

void encrypt(const char *fileIn, const char *fileOut, const unsigned char *key) {
  int i;
  aes_encrypt_ctx ctx[1];
  unsigned char iv[16]; /* initialisation vector */
  unsigned char inBuffer[200], outBuffer[200];
  FILE *inFile = fopen(fileIn, "rb");
  FILE *outFile = fopen(fileOut, "wb");

  /* pick a random initialisation vector */

  for(i = 0; i < 16; ++i)
    iv[i] = rand() & 0xFF;
  fwrite(iv, 1, 16, outFile);

  aes_encrypt_key256(key, ctx);
  while((i = fread(inBuffer, 1, sizeof(inBuffer), inFile)) > 0) {
    aes_ofb_encrypt(inBuffer, outBuffer, i, iv, ctx);
    fwrite(outBuffer, 1, i, outFile);
  }

  aes_ofb_encrypt(inBuffer, outBuffer, i, iv, ctx);
  fwrite(outBuffer, 1, i, outFile);
  fclose(inFile);
  fclose(outFile);
}

void decrypt_string(const char *fileIn, const unsigned char *key) {
  int i,j;
  aes_encrypt_ctx ctx[1];
  unsigned char iv[16]; /* initialisation vector */
  unsigned char inBuffer[200], outBuffer[200];
  FILE *inFile = fopen(fileIn, "rb");
  //FILE *outFile = fopen(fileOut, "wb");
  /* read initialization vector from file */
  if(fread(iv, 1, 16, inFile) < 16)
    return; /* error: file doesn't even contain an initialisation vector */

  aes_encrypt_key256(key, ctx);
  while((i = fread(inBuffer, 1, sizeof(inBuffer), inFile)) > 0) {
    aes_ofb_decrypt(inBuffer, outBuffer, i, iv, ctx);
    printf("%s", outBuffer);
  }

  fclose(inFile);
}

これで、すべてがこのように正常に機能し、ファイルが正しく復号化されます。

しかし、暗号化されたファイルを取得し、decrypt_string() 関数を使用して再度復号化しようとすると、正しく復号化されません。プログラムの実行中にのみ機能します。今、私は aes.h でコメントを検索して見つけました。おそらく aes_mode_reset() と関係があります。でも勉強中なのでよくわかりません。ですから、私が得ることができるどんな助けにも感謝します。

4

1 に答える 1

3

あなたkeyにはゴミが含まれています。AES256 キーは文字列ではありません。正確に 32 バイトのバイナリ データです。8 バイト (「パスワード」) に加えて、たまたまスタックにある次の 24 バイトを渡しています。

人間が提供したパスワードを に渡すことはできませんaes_encrypt_key256()。まず、PBKDF2 または別のキー派生関数 (bcrypt や scrypt など) を使用してキーに変換する必要があります。BSDには、C での多くの PBKDF2 実装の 1 つがあります。

于 2013-04-22T22:03:07.130 に答える