【问题标题】:PHP decryption function failPHP解密功能失败
【发布时间】:2016-03-17 16:34:31
【问题描述】:

我正在尝试将数据从我的 Android 应用程序发送到运行 PHP 5.5 的 Apache2 服务器,同时在双方都进行 AES-128 加密/解密。

奇怪的是,当我在 Eclipse 上运行 java 代码来加密数据(作为测试)并使用 Netbeans 上的 PHP 将加密结果解密时,它工作得很好。将代码传输到 Android 也会得到相同的加密结果,但服务器上的解密函数不会返回任何结果,它只是给出一个空值,我使用的代码与我在 Netbeans 上使用的完全相同。

这是代码

   if(isset($_POST['param']))
  {
    $param = $_POST['param'];

    $param=decrypt($param, "57238004e784498bbc2f8bf984565090");
}
else
    echo "No post Request Received";


function decrypt($encrypted, $key) {
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, hex2bin($key),hex2bin($encrypted), MCRYPT_MODE_ECB);
        echo $decrypted;
    $padSize = ord(substr($decrypted, -1));
    return substr($decrypted, 0, $padSize*-1);
 }

echo $decrypted 给出一个 null 并且返回。

示例: 密码:269B3F5A2208C533AACB51243CFB9CFB 解密为:28

有人知道问题出在哪里吗?

【问题讨论】:

  • wat 是解密函数的返回值
  • 基本调试:var_dump($decrypted)。如果它是布尔假,那么它根本没有解密。
  • var_dump 返回 false。没有返回值。
  • 1.您已发布您的加密密钥。您现在可能应该使用不同的。 2. 你能发布一个示例加密字符串以及它应该解密的内容吗? 3. 欧洲央行糟透了。使用 CBC。
  • 除了安全问题(ECB 模式?没有 MAC?)之外,除非您包含要传递给应用程序的示例密文,否则我们无法诊断此问题。

标签: php encryption aes mcrypt


【解决方案1】:

在阅读了填充方法之后,我无法再对用于填充输入的方法 PKCS5 提出异议。但是,用于从 输出 中去除填充的方法仍然有可能引入您遇到的错误。

这是因为以 z [ord('z') == 122] 结尾的 16 字节字符串将导致当前方法执行 substr($data, 0, -122); 并返回 false

为了确定最后一个字节是填充,您需要读取最后一个字节,验证输出中最后一个 $padSize 字节是该字节的重复,并且只在这种情况下修剪字符串。

<?php
function decrypt($encrypted, $key) {
    $decrypted = mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        hex2bin($key),
        hex2bin($encrypted),
        MCRYPT_MODE_ECB);
    return unpad($decrypted);
}

function unpad($data) {
    $padSize    = ord(substr($data, -1));
    $padStr     = substr($data, strlen($data) - $padSize);
    $padCheck   = str_pad('', $padSize, chr($padSize));
    if( strcmp($padStr, $padCheck) === 0 ) {
        return substr($data, 0, $padSize*-1);
    } else {
        return $data;
    }
}

$key    = '57238004e784498bbc2f8bf984565090';
$data   = '269B3F5A2208C533AACB51243CFB9CFB';

var_dump(decrypt($data, $key));
// Output: string(2) "28"

此外,ECB 模式几乎是您可以选择的最弱的模式。请参阅this wikipedia article 中 ECB 部分末尾的图片,了解一个很好的示例。

使用 CBC。

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 2012-10-05
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2017-12-22
    • 1970-01-01
    • 2017-02-24
    • 2023-01-30
    相关资源
    最近更新 更多