2011-11-18 141 views
3

因此,我有3个工作中的4个工作,iOS加密解密从此Link 而且我能够解密数据从iOS加密我遇到了麻烦在PHP端加密。 当我做回声加密代码。 PHP打印的东西像F>HFl8aR这是什么意思?PHP AES解密工作加密NOT

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); 

加密代码:不工作的iOS

 $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); 
  • 结果:文本= “你好”
    加密=“ 7opqbb7sEVN oXplyQv/X8g ==”
    解密(7opqbb7sEVNoXplyQv/X8g ==)=的 “你好”

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

+1

尝试CBC模式。如果没关系。 – 2011-11-18 07:58:28

+1

_PHP打印类似F>HFl8aR_ - 这很像一个二进制字符串,它不应该是?尝试解密此字符串 – dmitry

+0

@Alfred我相信我需要使用相同的模式,因为iOS使用ECB模式 – GoGreen

回答

3

我认为它相当明显的是,IOS加密是给7位的结果(看起来像base64编码),而PHP提供了一个8位表示。

您好像没有得到的倒车的操作。

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

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

我希望你不要介意我的编辑来澄清逆向操作的含义。 – Yuliy

+0

这是非常好的一点,我试过,但它不给我相同的结果..这就是我越来越.. 1V6SDeqH5 ++ qfooQ7xp/xg ==加密后“你好”,我正在寻找“7opqbb7sEVNoXplyQv/X8g = =“..” – GoGreen

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文本,然后对其进行加密,然后再尝试删除填充

相反,你必须

  • 添加填充(如果加密功能已经不这样做),
  • 加密
  • 然后基于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)与你的消息,以避免其中一些允许解密的消息选择密文攻击。

+0

你做得很好,现在我想让它工作,第二部分将会做得很好。并投票给你.. thansk – GoGreen

1

看到我的帖子在这里: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模式中,但具有空初始化向量( ⅳ)。

CBC意味着每个块取决于最后块上,因此它使用预先设定的,通常是随机的,“块1”称为IV

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

零iv(0000000000000000以字节为单位)的使用被认为是不安全的,但它确实为您提供了一些额外的安全性(但您仍然可以分辨明文的第16个字符是否相同时间)。要解决这个问题,你必须为IV创建一个NSData * iv变量,并修改NSData + AESCrypt.m的CCcrypt参数,为iv参数添加[iv bytes](我还没有测试过这个代码),而且你会需要存储这个iv并将它和你的消息一起传递给php。但首先我会测试,并使一切工作与零iv。