c# - Crypt_AES phpseclib 等效 C# 没有 IV
问题描述
我需要将 xml 服务集成到我们的应用程序中,并且 Web 服务正在使用 phpseclib AES 加密和解密。所以,我需要了解phpseclib的流程。我们正在开发 .NET C# 环境,我们无法分析该 php 代码。请找到实现的示例 php 代码,并建议我如何将其转换为 C#。
set_include_path('vendor/pear');
require_once '/Crypt/AES.php';
require_once '/SOAP/Client.php';
$password = 'ewad3x45efc542b3897e23esgy4s6xnm';
$data = '
<WorkRequest version="3.0">
<work>WORK NOW!</work>
</WorkRequest> ';
$crypt = new Crypt_AES();
$crypt->setKey($password);
$data = gzencode($data);
$data = $crypt->encrypt($data);
如您所见,没有IV或类似的东西。示例代码中仅使用了 setKey 和 encrypt 方法。
解决方案
phpseclib 默认使用 CBC 模式。该模式需要 IV。正如其他一些评论所指出的那样,您使用的 phpseclib 版本在不存在时使用所有空字节的 IV。
$crypt->setKey($password);
变量名称的事实$password
确实让我想知道您的 C# 实现中是否使用了某种 PBKDF。很难说,因为您没有发布您的 C# 代码。
我已经收到“填充无效,无法删除”。当我尝试解密加密字符串时出错
phpseclib 默认使用 PKCS8 填充。IE。如果明文是块长度的倍数,它将附加 16x 0x16 个字节。如果它比块长度的倍数少两个字节,它将附加 2x 0x02 字节。
也许您的 C# 实现正在使用不同类型的填充。如果是这样,您可以通过首先禁用 PKCS8 填充来实现自己的$crypt->disablePadding();
,然后在执行加密之前应用您自己的自定义填充。
推荐阅读
- python - 基于列中连续计数的标志创建
- flutter - 如何在颤动中对齐堆栈内的元素?
- java - Javadoc - 从文档中的另一个点引用参数,例如 @link
- javascript - Vue选择点击选择器事件
- postgresql - Postgres 选择 2019 年的所有星期日
- discord.py - discord.py - 为什么我的 serverinfo 命令将所有者显示为“无”?
- python-3.x - ModuleNotFoundErro——但我已经在导入它
- java - 如何将无类型对象转换为 HashMap
- ios - 在其他项目共享的 iOS 通用项目中初始化 Firebase Crashlytics
- python - 当我们递归使用 yield 时,我们会创建 n 个迭代器吗?