加密/解密字节数组 Crypto++

2023-12-09

我正在尝试使用 AES 加密字节数组。我已经能够毫无问题地加密字符串和文件,但是字节数组似乎不适合我。我传入一个要加密的字节数组,为了便于测试,我只传入由 crypto++ (bArrayToEncrypt) 生成的 AES 密钥。加密似乎有效,但解密却完全有效。我也觉得奇怪,加密有大量重复字符。我在这里做错了什么?

我看到一个类似的问题Here,但它与 RSA 有关 以及提供的示例加密我已经运行的字符串。

函数的调用方式:

   size_t ksize = CryptoPP::AES::MAX_KEYLENGTH;
   size_t vsize = CryptoPP::AES::BLOCKSIZE;

   byte key[ksize];
   byte testArray[ksize];
   byte encryptedksize];
   byte decrypted[ksize];
   byte iv[vsize];

   //generate key & iv, then generate a random byte array to encrypt/decrypt
   CryptoPP::AutoSeededRandomPool prng;
   prng.GenerateBlock(key, ksize);
   prng.GenerateBlock(iv, vsize);
   prng.GenerateBlock(testArray, ksize);


   encrypt_barray(key, ksize, iv, vsize, testArray, ksize, encrypted);

   //printed results here

   decrypt_barray(key, ksize, iv, vsize, encrypted, ksize, decrypted);

   //printed results here

加密数组

void encrypt_barray(byte* key, 
                    size_t kSize,
                    byte* iv, 
                    size_t ivSize, 
                    byte* bArrayToEncrypt,
                    size_t bArraySize,
                    byte* encrypted) {

   CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption e;
   e.SetKeyWithIV(key, kSize, iv, ivSize);

   CryptoPP::ArraySource(key, true,
      new CryptoPP::StreamTransformationFilter(e, new CryptoPP::ArraySink(encrypted, bArraySize)));
}

解密_bararray

void decrypt_barray(byte* key,
                    size_t kSize,
                    byte* iv,
                    size_t ivSize,
                    byte* bArrayToDecrypt,
                    size_t bArraySize,
                    byte* decrypted) {

   CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption d;
   d.SetKeyWithIV(keyFromHash, kfhSize, iv1, iv1Size);

   CryptoPP::ArraySource(keyToDecrypt, true,
      new CryptoPP::StreamTransformationFilter(d, new CryptoPP::ArraySink(decrypted, bArraySize)));
}

Output:

 Encrypted: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠E1A2AFC5D820ADF7
7DB656DEF3245570╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╨Ñ♫

Decrypted: ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠E
1A2AFC5D820ADF77DB656DEF3245570╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╨Ñ♫
Press any key to continue . . .

这是使用的方法ArraySource and ArraySink. The Redirector确保ArraySink幸存下来,所以你可以打电话TotalPutLength.

#include <iostream>
#include <string>
using namespace std;

#include "cryptlib.h"
#include "filters.h"
#include "files.h"
#include "modes.h"
#include "hex.h"
#include "aes.h"
using namespace CryptoPP;

int main(int argc, char* argv[])
{
  byte key[AES::MAX_KEYLENGTH];
  byte iv[AES::BLOCKSIZE];
  vector<byte> plain, cipher, recover;
  HexEncoder encoder(new FileSink(cout));

  memset(key, 0x00, sizeof(key));
  memset(iv, 0x00, sizeof(iv));

  string str("Attack at dawn!");
  std::copy(str.begin(), str.end(), std::back_inserter(plain));

  cout << "Plain text: ";
  encoder.Put(plain.data(), plain.size());
  encoder.MessageEnd();
  cout << endl;

  /////////////////////////////////////////////////////////////

  CBC_Mode<AES>::Encryption enc;
  enc.SetKeyWithIV(key, sizeof(key), iv, sizeof(iv));

  // Make room for padding
  cipher.resize(plain.size()+AES::BLOCKSIZE);
  ArraySink cs(&cipher[0], cipher.size());

  ArraySource(plain.data(), plain.size(), true,
    new StreamTransformationFilter(enc, new Redirector(cs)));

  // Set cipher text length now that its known
  cipher.resize(cs.TotalPutLength());

  cout << "Cipher text: ";
  encoder.Put(cipher.data(), cipher.size());
  encoder.MessageEnd();
  cout << endl;

  /////////////////////////////////////////////////////////////

  CBC_Mode<AES>::Decryption dec;
  dec.SetKeyWithIV(key, sizeof(key), iv, sizeof(iv));

  // Recovered text will be less than cipher text
  recover.resize(cipher.size());
  ArraySink rs(&recover[0], recover.size());

  ArraySource(cipher.data(), cipher.size(), true,
    new StreamTransformationFilter(dec, new Redirector(rs)));

  // Set recovered text length now that its known
  recover.resize(rs.TotalPutLength());

  cout << "Recovered text: ";
  encoder.Put(recover.data(), recover.size());
  encoder.MessageEnd();
  cout << endl;

  return 0;
}

运行程序的结果是:

$ ./test.exe
Plain text: 41747461636B206174206461776E21
Cipher text: 85928E5511BFE9E6EE235BCACC4894D4
Recovered text: 41747461636B206174206461776E21

这是使用的示例ByteQueue. The Redirector有助于将管道链接在一起,因为ByteQueue is a BufferedTransformation.

#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

#include "cryptlib.h"
#include "filters.h"
#include "files.h"
#include "modes.h"
#include "queue.h"
#include "hex.h"
#include "aes.h"
using namespace CryptoPP;

int main(int argc, char* argv[])
{
  byte key[AES::MAX_KEYLENGTH];
  byte iv[AES::BLOCKSIZE];
  HexEncoder encoder(new FileSink(cout));

  memset(key, 0x00, sizeof(key));
  memset(iv, 0x00, sizeof(iv));

  ByteQueue plain, cipher, recover;
  string str("Attack at dawn!");
  plain.Put(reinterpret_cast<const byte*>(str.data()), str.size());

  cout << "Plain text: ";
  plain.CopyTo(encoder);
  encoder.MessageEnd();
  cout << endl;

  /////////////////////////////////////////////////////////////

  CBC_Mode<AES>::Encryption enc;
  enc.SetKeyWithIV(key, sizeof(key), iv, sizeof(iv));

  StreamTransformationFilter f1(enc, new Redirector(cipher));
  plain.CopyTo(f1);
  f1.MessageEnd();

  cout << "Cipher text: ";
  cipher.CopyTo(encoder);
  encoder.MessageEnd();
  cout << endl;

  /////////////////////////////////////////////////////////////

  CBC_Mode<AES>::Decryption dec;
  dec.SetKeyWithIV(key, sizeof(key), iv, sizeof(iv));

  StreamTransformationFilter f2(dec, new Redirector(recover));
  cipher.CopyTo(f2);
  f2.MessageEnd();

  cout << "Recovered text: ";
  recover.CopyTo(encoder);
  encoder.MessageEnd();
  cout << endl;

  return 0;
}

它还导致:

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

加密/解密字节数组 Crypto++ 的相关文章

  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • POCO HTTPSClientSession 发送请求时遇到问题 - 证书验证失败

    我正在尝试使用 POCO 库编写一个向服务器发出 HTTPS 请求的程序 出于测试目的 我正在连接到具有自签名证书的服务器 并且我希望允许客户端进行连接 为了允许这种情况发生 我尝试安装InvalidCertificateHandler这是
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 在 2D 中将一个点旋转另一个点

    我想知道当一个点相对于另一个点旋转一定角度时如何计算出新的坐标 我有一个块箭头 想要将其相对于箭头底部中间的点旋转角度 theta 这是允许我在两个屏幕控件之间绘制多边形所必需的 我无法使用和旋转图像 从我到目前为止所考虑的情况来看 使问题
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • C# 中条件编译符号的编译时检查(参见示例)?

    在 C C 中你可以这样做 define IN USE 1 define NOT IN USE 1 define USING system 1 system 1 IN USE 进而 define MY SYSTEM IN USE if US
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 为什么我不应该对不是由 malloc() 分配的变量调用 free() ?

    我在某处读到 使用它是灾难性的free删除不是通过调用创建的对象malloc 这是真的 为什么 这是未定义的行为 永远不要尝试它 让我们看看当您尝试时会发生什么free 自动变量 堆管理器必须推断出如何获取内存块的所有权 为此 它要么必须使
  • 当我“绘制”线条时,如何将点平均分配到 LineRenderer 的宽度曲线?

    我正在使用线条渲染器创建一个 绘图 应用程序 现在我尝试使用线条渲染器上的宽度曲线启用笔压 问题在于 AnimationCurve 的 时间 值 水平轴 从 0 标准化为 1 因此我不能在每次添加位置时都在其末尾添加一个值 除非有一个我不知
  • 直接使用从密钥库加载的 SecretKey 时,密钥用户未经过身份验证

    我正在尝试使用 Cipher 和在 KeyStore 中加载的 SecretKey 来加密数据 但总是收到此错误 导致 android security KeyStoreException 关键用户未经过身份验证 我尝试自己创建 Secre
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检

随机推荐

  • Oracle插入if不存在语句

    insert into OPT email campaign id values email protected 100 where not exists select from OPT where email email protecte
  • LINQ 到实体转换问题

    我正在尝试以通用方式过滤 LINQ to entities 查询 但我不断收到错误 这是一段代码 private IQueryable
  • 将 window tester 与 eclipse 集成以测试 UI

    我们计划使用窗口测试器自动测试我的 Eclipse 应用程序 GUI 日食的版本是氧气 请告诉我如何将窗口测试器与 Eclipse 应用程序集成 我在 eclipse 市场上没有看到任何窗口测试器插件 如果没有 我可以使用哪个 GUI 测试
  • 如何让 JInternalFrame 填充容器并禁用拖动功能?

    我正在做一个项目 大型机中有JInternalFrames 现在 我们需要让它们成为 JFrame 我正在考虑使用 JFrame 来保存 JInternalFrame 问题是Internalframe的标题栏在那里 用户可以拖动它 有没有办
  • 在帐单地址 woocommerce 中添加新字段

    我想在我的网站上编辑我的帐单地址 我需要add and delete我的帐户页面中还有其他一些代码 我应该编辑哪些代码 提前谢谢您 您可以检查下面的代码吗add新的自定义字段示例 add filter woocommerce billing
  • 从 numpy loadtxt() 获取日期列

    我有一个文本文件 其中包含下表 Day Month Year Avg Power 01 01 2000 30 02 01 2000 41 04 01 2000 55 05 01 2000 78 06 01 2000 134 07 01 20
  • 在谷歌云ML中导入librosa

    我正在运行 Google Cloud ML 当我尝试导入 librosa 时 出现错误 ImportError 没有名为 tkinter 的模块 请安装 python tk 包 我确实有一个 setup py 文件 一个空的 init py
  • 保持 UIAlertView 显示

    我有一个 UIAlertView 上面有一个文本字段和两个按钮 保存和取消 点击 保存 按钮时 我会检查文本字段是否不为空 如果为空 我只想将 textFields 占位符更改为 请输入名称 并将警报视图保留在屏幕上 但它会自动被驳回 我该
  • 如何摆脱 pygame 表面?

    在下面的代码中 不仅有one在任何给定时间点屏幕上出现圆圈 我想修复这个问题 使其看起来只有一个圆圈 而不是在鼠标光标所在的地方留下污迹 import pygame sys from pygame locals import pygame
  • HTML 数字输入最小值和最大值无法正常工作

    I have type number输入字段和我已经设置min and max它的值
  • JSON 格式在附加文件时添加 \ 字符,但不添加到输出中的字符串

    我正在使用以下函数来获取json来自 flickrAPI 它返回的字符串是格式正确的 JSON 块 def get photo data photo id para para photo id photo id para method fl
  • Tensorflow - 推理时间评估

    我正在使用 Tensorflow 评估不同的图像分类模型 特别是使用不同设备的推理时间 我想知道是否必须使用预训练模型 我使用一个脚本生成 1000 个随机输入图像 将它们一一输入到网络 并计算平均推理时间 谢谢 让我首先发出警告 大多数人
  • 在c#中一段时间​​内非阻塞等待/延迟的最佳实现是什么

    目前我需要在Windows Store应用程序项目中实现一个简单的非阻塞延迟功能 该函数不应该执行任何操作 只是在特定时间段内空闲而不阻塞 UI 我的问题是 如何正确实现这样的功能 我知道这是一个老问题 但在网上搜索后我真的没有任何线索 最
  • Predict.svm 中的错误:测试数据与模型不匹配

    我有一个大约 500 行和 170 列的数据框 我正在尝试使用 e1071 包中的 svm 运行分类模型 分类变量称为 SEGMENT 是一个有 6 个级别的因子变量 数据框中还有其他三个因子变量 其余都是数字 data lt my dat
  • 从 Google 通讯录中删除重复或重复的联系人

    我的目标是制作一个包含客户联系信息 地址和注释的电子表格 创建新的 Google 通讯录条目 并将联系人 ID 和 已添加 标记到表格中 该表格将已输入到 Google 通讯录的联系人标记为 已添加 这张表 我成功地做到了 一切正常 问题只
  • 即时搜索 PB 级数据

    我需要在 CSV 格式文件中搜索 PB 级的数据 使用LUCENE建立索引后 索引文件的大 小是原始文件的两倍 是否可以减小索引文件的大 小 如何在HADOOP中分发LUCENE索引文件以及如何在搜索环境中使用 或者是否有必要 我应该使用s
  • 如何在 pytorch 中更改输入图片的尺寸?

    我制作了一个卷积神经网络 我希望它获取输入图片和输出图片 但是当我将图片转换为张量时 它们的尺寸错误 RuntimeError Expected 4 dimensional input for 4 dimensional weight 20
  • Jenkins 无法识别生成的 allure 报告 xml 文件的正确目录

    我已成功将 Allure 报告集成到我的基于 Maven 的 testNG 项目中 并且能够使用 jetty 服务器查看该报告 但现在我正在尝试按照此处建议的说明将魅力报告与詹金斯集成 http wiki qatools ru displa
  • 如何处理不在 UINavigationController 堆栈顶部的 UIViewController 的旋转?

    我在 UINavigationController 中有一个根 UIViewController VC1 它通过在 willRotateToInterfaceOrientation 方法中手动调整其视图 子视图框架来处理旋转 如果根 UIV
  • 加密/解密字节数组 Crypto++

    我正在尝试使用 AES 加密字节数组 我已经能够毫无问题地加密字符串和文件 但是字节数组似乎不适合我 我传入一个要加密的字节数组 为了便于测试 我只传入由 crypto bArrayToEncrypt 生成的 AES 密钥 加密似乎有效 但