首页 > 解决方案 > 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 方法。

标签: c#encryptionaesphpseclib

解决方案


phpseclib 默认使用 CBC 模式。该模式需要 IV。正如其他一些评论所指出的那样,您使用的 phpseclib 版本在不存在时使用所有空字节的 IV。

$crypt->setKey($password); 

变量名称的事实$password确实让我想知道您的 C# 实现中是否使用了某种 PBKDF。很难说,因为您没有发布您的 C# 代码。

我已经收到“填充无效,无法删除”。当我尝试解密加密字符串时出错

phpseclib 默认使用 PKCS8 填充。IE。如果明文是块长度的倍数,它将附加 16x 0x16 个字节。如果它比块长度的倍数少两个字节,它将附加 2x 0x02 字节。

也许您的 C# 实现正在使用不同类型的填充。如果是这样,您可以通过首先禁用 PKCS8 填充来实现自己的$crypt->disablePadding();,然后在执行加密之前应用您自己的自定义填充。


推荐阅读