2011-11-18 161 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。