【问题标题】:PHP AES Decryption working Encryption NOTPHP AES解密工作加密不
【发布时间】:2012-01-03 12:10:29
【问题描述】:

所以,我有 4 个工作中的 3 个工作,iOS 加密解密来自这个 Link 而且我能够解密从 iOS 加密的数据我在 PHP 端加密时遇到问题。 当我回显加密代码时。 PHP 打印类似 F>HFl8aR 是什么意思?

SALTKEY = 'a16byteslongkey!';

解密代码:工作中

     $result =  mcrypt_decrypt(MCRYPT_RIJNDAEL_128, (SALTKEY . str_repeat(chr(0x00), 16)), 
                               base64_decode($text), 'ecb');
     $pad_char = ord(substr($result, -1));
     return substr($result, 0, strlen($result) - $pad_char);

加密代码:不工作

     $result =  mcrypt_encrypt(MCRYPT_RIJNDAEL_128, (SALTKEY . str_repeat(chr(0x00), 16)), 
                               base64_encode($text), 'ecb');
     $pad_char = ord(substr($result, -1));
     return substr($result, 0, strlen($result) - $pad_char);
  • iOS 上的结果:Text = "Hello"
    加密 = "7opqbb7sEVNoXplyQv/X8g=="
    (7opqbb7sEVNoXplyQv/X8g==) = "Hello" 的解密

  • PHP 上的结果:文本 = "7opqbb7sEVNoXplyQv/X8g=="
    解密 =“你好”
    (Hello) 的加密 = "_~TPn~p3MF?"

【问题讨论】:

  • 尝试CBC模式。如果没关系。
  • PHP 打印类似 F>HFl8aR 的东西 - 这很像二进制字符串,不是吗?尝试解密这个字符串
  • @Alfred 我相信我需要使用与使用 ECB 模式的 iOS 相同的模式
  • @confused-demon .. 不,它不应该是 binay .. 如果我在 iOS 上加密“Hello”,我得到“7opqbb7sEVNoXplyQv/X8g==”,如果解密“7opqbb7sEVNoXplyQv/X8g==”我如果我解密 "7opqbb7sEVNoXplyQv/X8g==" 在 PHP 上获得 Hello....令人困惑的评论..我会将此添加到问题中。

标签: php iphone ios encryption aes


【解决方案1】:

我认为很明显 IOS 加密给出了 7 位结果(看起来像 base64 编码),而 PHP 给出了 8 位表示。

您似乎没有掌握反转操作的窍门。

解密是通过base64_decodeing 输入执行的,然后应用mcrypt_decrypt。因此,要反向执行此操作,您需要先mcrypt_encrypt,然后然后 base64_encode

 $result =  base64_encode(
          mcrypt_encrypt(MCRYPT_RIJNDAEL_128, 
                (SALTKEY . str_repeat(chr(0x00), 16)), 
                $text, 'ecb'));

【讨论】:

  • 希望您不要介意我的编辑以阐明逆运算的含义。
  • 这点真的很好,我试过了,但它没有给我相同的结果..这就是我得到的.. 1V6SDeqH5++qfooQ7xp/xg== 在加密“Hello”之后我是寻找“7opqbb7sEVNoXplyQv/X8g=="..
【解决方案2】:

你的加密看起来很假:

 $result =  mcrypt_encrypt(MCRYPT_RIJNDAEL_128, (SALTKEY . str_repeat(chr(0x00), 16)), 
                           base64_encode($text), 'ecb');
 $pad_char = ord(substr($result, -1));
 return substr($result, 0, strlen($result) - $pad_char);

你用base64对文本进行编码,然后加密,然后再尝试删除填充?

相反,你必须

  • 添加填充(如果加密功能尚未这样做),
  • 加密
  • 然后对结果进行 base-64 编码(如果您想让它以某种方式被人类读取或 通过非二进制安全通道传输)。

这可能看起来像这样:

$padded = pad($text);
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, (SALTKEY . str_repeat(chr(0x00), 16)), 
                       $padded, 'ecb');
$result = base64_encode($encrypted);

(查看mcrypt_encrypt documentation 上用户提供的注释,了解如何创建填充的示例。)

当然,还有一些需要说明的地方:

  • 如果您对密码学一无所知,请永远不要使用 ECB 模式。这是一种不安全的操作模式。使用 CBC 模式(使用随机初始化向量,随数据一起发送)。

  • 通过用零填充 SALTKEY 来创建密钥。这使您的密钥实际上比必要的弱。 (无论如何,在代码中硬编码一个密钥是一个坏主意。)提供一个完整的 128 位密钥,或者使用盐和具有高迭代次数的密钥派生函数(如 PBKDF-2)从密码中派生一个。

  • 您的解密函数还应检查填充是否有效(即由相同的字节组成),而不是简单地删除它。

  • 您还应该在消息中使用消息验证码 (MAC),以避免某些允许解密消息的选择密文攻击。

【讨论】:

  • 你提出了非常好的观点,现在我想让它工作第二部分会做对。并为你投票......谢谢
【解决方案3】:

在这里查看我的帖子:PHP iOS AES Encryption

当我一遍又一遍地看到同样的问题时,我一直在转发这个。


我刚刚完成了同样的项目。我使用了您在“也考虑过...”中引用的库

下面是一些用 php 解密的示例代码:

$iv2 = '';
for($i=0;$i<16;$i++){
    $iv2 .= "\0";   
}
$plain_text_CBC = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encrypted_text, MCRYPT_MODE_CBC, $iv2);
var_dump($plain_text_CBC);

确保您的密钥都是 256 位(32 个字符,我还没有遇到任何编码问题,但如果您这样做了,请记住您加密的是字节,而不是字符)。请注意,MCRYPT_RIJNDAEL_128 中的 128 是块大小而不是密钥大小,而在方法 AES256DecryptWithKey 中,256 是对密钥大小的引用,而块大小为 128。AES256DecryptWithKey 运行在 CBC 模式下,但初始化向量为空( iv)。

CBC 意味着每个块都依赖于最后一个块,因此它使用一个预先设置的、通常是随机的“块 -1”,称为 IV

ECB 意味着每个块都以相同的方式加密,因此它揭示了同一消息中的两个块何时相同。提到的库没有使用它,所以我提到它只是为了对比。

使用零 iv(0000000000000000 以字节为单位)被认为是不安全的,但它确实为您提供了一些额外的安全性(但人们仍然可以判断您的纯文本的前 16 个字符是否每次都相同)。要解决此问题,您必须为 IV 创建一个 NSData *iv 变量并修改 NSData+AESCrypt.m 的 CCcrypt 参数以为 iv 参数添加 [iv bytes](我尚未测试此代码),您将需要存储此 iv 并将其与您的消息一起传递给 php。但首先我会测试并让一切都使用零 iv。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-16
    相关资源
    最近更新 更多