1

データベース内のデータを暗号化するためにこのコードを作成しました(テスト目的でプレーンテキストとして保存されました):

try {
$link = new PDO("mysql:host=localhost;dbname=MAIN", 'USER', 'PASSWORD');
$stmt = $link->prepare("SELECT * FROM workers WHERE crypt = '0'");
$stmt->execute();
$prepared = $stmt->fetchAll(PDO::FETCH_ASSOC);

$sentinel = mcrypt_module_open(MCRYPT_3DES,'',MCRYPT_MODE_CBC,'');
$key_c = substr(sha1(microtime()),0,24);
$iv = substr(sha1(microtime()),24,8);
mcrypt_generic_init($sentinel, $key_c, $iv);
for($key=0; $key<count($prepared); $key++)
{



    $sort = mcrypt_generic($sentinel, $prepared[$key]['sort']);
    $account = mcrypt_generic($sentinel, $prepared[$key]['account']);
    $bank_name = mcrypt_generic($sentinel, $prepared[$key]['bank_name']);
    $bank_holder = mcrypt_generic($sentinel, $prepared[$key]['bank_holder']);
    $address = mcrypt_generic($sentinel, $prepared[$key]['address']);
    $post_code = mcrypt_generic($sentinel, $prepared[$key]['post_code']);

    $mobile = mcrypt_generic($sentinel, $prepared[$key]['mobile']);
    $phone = mcrypt_generic($sentinel, $prepared[$key]['phone']);

    $kin_name = mcrypt_generic($sentinel, $prepared[$key]['kin_name']);
    $kin_rel = mcrypt_generic($sentinel, $prepared[$key]['kin_relation']);
    $kin_phone = mcrypt_generic($sentinel, $prepared[$key]['kin_phone']);



$stmt = null;
$stmt = $link->prepare("UPDATE workers SET sort = :sort, account = :acc, bank_name = :bank_name, bank_holder = :bank_holder, address = :address, post_code = :post_code, crypt = '1', mobile = :mobile, phone = :phone, kin_name = :kin_name, kin_relation = :kin_rel, kin_phone = :kin_phone WHERE reference = :id");

$stmt->bindParam('sort', base64_encode($sort));
$stmt->bindParam('acc',base64_encode($account));
$stmt->bindParam('bank_name', base64_encode($bank_name));
$stmt->bindParam('bank_holder', base64_encode($bank_holder));
$stmt->bindParam('address', base64_encode($address));
$stmt->bindParam('post_code', base64_encode($post_code));
$stmt->bindParam('mobile', base64_encode($mobile));
$stmt->bindParam('phone', base64_encode($phone));
$stmt->bindParam('kin_name', base64_encode($kin_name));
$stmt->bindParam('kin_rel', base64_encode($kin_rel));
$stmt->bindParam('kin_phone', base64_encode($kin_phone));
$stmt->bindParam('id',$prepared[$key]['reference']);

$stmt->execute();

$stmt=null;

$stmt= $link->prepare('INSERT INTO crypt VALUES (\'\', :id, :key, :iv);');
$stmt->bindParam('id', $prepared[$key]['reference']);
$stmt->bindParam('key', base64_encode($key_c));
$stmt->bindParam('iv',base64_encode($iv));

$stmt->execute();
}
} catch (PDOException $e) {

var_dump($e);
}

データベース内のすべてが適切に見えます。データの復号化を試みるまで...:

$lnk=new PDO("mysql:host=localhost;dbname=MAIN", 'USER', 'PASSWORD');
$stmt=$lnk->prepare("SELECT * FROM crypt WHERE reference = :ref");
$stmt->bindValue('ref', $result['reference']);
$stmt->execute();
$crypt = $stmt->fetch(PDO::FETCH_ASSOC);
        $key_c = base64_decode($crypt['key']);
        $iv = base64_decode($crypt['iv']);

print mcrypt_decrypt ( MCRYPT_3DES , $key_c , base64_decode($result['address']) , MCRYPT_MODE_CBC , $iv)."<br />";

すべてのデータは base64 でエンコードされたキーとベクトルが配置されており、すべてが完璧ですが、アドレスの復号化は次のような出力を示します。

8×Áêkâäseアベニュー

そして、この問題はすべてのデータにあります...

なぜこれが起こったのか誰か説明できますか?

PHP バージョン 5.3.15 MCrypt バージョン 2.5.8

4

1 に答える 1

1

IVをエンコードしているときに問題が発生しました。IV値が正しくない場合、(のみ)復号化された出力の最初の8バイトが正しくない可能性があり8×Áê kâäます。se Avenue正しい可能性があります。

于 2012-12-27T15:08:50.630 に答える