2016-05-11 214 views
-3
public function decrypt($str, $key){ 
    //AES, 256 ECB 
    $data = rtrim(
        mcrypt_decrypt(
         MCRYPT_RIJNDAEL_256, 
         $key, 
         base64_decode($str), 
         MCRYPT_MODE_ECB, 
         mcrypt_create_iv(
          mcrypt_get_iv_size(
           MCRYPT_RIJNDAEL_256, 
           MCRYPT_MODE_ECB 
          ), 
          MCRYPT_RAND 
         ) 
        ), "\0" 
       ); 
    return $data; 
} 

的$ str是從iOS應用程序加密的字符串,他使用的字符集是NSUTF8StringEncoding和使用方法AES-256-ECB-PKCS7Padding和BASE64輸出。PHP-AES-256-ECB解密亂碼

加密,然後

$ STR->42z7t5nzwvbk14gbemc9

$鍵 - >gxssh2016

加密後在iOS應用

$ STR->D2k5t33l+HD3snFTU+gNYlCH/DQ37WO6I6nUYbGTDKc


通知:我使用的AES在線工具來解密此字符串可以得到正確的結果:42z7t5nzwvbk14gbemc9

但是,用我的功能解密此$海峽輸出: x�Z����®(t�sڞ�<�^�q�P`

哪有我解密到42z7t5nzwvbk14gbemc9在PHP?

+1

您可以添加iOS加密代碼嗎? – UditS

+1

<關於不使用ECB的標準註釋,無論如何都被忽略> –

+1

[<關於mcrypt自2007年以來被放棄的標準註釋>](https://paragonie.com/blog/2015/05/if-you-re-typing- word-mcrypt-into-your-code-you-re-doing-it-wrong) – duskwuff

回答

2

MCRYPT_RIJNDAEL_256不是AES256。這是一個很少使用的密碼(部分AES標準的!),它在一個時間而不是16

如果要加密/解密AES256數據的操作類似於AES加密,但256位(32個字節)使用mcrypt,將一個256位(32字節)的密鑰傳遞給MCRYPT_RIJNDAEL_128

更好的是,儘量避免mcrypt。這是一個寫得很差的庫,它自2007年以來一直由開發者放棄。考慮使用OpenSSL擴展,例如

return openssl_decrypt(
    base64_decode($str), 
    "aes-256-ecb", 
    $key, 
    OPENSSL_RAW_DATA 
); 

(正如你在你的答案注意到,您的加密數據實際使用AES128加密;改變「256」到「128」,這將與您的示例數據工作,我已經離開了這個代碼使用AES256,以便回答問題。)