2012-11-12 37 views
7

私の暗号化機能は正常に動作していますが、復号化機能を使って適切な出力を得る方法はわかりません。ここでTripleDes、PKCS7、ECBを使用したPHPの暗号化/復号化

は、私の暗号化機能である:ここで

function Encrypt($data, $secret) 
{  
    //Generate a key from a hash 
    $key = md5(utf8_encode($secret), true); 

    //Take first 8 bytes of $key and append them to the end of $key. 
    $key .= substr($key, 0, 8); 

    //Pad for PKCS7 
    $blockSize = mcrypt_get_block_size('tripledes', 'ecb'); 
    $len = strlen($data); 
    $pad = $blockSize - ($len % $blockSize); 
    $data .= str_repeat(chr($pad), $pad); 

    //Encrypt data 
    $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); 

    return base64_encode($encData); 

} 

は私の復号化機能である:

function Decrypt($data, $secret) 
{ 
    $text = base64_decode($data); 

    $data = mcrypt_decrypt('tripledes', $secret, $text, 'ecb'); 

    $block = mcrypt_get_block_size('tripledes', 'ecb'); 
    $pad = ord($data[($len = strlen($data)) - 1]); 

    return substr($data, 0, strlen($data) - $pad); 
} 

今、私はtestのキーを使用していますが、私は1234567を暗号化しようとしています。私は、私が探している暗号化からbase64の出力を取得しますが、私は復号化に行くと何も返しません(空白の領域)。

私は暗号化/復号化にあまり精通していないので、どんな助けでも大歓迎です!

+2

3DESをAES、ECBをCBCに置き換え、MACを追加することをお勧めします。 – CodesInChaos

+0

ご推薦いただきありがとうございます@コードインカオス。私はそのような詳細を変更することはできませんし、おそらく安全性は低いですが、私が持っているものを使用しなければなりません。 –

答えて

14

私の問題を見てくれた皆様に感謝します。私はそれを解決したと思うし、ここで私の完全な解決策です。うまくいけば、似たような問題を抱えている誰かが助けてくれることを願っています。

function Encrypt($data, $secret) 
{  
    //Generate a key from a hash 
    $key = md5(utf8_encode($secret), true); 

    //Take first 8 bytes of $key and append them to the end of $key. 
    $key .= substr($key, 0, 8); 

    //Pad for PKCS7 
    $blockSize = mcrypt_get_block_size('tripledes', 'ecb'); 
    $len = strlen($data); 
    $pad = $blockSize - ($len % $blockSize); 
    $data .= str_repeat(chr($pad), $pad); 

    //Encrypt data 
    $encData = mcrypt_encrypt('tripledes', $key, $data, 'ecb'); 

    return base64_encode($encData); 

} 

ここに新しい復号化機能があります。

function Decrypt($data, $secret) 
{ 

    //Generate a key from a hash 
    $key = md5(utf8_encode($secret), true); 

    //Take first 8 bytes of $key and append them to the end of $key. 
    $key .= substr($key, 0, 8); 

    $data = base64_decode($data); 

    $data = mcrypt_decrypt('tripledes', $key, $data, 'ecb'); 

    $block = mcrypt_get_block_size('tripledes', 'ecb'); 
    $len = strlen($data); 
    $pad = ord($data[$len-1]); 

    return substr($data, 0, strlen($data) - $pad); 
} 

私はmycrypt_decrypt関数を実行する前に正しい形式でキーを生成するために同じコードを追加する必要がありました。

+1

非常に参考になりました、ありがとう! –

+1

ありがとうございました! –

+1

$ blockはDecrypt関数で使用されません – omarjebari

関連する問題