PHP中的DES/ECB/PKCS5Padding解密

Posted

技术标签:

【中文标题】PHP中的DES/ECB/PKCS5Padding解密【英文标题】:DES/ECB/PKCS5Padding decryption in PHP 【发布时间】:2012-04-17 18:51:35 【问题描述】:

我需要用 php(或 javascript)解密一些服务调用。我花了一整天的时间试图完成这个,但我无法正确解密它。

作为参考,服务商发给我以下Java解密示例代码:

DESKeySpec dks = new DESKeySpec("keyword".getBytes()); 
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey key = keyFactory.generateSecret(dks);

Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
SecureRandom sr = new SecureRandom();  
cipher.init( Cipher.DECRYPT_MODE, key ,sr); 

byte b[] = response.toByteArray();      
byte decryptedData[] = cipher.doFinal( b );

我认为我在正确的道路上使用:

$td = mcrypt_module_open(MCRYPT_DES, '', 'ecb', '');
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = substr($keyword, 0, mcrypt_enc_get_key_size($td));
mcrypt_generic_init($td, $key, $iv);
$decrypted = mdecrypt_generic($td, $data);
$decrypted = pkcs5_unpad($decrypted);

但是,坦率地说,我确信我在使用 $iv creationg 和 $keyword 设置(或者可能使用 $data 或 $decrypted 类型?)时搞砸了一切。 pkcs5_unpad函数如下:

function pkcs5_unpad($text)

   $pad = ord($textstrlen($text)-1);
   if ($pad > strlen($text)) return false;
   return substr($text, 0, -1 * $pad);

我不仅是 php 方面的菜鸟,而且对密码学技术也很了解……你能帮我解决这个问题吗?

【问题讨论】:

你的提供者是个白痴,没有别的说法。 IV(称为 SR)永远不能随机解密。关键字不是有效的密钥。不应使用 DES,也不应使用 ECB 编码。 getBytes 永远不应在未指定字符编码的情况下调用。这就是直接刺痛我的原因。 可能是的,但是 Java 示例应该可以工作(至少他是这么说的)。 "keyword" 不是真正的密钥,但其余代码应该是有效的 java 代码。 嗯,小改动,SR 不用于 IV,但用于 Cipher 的任何随机部分(这实际上意味着它根本不使用)。所以Java代码可能工作。并不是说 IV 会在 ECB 模式下做出任何改变,而是无论如何。 “关键字”很遗憾只有 7 个字符。您的平台可能对 ASCII 字符使用 1 字节 UTF-8 编码,因此您的代码将不再运行。您可以很容易地在 Java 或 PHP 中生成对称“加密”方法,使用 Java 解密对其进行测试,然后继续测试 PHP 代码。然后您可以向我们发送测试向量而不仅仅是代码(您也可以创建单元测试)。 【参考方案1】:

确保您的密钥由相同的字节组成(字符串的编码可能不同),并为其提供一个用零填充的 IV。 ECB 模式不使用 IV(并且 PHP 手册指定了这么多),但如果你给它一个默认值,它会全部为零 - IV 将与第一个纯文本块进行异或,因此将其设置为全零将取消该操作。此外,请确保输入的密码数据相同。首先忽略padding,unpadding之前应该可以检查结果是否正确。

【讨论】:

实际关键字长度为 11 个字符。我已经尝试过您的全零建议,但没有运气。我在服务响应中得到了很多符号,所以我想我可能需要在解密之前进行一些转换。 也取决于您对结果的期望是什么?你没有告诉我们,所以我们不能说。这就是为什么我建议也编写一个 ecrypt 方法......哦,创建 DES 密钥时不接受 11 个字节,afaik。

以上是关于PHP中的DES/ECB/PKCS5Padding解密的主要内容,如果未能解决你的问题,请参考以下文章

php变量和数据类型

PHP中的反射

PHP入门培训教程 php中的时间处理

PHP入门培训教程 php中的时间处理

php functions.php中的主题自定义php代码

PHP解析PHP中的数组