CFB 模式下的 TripleDES、C# 和 Crypto++ 不同

2023-12-13

这是我的问题:我有一个 C++ 遗留代码(使用 crypto++ v5.6.1),并且我用 C# 开发了一个新代码(使用 System.Security.Cryptography 的 .NET 3.5)。我无法改变C++ 代码,但我需要能够解密之前加密的数据,并且以前的应用程序必须能够解密我将使用新的 C# 代码加密的数据。

两种情况使用的算法都是 TripleDES 和 CFB 加密模式,但最终加密的数据并不相同,字节数以及第一个字节都相同,但除此之外所有其他字节都不同。

填充是在 C++ 代码中手动完成的(添加零)。所以我将 PaddingValue 设置为 PaddingMode.Zeros。 (我还尝试在 C# 代码中手动在末尾添加零,它没有改变任何内容)。

我尝试使用不同的 System.Text.Encoding 但结果是相同的(实际上测试的字符是“纯”ASCII(即:0 和 126 之间))。

在 C++ 代码中,MandatoryBlockSize() 的值为 8,因此我也将 FeedbackSize 设置为 8。但如果我理解它的写法,它实际上就是我的静脉注射的大小,不是吗?

密钥大小为 24 字节(3 个不同的密钥),IV 长为 8 字节。两个代码中它们是相同的。

如果我在两种情况下都使用 CBC 模式,结果是相同的(但是,正如我所说,我无法更改遗留代码...),OFB 和 CTS 模式会抛出异常(其中一种不可用,另一种不兼容)在我的 .NET 应用程序上,所以我无法比较结果。

我尝试使用 Mono(.Net 版本 3.5 和 4.0),或使用 Visual(.Net 3.5 或 4.0),4 个加密结果是相同的,但与原始结果不同。

现在我真的不知道要测试什么...我不想将 Crypto++ 包装在 C++/CLI 项目中来使用它而不是 System.Security.Cryptography。

有人有建议或者可以告诉我我做错了什么吗?

这是 C++ 代码:

void *CryptData(BYTE *bDataIn, LONG lIn, LONG *lOut, byte* key, byte* iv)
{
    byte    *bIn;
    byte    *bOut;
    LONG    l2,lb;

    CFB_FIPS_Mode<DES_EDE3>::Encryption encryption_DES_EDE3_CFB;
    encryption_DES_EDE3_CFB.SetKeyWithIV(key, sizeof(key), iv, sizeof(iv));

    lb = encryption_DES_EDE3_CFB.MandatoryBlockSize();
    l2 = ((lIn + lb - 1)/lb)*lb;

    bIn = (byte*)malloc(l2);
    bOut = (byte*)malloc(l2);

    memset(bIn,0,l2);
    memset(bOut,0,l2);
    memcpy(bIn,bDataIn,lIn);

    encryption_DES_EDE3_CFB.ProcessString(bOut, bIn, l2);

    *lOut = l2;

    return bOut;
}

这是 C# 代码:

public FibxCrypt()
{
    _cryptoAlgo = new TripleDESCryptoServiceProvider();
    //_cryptoAlgo.GenerateKey();
    _cryptoAlgo.Key = _key;
    //_cryptoAlgo.GenerateIV();
    _cryptoAlgo.IV = _iv;
    _cryptoAlgo.Mode = CipherMode.CFB;
    _cryptoAlgo.Padding = PaddingMode.Zeros;

    _encoding = new UTF8Encoding();
}

private MemoryStream EncryptingString(string plainText, out long encryptSize)
{
    // Check arguments. 
    if (plainText == null || plainText.Length <= 0)
        throw new ArgumentNullException("plainText");

    // Create a decrytor to perform the stream transform.
    ICryptoTransform encryptor = _cryptoAlgo.CreateEncryptor();

    // Create the streams used for encryption. 
    //using (MemoryStream msEncrypt = new MemoryStream())
    MemoryStream msEncrypt = new MemoryStream();

    encryptSize = ((plainText.Length + _cryptoAlgo.FeedbackSize - 1) / _cryptoAlgo.FeedbackSize) * _cryptoAlgo.FeedbackSize;

    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
    {
        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt, _encoding))
        {
            //Write all data to the stream.
            swEncrypt.Write(plainText);
        }
    }

    // Return the encrypted memory stream. 
    return msEncrypt;
}

编辑:我尝试直接使用加密器,而不是使用流,但我遇到了同样的问题。

private MemoryStream EncryptingString(string plainText, out long encryptSize)
{
    // Check arguments. 
    if (plainText == null || plainText.Length <= 0)
        throw new ArgumentNullException("plainText");

    ICryptoTransform encryptor = _cryptoAlgo.CreateEncryptor();

    byte[] cipherData = encryptor.TransformFinalBlock(
        _encoding.GetBytes(plainText), 0, plainText.Length);

    // Return the encrypted memory stream. 
    return msEncrypt;
}

您更改的 FeedBackSize 与 CFB 操作模式相关(msdn文档)。因此,您还应该检查 C++ 和 C# 中的反馈大小是否相同。

我相信您的错误可能会在 C++ 代码和 C# 代码之间受到损害。您是否尝试过在 C# 实现中设置 BlockSize = 8?

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

CFB 模式下的 TripleDES、C# 和 Crypto++ 不同 的相关文章

  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • 如何使用 C# 以编程方式编辑 Power BI Desktop 文档参数或数据源?

    我有一个在 Power BI Desktop 中内置的报告模板 并保存为 pbix 或 pbit 文件 该模板使用DirectQuery SQL数据库作为数据源 而服务器地址和数据库名称被提取到参数中 还有一个参数包含一个ReportId
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • 为什么有些控件同时具有BackgroundImage和Image属性?

    为什么有些控件喜欢Button or PictureBox两者都有BackgroundImage and Image财产 为什么在按钮的情况下需要它们两个 或者为什么在图片框中背景图像应该可用 BackgroundImage继承自Contr
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • C# Winforms Designer 无法打开,因为它无法在同一程序集中找到类型

    我收到以下错误 找不到类型 My Special UserControl 请确保引用包含此类型的程序集 如果此类型是您的开发项目的一部分 请确保已使用当前平台或任何 CPU 的设置成功构建该项目 但没有任何意义的是My Special Us
  • PrivateObject 找不到属性

    我的结构基本上如下所示 abstract class A protected string Identificator get set private void DoSomething DoSomethingSpecific protect
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 如何对STL向量进行排序?

    我想排序一个vector vector
  • 如何调用与现有方法同名的扩展方法? [复制]

    这个问题在这里已经有答案了 我有这样的代码 public class TestA public string ColA get set public string ColB get set public string ColC get se
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • MSVC编译器下使用最大成员初始化联合

    我正在尝试初始化一个LARGE INTEGER在 C 库中为 0 确切地说是 C 03 以前 初始化是 static LARGE INTEGER freq 0 在 MinGW 下它产生了一个警告 缺少成员 LARGE INTEGER Hig
  • 如何在 Razor 编辑视图中显示选中的单选按钮 Asp net core mvc

    尽管 Razor 视图中的 Asp 网络核心代码 model List
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • Android自动备份错误

    我正在尝试实现 android 自动备份 Android 6 0 但它不起作用 我得到同样的错误 10 28 22 58 06 980 600 5578 I PFTBT Initiating full data transport back
  • 超时和会话超时问题

    我遇到超时问题 首先 即使 webconfig 中的时间设置为 120 分钟 服务器上每 20 分钟就会发生一次超时 其次 当超时发生时 它会转到登录页面 这是正确的 但重新登录时有时会转到默认页面 有时会转到之前所在的页面 我希望它每次都
  • 为什么缺少媒体类型 application/json 的 writer

    基本上我有一个安静的服务 帖子 它消耗 application json 并产生 application json 该服务的单个参数是一个带注释的 java 对象 我在用org jboss resteasy client ClientReq
  • Pandas 进行分组和求和,但在超过一定数量时创建新行

    我目前有一个数据集 我尝试根据列对行进行分组并对值为整数的列求和 然而 问题是一旦总和达到一定阈值我想创建一个新行 例如 在下面的数据框中 我尝试根据公司名称对行进行分组并总结权重 但是 我不希望权重超过 100 输入数据框 Company
  • 以 Azure Blob 存储块上传视频

    我正在接收分块的文件内容 正如我所读到的 建议使用 Azure blob 存储的最新 nuget 是Azure Storage Blobs 但我找不到任何示例或方法如何分块上传文件 支持吗 我收到的范围为Range标头 我正在用这个快速开始
  • C# XML - 使用 XML Writer 进行多命名空间声明

    我正在尝试使用 C 中的 System Xml Xmlwriter 创建具有多个命名空间的 XML 文档 但在编译时收到以下错误 在同一起始元素标记中 不能将前缀 从 重新定义为 http www acme com BOF 我的完整代码如下
  • Constexpr 指针值

    我试图声明一个初始化为某个常量整数值的 constexpr 指针 但 clang 挫败了我的所有尝试 尝试1 constexpr int x reinterpret cast
  • 如何在 UILabel 中检测并使超链接/提及/主题标签可点击?

    如何在 UILabel 中检测并使其链接 提及 主题标签可点击 或者 是否有任何我可以利用的开源库 我已经看过 Fancy UILabel 它不处理多行文本 TTAttributedLabel 不处理提及 标签 在当前的 iOS 中 没有办
  • 以编程方式抑制大容量存储设备的自动播放

    我需要抑制大容量存储设备的自动播放 这需要通过在后台运行的服务 守护程序以编程方式实现 我知道这可以通过打开一个窗口并处理窗口发送的 queryCancelAutoPlay 消息的应用程序来完成 这可以在没有 GUI 的情况下完成吗 我有需
  • 如何从 UWP 访问 Net Standard 2.0 类库中的内容

    我们有一个引用 UWP 类库的 UWP 应用 UWP 类库有一个 Common 文件夹 其中包含运行时所需的文件 这些文件被标记为 复制为内容 文件被复制到 UWP bin x64 Debug Appx
  • Knockoutjs:ScrollIntoViewTrigger

    我最近遇到了一个问题 虽然我为我解决了它 但我不确定是否没有更好的解决方案 所以我很感激任何评论 问题 我想创建一个 ScrollIntoView 绑定 由于将元素滚动到视图中需要 DOM 元素 因此我编写了一个自定义绑定 然后我想在我愿意
  • 机械化和 Google App Engine

    有人成功使用过吗机械化使用 Google App Engine 应用程序 是的 尽管您需要更改 mechanize py 文件或执行大多数人所做的操作 即下载已更改且已修复的版本 不确定这是否仍然有效 因为它是 2010 年的 以下是针对谷
  • 如何在 Ansible 中为每个剧本登录单独的文件

    我希望在 Ansible 中运行的每个 playbook 有单独的日志文件 而不是 log path 中定义的单个日志文件 据我所知 没有内置的方法可以做到这一点 所以我正在寻找聪明的 黑客 更具体地说 我希望在运行剧本后以 剧本名称 日期
  • 在 SwiftUI 中使用自己的 ButtonStyle 在 tvOS 上无法选择按钮

    将标准按钮样式替换为自定义按钮样式后 该按钮在 tvOS 上不再可选 它在 iOS 上按预期工作 PlainButtonStyle 中是否有我缺少的特殊修饰符 或者这是 SwiftUI 中的一个错误 这是有效的截图 Button actio
  • 如何在 Hibernate 查询中使用准备好的语句? [关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 如何在 Hibernate 查询中使用准备好的语句 默认情况下 Hibernate 使用PreparedStatement 你不必担心它 不仅Criteria但 Hibernate 使
  • 无法在 HoneyComb 3.2 上安装应用程序 - 它给出 INSTALL_PARSE_FAILED_NOT_APK 错误

    谢谢阅读 一位用户最近报告说 他无法在他的 Asus Eee Pad Transformer 上安装我的应用程序 我假设它已经更新了 3 2 因此 我尝试在 3 2 模拟器上安装该应用程序 这是我的控制台输出 2011 08 04 14 0
  • 在 AngularJs 中使用 UI-Router 更改导航菜单

    我正在尝试像任何社交网站一样构建一个导航菜单 即如果我logged Out我可以看到input fields要求Username and Password但如果我是logged In然后我可以看到我的个人资料 设置等 我正在尝试做同样的事情
  • Xamarin.android-如何更快地加密/解密图像

    我希望用户从图库中选择图像 视频并在我的应用程序中保护他们的图像 为此 我对这些图像进行了加密 图像加密工作正常 我认为是这样 8MB 图像需要 1 5 至 2 秒 但视频呢 视频可能以 GB 为单位 所以需要很多时间 即使在加密 解密中
  • 如何使用 ClearCase CM API 获取元素的历史记录?

    我想使用由clearcase 提供的Rational CM API 获取受clearcase 控制的文件元素 例如pdf 文件 doc 文件等 的历史记录 我编写了以下代码来获取历史记录 但它不完整 所以请在这里帮助我 public voi
  • CFB 模式下的 TripleDES、C# 和 Crypto++ 不同

    这是我的问题 我有一个 C 遗留代码 使用 crypto v5 6 1 并且我用 C 开发了一个新代码 使用 System Security Cryptography 的 NET 3 5 我无法改变C 代码 但我需要能够解密之前加密的数据