模板化模式对象和外部密码对象有什么区别?

2023-12-11

正如标题所示,我正在寻找不同之处在 cryptopp 库之间本声明:

CBC_Mode<AES>::Decryption 
cbcDecryption.SetKeyWithIV(key, AES::DEFAULT_KEYLENGTH, iv);

and 这个:

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

此外,我不明白为什么这样:

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

StreamTransformationFilter stfDecryptor(
    cbcDecryption,
    new StringSink( recoveredtext )
);

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

一切正常在使用模板模式时我遇到了这个错误run time:

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)

不应该是一样的吗?

我看过this但我不太明白其中的区别,在网上搜索我找不到问题的答案。


模板化模式对象和外部密码对象有什么区别?

的解释*_ExternalCiphers给出在modes.h,它出现在网络上CipherModeDocumentation Class Reference。它并不容易找到,我只是因为与消息来源密切合作才知道它。

正文如下:

从这个 [CipherModeDocumentation] 派生的每个类都定义了两种类型:Encryption 和 Decryption,这两种类型都实现 SymmetricCipher 接口。对于每种模式都有两个类,其中一个是模板类,另一个的名称以“_ExternalCipher”结尾。

“外部密码”模式对象保存对底层分组密码的引用,而不是保存它的实例。该引用必须传递给构造函数。对于“密码持有者”类,CIPHER 模板参数应该是从 BlockCipherDocumentation 派生的类,例如 DES 或 AES。

因此,区别在于操作模式与密码的关联方式——字面上是外部与内部。

External- 下面是两个不同的对象。第一个是对称密码,第二个是操作方式:

AES::Encryption aes(key, ...);
CBC_Mode_ExternalCipher::Encryption cbc(aes, ...);

Internal- 下面是一个单一的对象。操作模式“有一个”通过模板实例化的对称密码:

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

使用模板模式时一切正常我在运行时遇到此错误...

好吧,这是一个不同的问题。让我们看看如何使用它:

$ grep -IR "CBC_Mode_ExternalCipher::Decryption" *
fipstest.cpp:       KnownAnswerTest(CBC_Mode_ExternalCipher::Encryption(encryption, iv).Ref(), ...);
validat1.cpp:       CBC_Mode_ExternalCipher::Decryption modeD(desD, iv);
validat1.cpp:       CBC_Mode_ExternalCipher::Decryption modeD(desD, iv);
validat1.cpp:       CBC_Mode_ExternalCipher::Decryption modeD(desD, iv);
validat1.cpp:       CBC_Mode_ExternalCipher::Decryption modeD(desD, iv);

你可以找到在线validat1.cpp,从周围开始1366行:

bool ValidateCipherModes()
{
    ...
    DESEncryption desE(key);
    DESDecryption desD(key);

    ...
    CBC_Mode_ExternalCipher::Encryption modeE(desE, iv);
    ...
    CBC_Mode_ExternalCipher::Decryption modeD(desD, iv);
    ...
}

所以通配符是DESEncryption and DESDecryption。我们来看看:

$ grep -IR DESEncryption *
des.h:typedef DES::Encryption DESEncryption;

所以 AES 应该干净利索地切入。现在,测试程序:

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

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

// g++ -DNDEBUG -g2 -O2 -I. test.cxx ./libcryptopp.a -o test.exe
int main(int argc, char* argv[])
{
  AutoSeededRandomPool prng;
  string plain = "Now is the time for all good men to come to the aide of their country";
  string cipher, recover;

  SecByteBlock key(AES::DEFAULT_KEYLENGTH), iv(AES::BLOCKSIZE);
  prng.GenerateBlock(key, key.size());
  prng.GenerateBlock(iv, iv.size());

  AES::Encryption aes1(key, key.size());
  CBC_Mode_ExternalCipher::Encryption cbc1(aes1, iv);
  StringSource ss1(plain, true, new StreamTransformationFilter(cbc1, new StringSink(cipher)));

  AES::Decryption aes2(key, key.size());
  CBC_Mode_ExternalCipher::Decryption cbc2(aes2, iv);
  StringSource ss2(cipher, true, new StreamTransformationFilter(cbc2, new StringSink(recover)));

  cout << "Plain: " << plain << endl;
  cout << "Recover: " << recover << endl;

  return 0;
}

编译并运行:

$ g++ -DNDEBUG -g2 -O2 -I. test.cxx ./libcryptopp.a -o test.exe
$

$ ./test.exe
Plain: Now is the time for all good men to come to the aide of their country
Recover: Now is the time for all good men to come to the aide of their country

所以一切似乎都按预期进行。


现在针对这个问题:

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

In 使用 cryptopp 库以 CBC 模式实现 AES128,您被告知使用最新的 Crypto++ 库,因为我们清理了其中的一些库。看这条评论:

您应该使用最新版本的 Crypto++ 源代码。我相信这个问题不久前就已经解决了:void CryptoPP::memcpy_s(void*, size_t, const void*, size_t): Assertion 'dest != __null' failed。您可以通过以下方式获取最新资源git clone https://github.com/weidai11/cryptopp.git.

你也接受了扎夫的回答,所以这应该是关于解密和断言的麻烦的事情的结束。这向我和 Stack Overflow 社区表明您不需要额外的帮助或答案。

你的问题是likely遇到的是混合您位于的 Crypto++ 版本/usr/local与您通过发行版安装的那个sudo apt-get install libcrypto++-dev libcrypto++-doc libcrypto++-utils。断言是混合和匹配它们的经典标志,因为发行版提供了旧版本的库。

如果您记下我使用的命令行,您将看到:

  • -DNDEBUG -g2 -O2确保我使用与构建库相同的选项
  • -I确保我在 PWD 中使用 Crypto++ 标头
  • ./libcryptopp.a确保我链接到 PWD 中库的静态版本,并避免运行时链接/加载错误的库

您可能在运行时链接了错误的 Crypto++ 库。我通过精确控制链接的内容来避免它们,而不是依赖于运行时链接/加载器。


您可以自由地使用运行时链接/加载器来执行这些操作,但必须注意确保您在运行时获得正确的库。为此,请参阅GNUmake 文件 |编译和链接。我认为你属于第二种情况BAD:

Bad:以下内容会产生问题,因为您针对库的副本进行编译和链接,但在运行时它链接到发行版的库副本:

$ ls
cryptopp        test.cxx

$ g++ -DNDEBUG -g2 -O2 -I . test.cxx -o test.exe -L ./cryptopp -lcryptopp

如果还没有解决,那么您需要发布一个最小、完整且可验证的示例 (MCVE)。很可能在您的数据集下触发断言。我们最近有一个在。我们在报告发布后几小时内就签入了修复程序,距今还不到 30 天。

我还需要查看您的编译和链接命令以及输出ldd看看你链接的是什么。

有时,当您不提供明文或密文数据时,我们无能为力(input0.txt and output0.txt),或者您不提供编译和链接命令等详细信息。

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

模板化模式对象和外部密码对象有什么区别? 的相关文章

  • 使用sqlbulkcopy之前如何创建表

    我有一个 DBF 文件 我正在尝试导入该文件 然后将其写入 SQL 表 我遇到的问题是 如果我使用 SqlBulkCopy 它需要我提前创建表 但在我的场景中这是不可能的 因为 dbf 文件不断变化 到目前为止 这是我的代码 public
  • 显示 div 内的用户名列表

    我是 jQuery 新手 在我的项目中 我创建了一个类User其中代码如下所示 static ConcurrentDictionary
  • 读取大文件并制作字典

    我有一个大文件 我需要读取它并从中制作字典 我希望这一切能够尽可能快 然而我的Python代码太慢了 这是一个显示问题的最小示例 首先制作一些假数据 paste lt seq 20000000 lt seq 2 20000001 gt la
  • 如何使用最小起订量模拟私有只读 IList 属性

    我试图嘲笑这个列表 private readonly IList
  • C++0x 初始值设定项列表示例

    我想看看这个现有代码示例如何利用 C 0x 初始化列表功能 示例0 include
  • 使用 GCHandle 将大型结构数组从 C# unity 脚本传递到 C++ dll 在 C++ 函数执行后崩溃

    我想从 C unity 脚本将结构数组传递给 c 本机插件 我做了如下操作 我可以访问数据 但我的应用程序在执行 c 函数后崩溃 我不知道为什么 C side StructLayout LayoutKind Sequential publi
  • 何时使用 C++ 私有继承而不是组合?

    你能给我一个具体的例子吗 什么时候使用私有继承优于组合 就我个人而言 我将使用组合而不是私有继承 但在某些情况下 使用私有继承可能是特定问题的最佳解决方案 正在阅读C faq http www parashift com c faq lit
  • 尽管浮点数相同,但它们并不相等? [复制]

    这个问题在这里已经有答案了 下面的程序输出This No is not same 当两个数字相同时为什么会这样做 void main float f 2 7 if f 2 7 printf This No is same else prin
  • 原子的 C++ 内存屏障

    在这方面我是个新手 谁能提供以下内存屏障之间差异的简化解释 窗户MemoryBarrier 围栏 mm mfence 内联汇编asm volatile memory 内在的 ReadWriteBarrier 如果没有简单的解释 一些好文章或
  • 如何使用 C# 将表格粘贴到 Ms-Word 文档的末尾

    我有一个预制的 Word 模板 其中有一个表格 我想打开它 然后在文档末尾添加 粘贴 另一个表格 问题是它不会转到文档的末尾 而是将新表格粘贴到原始表格的第一个单元格中 任何帮助将不胜感激 previous code copied a ta
  • 在 cl-mongo 中实现 MongoDB SASL 身份验证

    我已经从 fons 分叉了 cl mongo common lisp MongoDB 库 存储库 因为它已经不再维护并且不支持 SCRAM SHA 1 登录过程 这是我的叉子 https github com mprelude cl mon
  • 删除数组时出现访问冲突异常

    删除分配的内存时 出现 访问冲突读取位置 异常 如下所示 我有一个针对 Visual Studio 2010 工具集 v100 C 编译器编译的本机 dll 我有一个针对它的托管 dll 包装器 它是针对工具集 v90 编译的 因为我想以
  • 模板定义中的友元函数

    我的问题有点相关this https stackoverflow com questions 1297609 overloading friend operator for template class one 我想重载某些类的运算符 te
  • 如何在 SQLite 中检查数据库是否存在 C#

    我目前正在用 C 编写一个应用程序 并使用 sqlite 作为嵌入式数据库 我的应用程序在启动时创建一个新数据库 但如何让它检查数据库是否存在 如果它确实存在 我如何让它使用它 如果不存在如何创建一个新数据库 这是我到目前为止所拥有的 pr
  • 动态菜单创建IoC

    我想知道是否有人知道我如何创建如何使用 AutoFac 之类的东西来让我动态地允许 dll 创建自己的表单和菜单项以在运行时调用它们 所以如果我有一个 员工 dll 新入门表格 证书表格 供应商 dll 供应商详细信息来自 产品形态 在我的
  • 如何使 WinForms UserControl 填充其容器的大小

    我正在尝试创建一个多布局主屏幕应用程序 我在顶部有一些按钮链接到应用程序的主要部分 例如模型中每个实体的管理窗口 单击这些按钮中的任何一个都会在面板中显示关联的用户控件 面板包含用户控件 而用户控件又包含用户界面 WinForms User
  • 使用方法的状态模式

    我正在尝试使用方法作为状态而不是类来基于状态模式的修改版本来实现一个简单的状态机 如下所示 private Action
  • 包含从代码隐藏 (ASP.NET C#) 到 ASPX 中的图像概述的图像列表 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架

    我的 sqlserver 数据库中有一个存储过程 它返回多个结果集 我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集 https msdn microsoft com en us library jj691402 v
  • execlp() 系统调用输出错误

    这个非常简单的例子exec 系统调用 在这里 我试图打电话execlp 两次 但是 我没有得到例外的输出 它仅显示当前目录的第一次调用的输出 include

随机推荐