c - C中的AES ofb解密

标签 c encryption aes

我正在使用 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()有关。但是我只是在学习,所以我不太了解。所以我会很感激我能得到的任何帮助。

最佳答案

您的 key 包含垃圾。 AES256 key 不是字符串;它正好是 32 字节的二进制数据。您传递的是八个字节(“密码”)加上恰好在堆栈上的接下来的 24 个字节。

您不能将人工提供的密码传递给 aes_encrypt_key256()。您需要先使用 PBKDF2 或其他 key 派生函数(例如 bcrypt 或 scrypt)将其转换为 key 。 BSD在 C 中有许多 PBKDF2 实现之一。

关于c - C中的AES ofb解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16157288/

相关文章:

python - AES 256 加密 -> 更改初始化向量会在不知道 key 的情况下稍微更改解密的消息

c - 如何处理跨平台 C 库中的 Unicode 路径?

android - 在 Ionic/Cordova 应用程序中存储加密数据

security - 用于安全文件传输的跨平台加密/解密应用程序

node.js - Node - 生成 AES-CBC key 和 iv

c# - 在 dotnet core 中使用密码和盐对字符串进行编码和解码

c - 最后一次循环迭代的内存分配失败

C代码调用Pthread(secondary thread)下的GTK_MAIN

c - 链接列表,为什么我收到不兼容类型和不完整结构错误

Java - 通过 BlowFish 密码进行 2 字节字符加密