2016-05-10 8 views
0

これは私のコードです:PHP - Openssl_decryptエラー:間違った最後のブロック長(AES 256 CBCモードの暗号化/復号化)

function decrypt($code) 
{ 

    $key = '3552ef55ecdf04324..'; // 64 bytes length 
    $iv = 'd20818af907b59c3b15d258dd3969770'; // 32 bytes length 
    $key = hash("sha256", $key,true); // 32 bytes length 
    $iv = md5($iv,true); // 16 bytes length 

    echo strlen(base64_decode($code)); // 80 bytes 
    //return openssl_decrypt(base64_decode($code), 'aes-256-cbc', $key, 0 ,$iv); // return false 
    $output = openssl_decrypt(base64_decode($code), 'aes-256-cbc', $key, 0 ,$iv); 
    return openssl_error_string(); 

} 

私は迅速/アンドロイドを使用して暗号化し、私はPHPを使用して復号化します。

openssl_error_string()メソッドは、 "エラー:0606506D:デジタルエンベロープルーチン:EVP_DecryptFinal_ex:間違った最終ブロック長"を返します。

暗号化の速さとアンドロイドのキーとivは同じであることに注意してください。 ここで問題が見つかりません。誰でも?ありがとう。

+0

あなたはPKCS#7(旧姓のPKCS#5)のパディングを指定していますか?暗号化されたデータはブロック長(AESの場合は16バイト)の倍数ですか?私は、デバッグをより困難にするステップを組み合わせないことを常にお勧めします。 Hexは暗号化されたデータ( 'base64_decode($ code)')をダンプしますが、それはあなたの考えではないかもしれません。 – zaph

+0

PKCS#7パディングを指定しています。暗号化されたデータは、ブロック長(80バイト)の倍数です。

0000 ab bc ea d5 22 1a 56 dd eb ad 30 17 96 c8 84 6d ".V 0.m 0010 16 c8 c3 1f e6 6f f1 71 1b 63 f3 71 85 18 b0 b8 ..oq .cq. 0020 d1 9b fa 3e df a0 a3 c3 45 d2 62 76 dc cc 94 53 > EbvS 0030 85 ac 88 77 11 60 d6 12 b4 52 db d2 2d e9 bd 3b w.'. R-; 0040 f6 a1 46 5a ec 54 55 54 04 8f 00 60 09 cf af c2 FZTUT ..'.
@zaph –

+0

暗号化されたデータ($コード)されています:ここでhexdumpがある** q7zq1SIaVt3rrTAXlsiEbRbIwx/MB/FxG2PzcYUYsLjRm/O + 36Cjw0XSYnbczJRThayIdxFg1hK0UtvSLem9O/ahRlrsVFVUBI8AYAnPr8I = ** 平文でなければなりません:** a18ac4e6fbd3fc024a07a21dafbac37d828ca8a04a0e34f368f1ec54e0d4fffb ** @zaph –

答えて

0

私はこの問題を解決します。実際には、私はAndroid側でURLEncoding paramsであり、次にPHPスクリプトでURLDecodingしています。

残念ながら、 '+'のURLデコードはAndroidでは空白ですが、正しい場合は '+'です。

PHP側では、デコードの前に空白文字を '+'で置き換えました。 そしてbase64_decode関数を削除します。

更新コード:

function decrypt($code) 
{ 

$key = '3552ef55ecdf04324d0fe72343...'; 
$iv = 'd20818af907b59c3b15d258dd3969770'; 

$key = hash("sha256", $key, true); 
$iv = md5($iv, true); 
if (preg_match('/\s/', trim($code))) { 
    $code = str_replace(' ', '+', trim($code)); 
} 

$output = openssl_decrypt($code, 'aes-256-cbc', $key, 0, $iv); 
return $output; 

} 
関連する問題