首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C语言实现AES ofb解密

用C语言实现AES ofb解密
EN

Stack Overflow用户
提问于 2013-04-23 05:45:10
回答 1查看 1.1K关注 0票数 1

我正在使用AES加密,我遇到了这个问题。我在网上的某个地方发现了一个代码示例,并尝试使用它。(我使用的是Gladman AES库)

代码语言:javascript
复制
#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()有关。但是我还在学习,所以我不太理解它。所以我会很感激我能得到的任何帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-23 06:03:07

您的key包含垃圾。AES256密钥不是字符串;它恰好是32字节的二进制数据。您传递的是8个字节("password")加上接下来的24个字节,它们恰好位于堆栈中。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16157288

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档