簡體   English   中英

PHP AES解密工作加密不

[英]PHP AES Decryption working Encryption NOT

所以,我有4個工作中的3個,從這個鏈接的 iOS加密 - 解密我能夠解密從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 ==)=“你好”

  • 關於PHP的結果 :Text =“7opqbb7sEVNoXplyQv / X8g ==”
    解密=“你好”
    加密(Hello)=“_〜TPn~p3MF?”

我認為很明顯,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'));

你的加密看起來很虛偽:

 $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文檔中的用戶提供的說明。)

當然,還有一些事情需要注意:

  • 如果您對密碼學一無所知,請不要使用ECB模式。 這是一種不安全的操作方式。 使用CBC模式(帶隨機初始化向量,隨數據一起發送)。

  • 您可以通過用零填充SALTKEY來創建密鑰。 這使得您的密鑰效果比必要的要弱。 (無論如何,在代碼中使用密鑰進行硬編碼都是一個壞主意。)提供一個完整的128位密鑰,或者使用salt和密鑰派生函數(如PBKDF-2)從密碼中獲取一個密鑰計數很高的密鑰。

  • 您的解密函數還應該檢查填充是否有效(即由相同的字節組成),而不是簡單地刪除它。

  • 您還應該在消息中使用消息身份驗證代碼(MAC),以避免一些允許解密消息的選擇密文攻擊。

在這里看到我的帖子: PHP iOS AES加密

當我一遍又一遍地看到同樣的問題時,我一直在重新發布。


我剛剛完成了同樣的項目。 我使用了你在“也考慮過......”中引用的庫。

以下是使用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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM