使用 Crypto++ 库以 CBC 模式实现 AES128

2024-04-24

在输入文件中我有:
第一行是一个以十六进制编码的密钥,长度为 16 个字节;
在第二行加密消息(CBC 模式下的 AES128,在加密消息前面添加随机 iv)。

这就是我尝试解密的方法:

#include<iostream>
using namespace std;

#include <fstream>
#include <string.h>
#include <cryptopp/aes.h>
#include <cryptopp/modes.h>
#include <cryptopp/filters.h>

using namespace CryptoPP;

int main(void) {
    ifstream in("input0.txt");
    ofstream out("output0.txt");

    string hex_key = "", hex_ct = "";
    in >> hex_key >> hex_ct;

    byte key[ AES::DEFAULT_KEYLENGTH ], iv[ AES::BLOCKSIZE ];
    string ciphertext = "", recoveredtext = "";

    for(int i = 0; i < hex_key.size(); i+=2) {
        key[i/2] = (char) strtol((hex_key.substr(i, 2)).c_str(), 0, 16);
    }

    //then I divide iv from the text
    for(int i = 0; i < AES::BLOCKSIZE*2; i+=2) {
        iv[i/2] = (char) strtol((hex_ct.substr(i, 2)).c_str(), 0, 16);
    }

    for(int i = AES::BLOCKSIZE*2; i < hex_ct.size(); i++) {
        ciphertext.push_back(hex_ct[i]);
    }

    //decryption
    CBC_Mode< AES >::Decryption d;
    d.SetKeyWithIV(key, AES::DEFAULT_KEYLENGTH, iv);

    StringSink sink( recoveredtext );

    StreamTransformationFilter stf (
        d,
        &sink
    );

    StringSource ss (
        ciphertext,
        true,
        &stf
    );

    out << recoveredtext;

    return 0;
}

我按照以下方式使用了这个实现 Wiki https://www.cryptopp.com/wiki/CBC_mode.
我也尝试过 this https://stackoverflow.com/questions/12306956/example-of-aes-using-crypto它有效,但没有用 my 替换密钥和密文。
好吧,使用上面的代码我有这样的输出:

AES128CBC: /usr/local/include/cryptopp/misc.h:304: void CryptoPP::memcpy_s(void*, size_t, const void*, size_t): Assertion `dest != __null' failed.
Aborted (core dumped)

使用此代码时:

//decryption

 AES::Decryption aesDecryption(key, AES::DEFAULT_KEYLENGTH);
CBC_Mode_ExternalCipher::Decryption cbcDecryption( aesDecryption, iv );

StreamTransformationFilter stfDecryptor(
    cbcDecryption,
    new StringSink( recoveredtext ),
    BlockPaddingSchemeDef::NO_PADDING
);

stfDecryptor.Put( reinterpret_cast<const unsigned char*>( ciphertext.c_str() ), ciphertext.size() );
stfDecryptor.MessageEnd();

它可以工作,但输出不是有效的字符序列。

我安装了该库:

sudo apt-get install libcrypto++-dev libcrypto++-doc libcrypto++-utils

我编译它:

g++ -o AESCBC128 AESCBC128.cpp -lcryptopp

我找不到问题所在。
先谢谢您的帮助。

输入样本:

140b41b22a29beb4061bda66b6747e14
4ca00ff4c898d61e1edbf1800618fb2828a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81


我不知道输出示例,因为这是一个练习,我的目标是发现秘密消息。
测试输入和转换为字节数组:

out << "KEY:\n" << hex_key << endl;

for(int i = 0; i < AES::DEFAULT_KEYLENGTH; i++) {
    out << setfill('0') << setw(2) << hex << (int)key[i];
}

out << endl << "Received message:\n" << hex_ct << endl;

out << "IV:\n";
for(int i = 0; i < AES::BLOCKSIZE; i++) {
    out << setfill('0') << setw(2) << hex << (int)iv[i];
}

out << endl << "CT:\n" << ciphertext << endl;

Result:

KEY:
140b41b22a29beb4061bda66b6747e14
140b41b22a29beb4061bda66b6747e14
Received message:
4ca00ff4c898d61e1edbf1800618fb2828a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81
IV:
4ca00ff4c898d61e1edbf1800618fb28
CT:
28a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81

他们正如预期的那样。


您收到填充错误的可能原因不是填充,而是解密错误,提供参数的方式可能不正确。

我在提供的 KEY、IV 和 CT 上编写了解密代码。结果具有 8 字节 0x08 的 PKCS#7 填充。

(正确删除 iv)

删除填充的解密:

42617369 63204342 43206d6f 64652065 6e637279 7074696f 6e206e65 65647320 70616464 696e672e

或在文本中:

基本 CBC 模式加密需要填充。

填充完好无损的解密(注意填充的尾随 8 个字符):

42617369 63204342 43206d6f 64652065 6e637279 7074696f 6e206e65 65647320 70616464 696e672e 08080808 08080808

输出大部分是 ASCII,但有一些例外,例如第 3 个字节 0xfc。

因为填充是正确的,所以我相信这是加密的真实数据。

对于过于好奇的人,这是我的测试代码:

NSData *key    = [Utilities dataFromHexString:@"140b41b22a29beb4061bda66b6747e14"];
NSData *iv     = [Utilities dataFromHexString:@"4ca00ff4c898d61e1edbf1800618fb28"];
NSData *dataIn = [Utilities dataFromHexString:@"28a226d160dad07883d04e008a7897ee2e4b7465d5290d0c0e6c6822236e1daafb94ffe0c5da05d9476be028ad7c1d81"];

size_t         cryptBytes = 0;
NSMutableData *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128];

CCCrypt(kCCDecrypt,
        kCCAlgorithmAES,
        kCCOptionPKCS7Padding,
        key.bytes, key.length,
        iv.bytes,
        dataIn.bytes, dataIn.length,
        dataOut.mutableBytes, dataOut.length,
        &cryptBytes);
dataOut.length = cryptBytes;

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

使用 Crypto++ 库以 CBC 模式实现 AES128 的相关文章

随机推荐

  • DirectX 11 ClearRenderTargetView 恢复透明缓冲区?

    我正在尝试创建一个使用 directx 进行绘制的窗口opaque上面的内容透明的视图 即桌面显示出来 使用 DirectX11 我尝试执行以下操作 但它并没有使背景透明 事实上 我输入的任何不透明度值都会给出完全相同的结果 我在做什么 f
  • Java ConcurrentHashMap 集合的模式

    我在多线程应用程序中常用的数据结构是 ConcurrentHashMap 我想在其中保存一组共享相同键的项目 安装特定键值的第一个项目时会出现此问题 我一直使用的模式是 final ConcurrentMap
  • Flowtype - 字符串与字符串枚举不兼容

    我有一个来自选择输入且类型为字符串的值 但是我想将其传递到函数中 更新语言 接收带有类型别名 Language 我面临的问题是 Flow 只允许我打电话更新语言如果我明确地将我的字符串值与枚举字符串进行比较 并且我想使用像 array in
  • C#:使用指针类型作为字段?

    在 C 中 可以声明具有指针类型成员的结构 或类 如下所示 unsafe struct Node public Node NextNode 它是否安全 呃 暂时忽略那个具有讽刺意味的小unsafe标志 使用这个结构 我的意思是在堆上长期存储
  • 使用 VSCode 在 Python 中调试期间读取输入

    这是我在 vs code 中使用的 python 扩展 python 扩展 https marketplace visualstudio com items itemName donjayamanne python 当我使用扩展提供的调试功
  • python 中数据库连接池的最佳解决方案是什么?

    我开发了一些类似于 DAO 的自定义类来满足我的项目的一些非常特殊的要求 该项目是一个不在任何类型的框架内运行的服务器端进程 该解决方案效果很好 只是每次发出新请求时 我都会通过 MySQLdb connect 打开一个新连接 将其切换为使
  • 当我提出自己的异常作为响应时,如何更轻松地抑制以前的异常?

    Consider try import someProprietaryModule except ImportError raise ImportError It appears that
  • 西格网络速度

    这个库对于获取 cpu ram 和其他人员来说非常棒 但是 我不知道如何获得网络速度 这意味着 在一段时间内发送和接收了多少数据 有办法给我这些数据吗 这可能是我正在寻找的东西吗 Tcp stat sigar getTcp stat get
  • Windows 和 OS X 之间 build.gradle 中的相对路径不同

    我的项目有一个包含密钥库文件 file keystore 的文件夹 这是结构 gradle 2 2 taskArtifacts idea copyright libraries app build generated libs src an
  • 如何使视频资源兼容视网膜显示?

    我有一个应用程序 可以在播放 2 秒的电影时加载 目前 该应用程序已在商店上架 并且除此视频外 所有静态内容均符合视网膜显示标准 我有一个用于视网膜显示屏的 960x640 mp4 h 264 编码视频 它在 iPhone 是的 高分辨率
  • 深层链接不起作用 - 离子

    我正在使用 Deeplinks 和 ionic 3 但我创建的 url 不起作用 这是网址 https lucky com prd rm74fEgBB2frzhagYcov https lucky com prd rm74fEgBB2frz
  • 为什么函数(Python)的 __code__ 是可变的

    在昨天的上一个问题中 在评论中 我开始知道在 python 中 code 函数的属性是可变的 因此我可以编写如下代码 def foo print Hello def foo2 print Hello 2 foo foo code foo2
  • JSF“错误 Mac 未验证!” [复制]

    这个问题在这里已经有答案了 我一直在尝试使用 jsf 中的 primefaces 实现一些基本的推送功能 我用过那里的反例http www primefaces org showcase labs push counter jsf http
  • Unity HTML5 错误:找不到编码 1252 数据

    我使用的是 Mac 在 Google Chrome 中执行我的小应用程序时 出现 不支持代码页 1252 的 pb 我正在使用Unity 2017 年 6 月测试版为了整合几何健身房IFClib 的编码为 NET 4 6 现在在最后一个 U
  • 基本里德-所罗门纠错问题

    在存在丢失字节 或多个丢失字节 的情况下 里德 所罗门纠错是否有效 例如 假设它是 12 8 Reed Solomon 码 那么理论上它应该能够纠正 2 个错误 如果位置已知 则可以纠正 4 个擦除 但是 如果仅接收到 11 或 10 个字
  • JavaFX:无法设置绑定值异常

    在我的 javafx 应用程序中 我创建了一个表视图 其中有一些项目 如果项目存在于表视图中 则应启用删除按钮 否则应禁用删除按钮 现在的问题是 当我选择项目并单击删除按钮时 它会引发以下异常 我该如何解决这个问题 这是我的表格视图代码 t
  • 错误代码:1290。MySQL 服务器正在使用 --secure-file-priv 选项运行,因此无法执行此语句

    我遇到了这样的问题 错误代码 1290 MySQL 服务器正在使用 secure file priv 选项运行 因此无法执行此语句当我尝试执行 MySQL 语句 Windows 时 SELECT FROM xxxx WHERE XXX IN
  • 锁问题 - “U”锁与“X”锁

    我有几个关于更新 U 锁和独占 X 锁的问题 1 当资源即将更新时 对资源施加 X 锁 我是否正确 2 我对U锁有点模糊 当读取资源并且 SQL Server 认为稍后可能需要更新资源时应用 U 锁 我是否正确 如果这是正确的 那么只有在事
  • 在单元测试 CI 期间模拟单击 PyQt5 QMessageBox 小部件中的按钮

    如果我们运行下面的最小示例 而不是长篇大论 python3 Python 3 7 6 default Jan 30 2020 09 44 41 GCC 9 2 1 20190827 Red Hat 9 2 1 1 on linux Type
  • 使用 Crypto++ 库以 CBC 模式实现 AES128

    在输入文件中我有 第一行是一个以十六进制编码的密钥 长度为 16 个字节 在第二行加密消息 CBC 模式下的 AES128 在加密消息前面添加随机 iv 这就是我尝试解密的方法 include