ツリー一括表示

Nomal BLOWFISHの詳しいデータ /のなお (13/08/07(Wed) 18:20) [#6339]
Nomal Re[1]: BLOWFISHの詳しいデータ /もんぴん (13/08/08(Thu) 08:27) [#6340]
  └Nomal 自分には無理なのかな /のなお (13/08/08(Thu) 19:14) [#6341]
    └Nomal Re[3]: 自分には無理なのかな /うぇいく (13/08/08(Thu) 22:09) [#6342]
      └Nomal Re[4]: 自分には無理なのかな /もんぴん (13/08/09(Fri) 10:52) [#6343]
        └Nomal Re[5]: 自分には無理なのかな /のなお (13/08/10(Sat) 20:18) [#6344] 解決済み!
          └Nomal Re[6]: 自分には無理なのかな /もんぴん (13/08/10(Sat) 23:55) [#6345]
            └Nomal 解決! /のなお (13/08/12(Mon) 20:25) [#6346] 解決済み!


親記事 / ▼[ 6340 ]
/ 親階層)  BLOWFISHの詳しいデータ
□投稿者/ のなお 【110.4.168.163】(2013/08/07(Wed) 18:20:36)

    久々の質問です。

    以前、BLOWFISHとBASE64を使って暗号化したデータを、
    サーバーのCGIに渡して復号化して活用したかったのですが、
    うまく復号化出来ず、諦めて放置していました。
    最近また思いだし是非作ってみたいです。
    ※テスト環境はPHPで試しました

    ・おすすめモジュール名などなど(PerlでもPHPでもかまいません)
    ・なでしこのBLOWFISHのモードなど詳しい情報

    暗号に詳しくないため苦労してます。
    アドバイス宜しくお願い致します。

[ □ Tree ] 返信 削除キー/
[ □ Tree ] 返信

▲[ 6339 ] / ▼[ 6341 ]
/ 1階層)  Re[1]: BLOWFISHの詳しいデータ
□投稿者/ もんぴん 【122.130.157.253】(2013/08/08(Thu) 08:27:31)

    こんにちは。

    モードはCBCです。
    ライブラリは、勝手にsaltを付加しないライブラリならば何でもいいかと思います。試したことがないので紹介はできませんが。

    注意すべき点は、なでしこではsaltが入っています。
    初期化ベクトルもあわせて、詳しくは以下の17と22行目をご覧ください。

    ↓なでしこソースコード
    http://code.google.com/p/nadesiko/source/browse/trunk/hi_unit/unit_blowfish.pas
[ 親 6339 / □ Tree ] 返信 削除キー/
[ 親 6339 / □ Tree ] 返信

▲[ 6340 ] / ▼[ 6342 ]
/ 2階層)  自分には無理なのかな
□投稿者/ のなお 【110.4.168.163】(2013/08/08(Thu) 19:14:06)

    こんにちは。

    もんびんさんレスありがとうございます。リンクのソースを拝見した。
    いろいろ検索掛けて調べてみましたが、さっぱり分かりませんでしたので質問させてください。

    salt文字列内のコロンは別の意味があるのでしょうか?

     Result := 'com.nadesi::' + AnsiString(Trim(string(Key))) + ':nadesiko:pKUkh9Dhgj8m5KZTbkv:';

    これは、なでしこで言う

     それは「com.nadesi::{KEYをトリム}:nadesiko:pKUkh9Dhgj8m5KZTbkv:」

    と同等でしょうか?

    「:=」は左に代入と言うことは検索で調べて分かりました。「Result」は「それ」と同じですよね。
    デルファイ詳しくないので、なんかコロンが入ると別の意味でもあるのかと考えてしまいます(汗
    ※コロンが意味有り気で不安です。検索しても出てこないので大丈夫だと思いますが。。。


    あと、初期化ベクトルIVの22行は配列生成個数のところの「- 1」が分かりません。

     IV: array [0..1 - 1] of Int64 = ($1FA3D38A3532AC56);

    PASCALで配列等で検索しても「- 1」の意味の分かるページがありませんでした。
    ただのarray [0..2]とかだったら分かるのですが、このIV配列の初期化は何をやっているのでしょうか?
    配列を符号付き64ビット分?生成して、すべてに?16進数「1FA3D38A3532AC56」を代入ということでしょか?
    TCryptCBC.Create関数の第三引数はどういうデータなのか?もう、ちんぷんかんぷんです。
    ※第三引数のIVはCBCの最初の暗号化データ用の値ということは調べて分かっています。

    モードはてっきりECBと思い込んでいましたので、CBCと分かり少し前進しました。
    引き続き、分かる方おられましたら宜しくお願いします。


    No6340に返信(もんぴんさんの記事)
    > こんにちは。
    >
    > モードはCBCです。
    > ライブラリは、勝手にsaltを付加しないライブラリならば何でもいいかと思います。試したことがないので紹介はできませんが。
    >
    > 注意すべき点は、なでしこではsaltが入っています。
    > 初期化ベクトルもあわせて、詳しくは以下の17と22行目をご覧ください。
    >
    > ↓なでしこソースコード
    > http://code.google.com/p/nadesiko/source/browse/trunk/hi_unit/unit_blowfish.pas
[ 親 6339 / □ Tree ] 返信 削除キー/
[ 親 6339 / □ Tree ] 返信

▲[ 6341 ] / ▼[ 6343 ]
/ 3階層)  Re[3]: 自分には無理なのかな
□投稿者/ うぇいく 【220.147.194.203】(2013/08/08(Thu) 22:09:29)

    トリッキーなところを1点だけ。

    >  IV: array [0..1 - 1] of Int64 = ($1FA3D38A3532AC56);

    は、64bitsの整数型の変数に数値(ここでは$をつけて16進数表記)を代入しています。
    そして、それが最終的にはバイナリ列のように渡されているようなので、おそらく、バイトの並び順が逆になります(CPUがx86系なので。)
    なでしこ風に書くと、
    IV="{\$56}{\$AC}{\$32}{\$35}{\$8A}{\$D3}{\$A3}{\$1A}"
    という、8bytesになるんじゃないかと思います。

[ 親 6339 / □ Tree ] 返信 削除キー/
[ 親 6339 / □ Tree ] 返信

▲[ 6342 ] / ▼[ 6344 ]
/ 4階層)  Re[4]: 自分には無理なのかな
□投稿者/ もんぴん 【211.9.39.105】(2013/08/09(Fri) 10:52:38)

    こんにちは。

    Javaで試してみたところ、復元できました。
    IVの値はうぇいくさんの仰る通りです。

    > 「com.nadesi::{KEYをトリム}:nadesiko:pKUkh9Dhgj8m5KZTbkv:」と同等でしょうか?
    同じです。

    > あと、初期化ベクトルIVの22行は配列生成個数のところの「- 1」が分かりません。
    私もdelphiは書いた事が無いので知りませんが、Int64型の配列を初期値$1FA3D38A3532AC56で作成しているのではないでしょうか。(配列の長さは1)

    PHPでもmcryptで試してみましたが、下記サイトの通りmcryptはパディング方式を選ぶ事ができません。
    そのため、復元すると元の文字列+αで戻ってきました。
    paddingを自作するか、+αの1バイトを見て右端の削除文字数を判断すれば元の文字列になります。

    ↓異なる言語間での暗号化と復号
    http://d.hatena.ne.jp/pasela/20100612/crypto
[ 親 6339 / □ Tree ] 返信 削除キー/
[ 親 6339 / □ Tree ] 返信

▲[ 6343 ] / ▼[ 6345 ]
/ 5階層)  Re[5]: 自分には無理なのかな
□投稿者/ のなお 【110.4.168.163】(2013/08/10(Sat) 20:18:21)

    こんばんは。

    もんぴんさん、うぇいくさん、いろいろなヒントやアドバイスをいただきありがとうございました。
    結果を先に言えば「PASSWORD」は「PASSRORD」で、
    「W」が「R」となり不思議な結果でまだまだでした。

    検索で調べると8の倍数で区切った足りない分をNULLで埋めてるようですが、
    それだけではなく他にも何か原因がありそうです。

    今後、同じ人がいるかもしれませんので、使用したサンプルを残しておきます。

    #ここから:なでしこ
    KEYは「NADESIKO」
    PASは「PASSWORD」
    PASをSJIS_UTF8変換
    #-----------------------------------
    それをKEYでBLOWFISH暗号化
    それをBASE64エンコード
    それをコピー #結果:5RjoU1muylXS3ztOaHXSFQ==
    #ここまで:なでしこ


    以下は検索で探したPHPサンプルを切った貼ったした実験用サンプルです。

    #ここから:PHP
    require_once('Crypt/Blowfish.php');

    $encrypt_char = '5RjoU1muylXS3ztOaHXSFQ==';

    // 暗号化キー
    define('CBF_KEY','com.nadesi::NADESIKO:nadesiko:pKUkh9Dhgj8m5KZTbkv:');
    // 初期化ベクトル
    define('CBF_IV',pack('H*','56AC32358AD3A31F')); //★ 変更20130815:1A→1Fに変更
    // BASE64化
    $encrypted = base64_decode($encrypt_char);

    // 復号化
    $blowfish = Crypt_Blowfish::factory( 'cbc', CBF_KEY, CBF_IV );
    $decrypt_char = $blowfish->decrypt( $encrypted );

    // 結果表示
    echo '復号化した長さ: ' . strlen($encrypted) . "\n<br>"; //結果:16
    echo '復号化文字: '.$decrypt_char."\n<br>"; //結果:PASSRORD
    echo 'bin2hex: '.bin2hex( $decrypt_char )."\n<br>"; //結果:efbbbf50415353524f52440505050505
    echo "\n<br>";
    #ここまで:PHP


    解決していませんが、時間が無くひとまず解決としておきます。

    取り敢えず先が見えたような気がします。
    今回はPHPで実験しましたが、また時間がれば次はperlで挑戦してみたいと思います。
    ※レンタルサーバー内でのPHPの文字列処理の関係かもしれません。自信なし(笑

    感謝です。ありがとうございました。


    No6343に返信(もんぴんさんの記事)
    > こんにちは。
    >
    > Javaで試してみたところ、復元できました。
    > IVの値はうぇいくさんの仰る通りです。
    >
    >>「com.nadesi::{KEYをトリム}:nadesiko:pKUkh9Dhgj8m5KZTbkv:」と同等でしょうか?
    > 同じです。
    >
    >>あと、初期化ベクトルIVの22行は配列生成個数のところの「- 1」が分かりません。
    > 私もdelphiは書いた事が無いので知りませんが、Int64型の配列を初期値$1FA3D38A3532AC56で作成しているのではないでしょうか。(配列の長さは1)
    >
    > PHPでもmcryptで試してみましたが、下記サイトの通りmcryptはパディング方式を選ぶ事ができません。
    > そのため、復元すると元の文字列+αで戻ってきました。
    > paddingを自作するか、+αの1バイトを見て右端の削除文字数を判断すれば元の文字列になります。
    >
    > ↓異なる言語間での暗号化と復号
    > http://d.hatena.ne.jp/pasela/20100612/crypto

    変更20130815:
    もんびんさんから間違いを指摘していただき上記★行の1Aを1Fに変更しました。
    他の文章は直していませんが、結果表示は正しく表示され本当の解決となりました。
    http://nade.jp-pro.net/bbs/bbs/cbbs.cgi?mode=one&number=6346&type=6339&space=105&no=0

    *(2013/08/15(Thu) 17:12:44 編集[投稿者])
解決済み!
[ 親 6339 / □ Tree ] 返信 削除キー/
[ 親 6339 / □ Tree ] 返信

▲[ 6344 ] / ▼[ 6346 ]
/ 6階層)  Re[6]: 自分には無理なのかな
□投稿者/ もんぴん 【122.130.157.253】(2013/08/10(Sat) 23:55:14)

    こんばんは。

    解決済みになっていますが、一点だけ。

    > define('CBF_IV',pack('H*','56AC32358AD3A31A'));
    最後はFです。

    define('CBF_IV',pack('H*','56AC32358AD3A31F'));
[ 親 6339 / □ Tree ] 返信 削除キー/
[ 親 6339 / □ Tree ] 返信

▲[ 6345 ] / 返信無し
/ 7階層)  解決!
□投稿者/ のなお 【110.4.168.163】(2013/08/12(Mon) 20:25:26)

    こんばんは。

    最後のバイトを1Fにしたところ正常に復号化されました。
    丸写しではなく、ちゃんと自分で確認しないとだめですね。反省

    感謝です。ありがとうございました。


    No6345に返信(もんぴんさんの記事)
    > こんばんは。
    >
    > 解決済みになっていますが、一点だけ。
    >
    >>define('CBF_IV',pack('H*','56AC32358AD3A31A'));
    > 最後はFです。
    >
    > define('CBF_IV',pack('H*','56AC32358AD3A31F'));
解決済み!
[ 親 6339 / □ Tree ] 返信 削除キー/
[ 親 6339 / □ Tree ] 返信


Pass/

BBS CGI RSS CGI
Child Tree RSS/SPAM対応版