openssl c++ 3DES 文件加密解密失败

2023-12-27

我正在使用 openssl c lib 使用 3DES 加密解密文件,如果文件包含几个单词,则文件将被加密并解密,但如果源纯文件包含更多单词,则解密不正确。任何建议都会很友善!

#include <stdio.h>
#include <stdlib.h>

#include <openssl/pem.h>
#include <openssl/conf.h>
#include <openssl/x509v3.h>
#include <openssl/pkcs12.h>
#include <openssl/evp.h>
#include <openssl/rsa.h>
#include <openssl/md5.h>
#include <openssl/rc4.h>
#include <iostream>

using namespace std;
#define MAX_PATH 512

#define BUFLEN  2048
void DoEncrypt(const char* srcfile, const char* enc_file)
{
    char mykey[EVP_MAX_KEY_LENGTH] = "this's my key";
    char iv[EVP_MAX_IV_LENGTH] = "my iv"; 
    char ciphertext[BUFLEN*2] = {0};
    char plaintext[BUFLEN] = {0};
    FILE* fpread = fopen(srcfile, "rb");
    int iReadLen = 0;
    if (NULL == fpread)
    {
        cout<<"do encrypt read src file fail" <<endl;
        return;
    }
    FILE* fpwrite = fopen(enc_file, "w+");
    if (NULL == fpwrite)
    {
        cout<<"enc_file to create fail" <<endl;
        fclose(fpread);
        return;
    }
    const EVP_CIPHER* cipherType = EVP_des_ede3_ecb();
    EVP_CIPHER_CTX ctx;
    EVP_CIPHER_CTX_init(&ctx);

    int out_len;
    EVP_EncryptInit(&ctx, cipherType, (const unsigned char*)mykey, (const unsigned char*)iv);
    while ( (iReadLen = fread(plaintext, 1, BUFLEN, fpread)) > 0 )
    {
        memset(ciphertext, 0x00, sizeof(ciphertext));
        EVP_EncryptUpdate(&ctx, (unsigned char*)ciphertext, &out_len, (const unsigned char*)plaintext, iReadLen);
        fwrite(ciphertext, 1, out_len, fpwrite);
        memset(plaintext, 0x00, sizeof(plaintext));
    }
    EVP_EncryptFinal(&ctx, (unsigned char*)ciphertext, &out_len);
    fwrite(ciphertext, 1, out_len, fpwrite);
    EVP_CIPHER_CTX_cleanup(&ctx);

    fclose(fpread);
    fclose(fpwrite);
    cout<< "DoEncrypt finish" <<endl;
}
void DoDecrypt(const char* enc_file, const char* dec_file)
{
    char mykey[EVP_MAX_KEY_LENGTH] = "this's my key";
    char iv[EVP_MAX_IV_LENGTH] = "my iv"; 
    char ciphertext[BUFLEN*2] = {0};
    char plaintext[BUFLEN] = {0};
    FILE* fpread = fopen(enc_file, "rb");
    if (NULL == fpread)
    {
        cout<<"DoDecrypt enc file open fail" <<endl;
        return;
    }
    FILE* fpwrite = fopen(dec_file, "w+");
    if (NULL == fpwrite)
    {
        cout<< "DoDecrypt open dec file create fail" <<endl;
        fclose(fpread);
        return;
    }

    const EVP_CIPHER* cipherType = EVP_des_ede3_ecb();
    EVP_CIPHER_CTX ctx;
    EVP_CIPHER_CTX_init(&ctx);
    EVP_DecryptInit(&ctx, (const EVP_CIPHER*)cipherType, (const unsigned char*)mykey, (const unsigned char*)iv);
    int iReadLen, out_len;
    while ( (iReadLen = fread(plaintext, 1, BUFLEN, fpread)) > 0 )
    {
        memset(ciphertext, 0x00, sizeof(ciphertext));
        EVP_DecryptUpdate(&ctx, (unsigned char*)ciphertext, &out_len, (const unsigned char*)plaintext, iReadLen);
        fwrite(ciphertext, 1, out_len, fpwrite);
        memset(plaintext, 0x00, sizeof(plaintext));
    }
    EVP_DecryptFinal(&ctx, (unsigned char*)ciphertext, &out_len);
    fwrite(ciphertext, 1, out_len, fpwrite);
    EVP_CIPHER_CTX_cleanup(&ctx);

    fclose(fpread);
    fclose(fpwrite);
    cout<< "DoDecrypt finished" <<endl;
}

int main(void) 
{
    const char* srcfile = "abc.txt";
    const char* enc_file = "abc.txt.enc";
    const char* dec_file = "abc.txt.dec";
    DoEncrypt(srcfile, enc_file);
    DoDecrypt(enc_file, dec_file);
    return 0;
}

在 fopen 调用中,您需要“w+b”而不是“w+”。

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

openssl c++ 3DES 文件加密解密失败 的相关文章

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

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 尝试了解使用服务打开对话框

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

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 按扩展名过滤搜索文件返回太多结果

    我正在开发一个 C 控制台应用程序 它必须管理 Windows 操作系统上的文件 我需要获取具有特定扩展名的文件名 列表 我找到了很多解决方案 最建议的是以下一种 HANDLE hFind WIN32 FIND DATA data hFin
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 如何在 C# 中创建异步方法?

    我读过的每一篇博客文章都会告诉您如何在 C 中使用异步方法 但由于某些奇怪的原因 从未解释如何构建您自己的异步方法来使用 所以我现在有这段代码使用我的方法 private async void button1 Click object se
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 将哈希表数据集合导出到 CSV

    我正在尝试将集合哈希表项的名称 值对导出到 CSV 我还没有找到代码的选择对象部分的正确语法 我希望 CSV 文件具有 Url 和 Owner 的列 谢谢您的帮助 System Collections ArrayList collectio
  • Hive from_unixtime 毫秒

    我们在 Hive 中存储了一个时间戳纪元列 BIGINT 我们想要获取该纪元的日期 yyyy MM dd 问题是我的纪元以毫秒为单位 例如1409535303522 因此 选择时间戳 from unixtime timestamp yyyy
  • 用户输入和输出在我的汇编代码中不起作用

    以下程序编译时没有错误 但运行时不会提示任何输入 也不会打印任何内容 有什么问题 我该如何解决它 我使用这些命令来组装和链接 usr local bin nasm f macho32 1 ld macosx version min 10 9
  • Swift 4 Decodable - 以枚举为键的字典

    我的数据结构有一个枚举作为键 我希望下面的内容能够自动解码 这是一个错误还是某些配置问题 import Foundation enum AnEnum String Codable case enumValue struct AStruct
  • selenium / capybara - 无法加载 Firefox 配置文件

    当我使用 selenium 运行测试时 浏览器会反复弹出 指出找不到 firefox 配置文件 我准备了一个与 selenium 一起使用的 Firefox 配置文件 我只是不确定如何告诉 selenium 该配置文件所在的位置 我如何告诉
  • 加载 Magento 页面时出现奇怪的错误

    当我加载前端时 我的浏览器返回那些奇怪的错误 Uncaught ReferenceError Mage is not defined Uncaught ReferenceError Varien is not defined Uncaugh
  • 会话存储安全吗?

    我想使用会话存储来查询数据库中的用户数据一次 然后简单地使用JS来检索它 所以我正在考虑使用会话存储 接下来我的问题是 这样安全吗 请注意 1 JS 无法插入到带有表单的页面 表单只接受字母数字值 因此它只能来自 URL 1 1php 中不
  • Python - 通过代理使用socket.gethostbyname

    我正在使用 TOR 来代理连接 但在代理 DNS 查找时遇到困难socket gethostbyname www yahoo com 我通过使用wireshark 嗅探流量了解到它没有通过代理发送DNS 流量 这是我正在使用的代码的副本 i
  • 如何更改VS的编译器?

    我正在使用 VS 2010 我更改了编译器 C 代码而不是 C 的设置 它工作正常 但问题是 MS 编译器不支持 C99 标准 因此我正在寻找可以与 VS 10 一起使用的 C 编译器 如何做到这一点 提前致谢 MS Visual Stud
  • 我怎样才能知道我的日历意图的结果?

    从我的应用程序中 我启动日历的目的是 Calendar cal Calendar getInstance Intent intent new Intent Intent ACTION EDIT intent setType vnd andr
  • 返回 varchar(max) 存储过程的输出参数截断为 4000 个字符

    我有一个带有 SQL2012 数据库的经典 ASP 应用程序 我最近将表列从 varchar 8000 更改为 varchar max 因为它不够大 无法存储所需的数据 我可以使用需要存储的所有数据更新列 但我用来返回列数据作为输出参数的
  • EKEventStore.calendars 返回不存在的“日历”对象

    当使用 IOS5 获取所有日历时 EKEventStore eventStore EKEventStore alloc init NSArray calendars eventStore calendars 返回了一个名为 calendar
  • iOS 13 设备上语音识别(支持OnDevice Recognition 标志)

    我正在尝试让 iOS 13 OnDevice 语音识别正常工作 但是 验证 supportOnDeviceRecognition 标志 这是启用 OnDevice 识别的初步步骤 始终返回 false 我使用的是装有 iOS 13 3 的第
  • 如何在 Flutter 中构建 apk 创建旧版本应用程序

    我正在尝试在 Flutter 中构建我的发布应用程序 当我运行时 flutter run 在调试和测试模式下一切正常 但是当我尝试使用以下方法构建发布应用程序时 flutter build apk 它创建了我的一个旧的首次发布应用程序 我之
  • 打印 Haskell 的评估(重写)步骤以用于教育/学习目的。是否可以?

    我用书上的例子来描述这个问题 Simon Thompson 的书 HASKELL 函数式编程的技巧 第 82 页 见下图 显示了以下评估步骤 fac 4 问题 是否可以使用某些工具或 Haskell 调试器 来写出 GHCi 在评估以下值时
  • RecyclerView ItemTouchHelper.Callback:拖动交换条件

    我想以这样的方式实现拖动卡片 当我拖动的卡片与元素不完全重叠而仅重叠 50 时 卡片就会开始重新排列 看一个例子 现在 为了将右侧的卡片移至左侧 我需要将其与我正在拖动的卡片完全重叠 我尝试从 ItemTouchHelper Callbac
  • 为 Winforms DataGrid 控件添加超链接列

    如何为 Winforms DataGrid 控件添加超链接列 现在我正在添加一个像这样的字符串列 DataColumn dtCol new DataColumn dtCol DataType System Type GetType Syst
  • 如何计算IEEE 802.11 CRC-32 FCS?

    这是来自 IEEE Std 802 11 2012 第 8 2 4 8 FCS 字段 我无法理解最后两段 除法的初始余数预设为全部 是什么意思 为什么我们需要这样做 计算字段和 FCS 的串行输入位 是什么意思 将 CRC 初始化为全 1
  • 警告:与字符串文字比较会导致未指定的行为

    我正在开始一个用 C 语言为 linux 编写一个简化 shell 的项目 我对 C 和 Linux 一点也不精通 这正是我认为这是一个好主意的原因 从解析器开始 我已经遇到了一些问题 代码应该很简单 这就是为什么我没有包含任何注释 我收到
  • openssl c++ 3DES 文件加密解密失败

    我正在使用 openssl c lib 使用 3DES 加密解密文件 如果文件包含几个单词 则文件将被加密并解密 但如果源纯文件包含更多单词 则解密不正确 任何建议都会很友善 include