AES加密结果只有部分数据正确(使用mcrypt lib)

2024-05-07

我从以下位置下载了 AES 加密的示例代码https://gist.github.com/2436364 https://gist.github.com/2436364我修改了部分源代码以满足我的项目要求,如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mcrypt.h>
#include <math.h>
#include <stdint.h>

int encrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len){
  MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL);
  int blocksize = mcrypt_enc_get_block_size(td);
  if( buffer_len % blocksize != 0 )
    return 1;

  mcrypt_generic_init(td, key, key_len, IV);
  mcrypt_generic(td, buffer, buffer_len);
  mcrypt_generic_deinit (td);
  mcrypt_module_close(td);

  return 0;
}

int decrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len){
  MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL);
  int blocksize = mcrypt_enc_get_block_size(td);
  if( buffer_len % blocksize != 0 )
    return 1;

  mcrypt_generic_init(td, key, key_len, IV);
  mdecrypt_generic(td, buffer, buffer_len);
  mcrypt_generic_deinit (td);
  mcrypt_module_close(td);

  return 0;
}

void display(char* ciphertext, int len){
  int v;
  for (v=0; v<len; v++){
    if(v % 16 == 0) putchar('\n');
    printf("%02X ", (unsigned char)ciphertext[v]);
  }
  printf("\n");
}

int main()
{
  unsigned char plaintext[256];
  unsigned char IV[16] = {0xFA,0x8D,0x46,0x54,0x83,0xC6,0xED,0xD8,
    0x37,0x5A,0x9D,0xC1,0x3E,0x69,0x1B,0x04};
  unsigned char key[16] = {0x53, 0x75, 0x7a, 0x79, 0x26, 0x52, 0x69, 0x63,
    0x68, 0x42, 0x65, 0x72, 0x67, 0x69, 0x6e, 0x20};
  int keysize = 16; /* 128 bits */
  char* buffer;
  int buffer_len = 256;
  FILE *fp;

  fp = fopen("readbuf.bin", "r");
  fread(plaintext, 1, 256, fp);
  fread(plaintext, 1, 256, fp);
  fclose(fp);

  buffer = calloc(1, buffer_len);
  strncpy(buffer, plaintext, buffer_len);

  //printf("plain:   %s\n", plaintext);
  encrypt(buffer, buffer_len, IV, key, keysize); 
  printf("cipher:  "); display(buffer , buffer_len);
  //decrypt(buffer, buffer_len, IV, key, keysize);
  //printf("decrypt: %s\n", buffer);

  return 0;
}

我需要加密字节255~511读取缓冲区文件 https://docs.google.com/file/d/0Bx-G2vInJIsLWEpoNmVDY0NBRzQ/edit我得到的结果字节 0 ~ 0x6F 是正确的,但由于字节 0x70 结果不正确 源代码有错误吗?


感谢大家关心这个问题,我通过一遍又一遍的查看源代码找到了根本原因......

根本原因是函数调用:

strncpy(buffer, plaintext, buffer_len);

一切顺利,当我用 memcpy() 替换 strncpy() 时

memcpy(buffer, plaintext, buffer_len);

另外,我按照 WhozCraig 的建议修改源代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mcrypt.h>
#include <math.h>
#include <stdint.h>

int encrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len)
{
  MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL);
  int blocksize = mcrypt_enc_get_block_size(td);
  int n_blocks = buffer_len / blocksize;
  if( buffer_len % blocksize != 0 )
    return 1;

  mcrypt_generic_init(td, key, key_len, IV);
  for (int i = 0; i < n_blocks; i++) 
    mcrypt_generic(td, ((unsigned char* )buffer) + (i * blocksize), blocksize);
  mcrypt_generic_deinit (td);
  mcrypt_module_close(td);

  return 0;
}

int decrypt(void* buffer, int buffer_len, char* IV, char* key, int key_len){
  MCRYPT td = mcrypt_module_open("rijndael-128", NULL, "cbc", NULL);
  int blocksize = mcrypt_enc_get_block_size(td);
  int n_blocks = buffer_len / blocksize;
  if( buffer_len % blocksize != 0 )
    return 1;

  mcrypt_generic_init(td, key, key_len, IV);
  for (int i = 0; i < n_blocks; i++) 
    mdecrypt_generic(td, ((unsigned char *)buffer) + (i * blocksize), blocksize);
  mcrypt_generic_deinit (td);
  mcrypt_module_close(td);

  return 0;
}

void display(char* ciphertext, int len){
  int v;
  for (v=0; v<len; v++){
    if(v % 16 == 0) putchar('\n');
    printf("%02X ", (unsigned char)ciphertext[v]);
  }
  printf("\n");
}

int main()
{
  unsigned char plaintext[256];
  unsigned char IV[16] = {0xFA,0x8D,0x46,0x54,0x83,0xC6,0xED,0xD8,
    0x37,0x5A,0x9D,0xC1,0x3E,0x69,0x1B,0x04};
  unsigned char key[16] = {0x53, 0x75, 0x7a, 0x79, 0x26, 0x52, 0x69, 0x63,
    0x68, 0x42, 0x65, 0x72, 0x67, 0x69, 0x6e, 0x20};
  int keysize = 16; /* 128 bits */
  char* buffer;
  int buffer_len = 256;
  FILE *fp;

  fp = fopen("readbuf.bin", "r");
  fread(plaintext, 1, 256, fp);
  fread(plaintext, 1, 256, fp);
  fclose(fp);

  buffer = calloc(1, buffer_len);
  //strncpy(buffer, plaintext, buffer_len);
  memcpy(buffer, plaintext, buffer_len);

  printf("plain:   %s\n", plaintext);
  encrypt(buffer, buffer_len, IV, key, keysize); 
  printf("cipher:  "); display(buffer , buffer_len);
  decrypt(buffer, buffer_len, IV, key, keysize);
  printf("decrypt: %s\n", buffer);

  return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AES加密结果只有部分数据正确(使用mcrypt lib) 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • Exit() 时是否调用基本对象析构函数?

    我意识到这个问题已经出现过几次 但我试图获得上述问题的明确答案 但我不断遇到相互矛盾的信息 我需要知道的是 当我使用 exit 时 基本类对象是否被破坏 我知道需要删除动态内存 但我的意思更像是 include
  • 尝试了解使用服务打开对话框

    我已经阅读了有关使用 mvvm 模式打开对话框的讨论 我看过几个使用服务的示例 但我不明白所有部分如何组合在一起 我发布这个问题寻求指导 以了解我应该阅读哪些内容 以更好地理解我所缺少的内容 我将在下面发布我所拥有的内容 它确实有效 但从我
  • 使用 CMake 时如何导出 Emscripten 中的 C 函数

    In 本教程 https emscripten org docs porting connecting cpp and javascript Interacting with code html interacting with code
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我

随机推荐

  • 如何使用 JavaScript 将时间戳字符串转换为本地时间?

    我有一个 JSP 页面 其中我将存储在数据库中的时间戳作为字符串提取 其形式如下Thu Aug 21 2014 22 09 23 GMT 0530 India Standard Time 当然 我可以按原样在页面中显示它 但是我一直在寻找
  • 使用继承的 MVC2 DataAnnotations 验证

    我有一个 NET 2 0 类 其属性被标记为 virtual 我需要在 MVC2 应用程序中使用该类作为模型 因此 我创建了一个继承自 NET 2 0 类的 NET 3 5 类 并将 DataAnnotations 属性添加到新类中的重写属
  • 如何迭代视图的元素

    我有一个带有收音机 输入和按钮的视图 当我单击它时 我想检查所有输入是否包含信息 如何迭代活动中视图的元素并检查每个文本视图是否满足上述要求 谢谢 我在一些目前没有的代码中做了类似的事情 但从记忆中它应该是这样的 假设父视图 LinearL
  • 在 msAccess 中更新失败,但在 dgv C# 中更新成功

    这是我的 btnUpdate 代码 以便 msAccess 进行更新 private void btnUpdate Click object sender EventArgs e string CoString Provider Micro
  • PHP 构造函数返回 NULL

    我有这个代码 是否有可能User对象构造函数以某种方式失败 以便 this gt LoggedUser被分配了一个NULL构造函数返回后值和对象被释放吗 this gt LoggedUser NULL if SESSION verbiste
  • C# 反射和获取属性

    我有以下虚拟类结构 我试图找出如何从 PeopleList 中 People 类的每个实例获取属性 我知道如何从 People 的单个实例中获取属性 但我无法弄清楚如何从 PeopleList 中获取它 我确信这真的很简单 但有人能指出我正
  • 按字母顺序对集合进行排序

    有什么方法可以开箱即用地按字母顺序对集合进行排序 使用 C 2 0 Thanks 我们正在谈论什么样的收藏 AList
  • Android 软键盘先显示数字视图

    我的应用程序上有一个登录屏幕 它接受 CPF 作为登录名 CPF 是每个巴西公民都有的唯一号码标识 例如 10546819546 但它也可以接受护照号码作为登录名 并且上面可能有字母 我的问题是我希望键盘在弹出时在默认字母表之前显示数字 符
  • 如何解决 npm install 中的身份验证错误?

    在我的 package json 中 我有一个名为 somerepo git 的私人存储库 现在我通过 maven 在 buildserver bamboo 上运行 npm install 并收到此错误 ERROR npm ERR Comm
  • Rails 命名空间与嵌套资源

    假设我的应用程序有两个模型 Foo 和 Bar Foo 可选地属于 Bar 现在我可以查看单个 Foo 或者搜索特定的 Foo FoosController 会处理所有这些 我的网址是这样的 foos 1 and foos new 有时我想
  • php:不知从何而来的空行

    我有奇怪的错误 不知道如何解决它而不浪费太多时间 我的控制器中有一个方法 应该使用以下方法返回 xml header Content type text xml header Content Disposition attachment f
  • CQRS - 读取端的事件重播

    我读过几篇关于 CQRS 的博客 它们都解释说 在写入端 事件会持久保存在事件存储中 并且根据请求 事件将被检索并聚合重播 我的问题是为什么读取端不需要聚合事件重播 因为您的读取端不使用聚合 读取端实现为投影 它根据聚合发出的事件流计算当前
  • 设计如何覆盖 send_confirmation_instructions

    我正在尝试重写方法 send confirmation instructions 如下所示 http trackingrails com posts devise send confirmation mail manually or del
  • Serilog - RollingFile Sink 不会根据日期和大小滚动文件

    我正在使用 Serilog RollingFile Sink 但它将一天的所有数据存储在一个文件中 在我的应用程序中 一天写入 1 GB 日志 所以我想根据日期和大小滚动日志文件 如何配置 RollingFile Sink 根据日期和大小滚
  • 小于函数取消引用指针

    在某些情况下 STL 容器中有指针 并且小于比较不应通过指针进行 而应通过所指向的对象进行 一个简单的例子是一个应按实数排序的向量 目前我用以下方法解决这个问题 template
  • 将 jsonwebtoken 与 angular-cli 应用程序一起使用时出错

    我有一个 angular2 应用程序 它使用角度 cli https github com angular angular cli 20angular cli用于脚手架和其他任务 但现在我不能使用jsonwebtoken https git
  • 有向图的并查/不交集数据结构

    我正在寻找一个高效的联查 aka 不相交集 https en wikipedia org wiki Disjoint set data structure 我的数据结构有向图 https en wikipedia org wiki Dire
  • 获取符合某些条件的 Pandas DataFrame 的列和行索引对

    假设我有一只熊猫DataFrame喜欢跟随 这些值基于距离矩阵 A pd DataFrame 1 0 0 8 0 6708203932499369 0 6761234037828132 0 7302967433402214 0 8 1 0
  • libusb 和轮询/选择

    我正在使用 Linux 操作系统 想知道是否有任何文件描述符可以轮询 选择 当数据等待从 USB 设备读取时会触发这些文件描述符 我也在使用 libusb 库 但尚未找到可以使用的文件描述符 Use libusb 的轮询函数 http li
  • AES加密结果只有部分数据正确(使用mcrypt lib)

    我从以下位置下载了 AES 加密的示例代码https gist github com 2436364 https gist github com 2436364我修改了部分源代码以满足我的项目要求 如下 include