PEAR::Blowfishでエンコード - PHPプロ!Q&A掲示板

159

  • 0P

PEAR::Blowfishでエンコード

質問日時 / 2006年9月4日 17:31    回答数 / 6件

Questioner:  sumomo  このエントリーをはてなブックマークに追加 

キーワード / PEAR    BlowFish    文字   

暗号化でPEAR::Crypt_Blowfishを使ったのですが、エンコードされて返ってきた値を見ると文字化け(正しい返り値なんですが)しています。これをテキストに保存したり、クッキーに覚えこませたりしたいと思っています。文字を変換する簡単で便利な方法はないでしょうか?

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01galluがると申します。 blowfishに限らないのですが。通常
┃┗A01-1sumomoなるほど、base64_encodeを使えばきれいに収まりまし
┣A02uheuheCrypt_Blowfish はECBモードで暗号化されます。 そ
┃┗A02-1sumomoご回答ありがとうございます。Blowfisは使ってはいけ
┗A03galluがるです。uheuheさんの「Crypt_Blowfish はECBモード
 ┗A03-1sumomoとりあえず、暗号の基本的な部分から調べていきます。

回答一覧

並び替え:

A01 満足
answerergallu [9月4日 20:00]

がると申します。
blowfishに限らないのですが。通常、大抵の暗号化は、その戻り値がバイナリ(いわゆる「プリンタブル」な範囲に納まらないデータ)になります。
で。バイナリデータを「文字列」としてあつかうのであれば、BASE64というエンコード方式を用いると楽です。
PHPですと、base64_encode っていう関数もありますし。

あと、ちょいと気になった事を。
種々事情から、PEARを使っていないのではあるのですが。通常、こういったブロック暗号の場合、「ブロックモードの設定」が出来るはず、です。
モードは…多分CBCあたりの無難なところがデフォルトになっているとは思うのですが。
一応、気にされておくとよろしいかと思います。

以上、何かの参考にでもなれば幸いです。

この意見に回答する

ツリーへ TOPへ

A01-1
replyersumomo [9月6日 15:02]

なるほど、base64_encodeを使えばきれいに収まりましたm(_ _)m
ブロックモードについては勉強します。ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A02 満足
answereruheuhe [9月5日 23:15]

Crypt_Blowfish はECBモードで暗号化されます。

そのため、キーと暗号化する内容が同一の場合、暗号化した結果は同じ文字列となってしまうので注意が必要です。

もしそれが嫌であれば、Crypt_CBCを使用するか、mcryptモジュールの関数を使用する必要があると思います。

この意見に回答する

ツリーへ TOPへ

A02-1
replyersumomo [9月6日 15:05]

ご回答ありがとうございます。Blowfisは使ってはいけないっぽいですね。。何も知らずに使っているとセキュリティ上で危険であるということが良く分かりました。自分でもコードをもっと詳細に見て判断していきたいと思います。
パッケージ名まで教えていただきまして、ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A03 満足
answerergallu [9月6日 14:06]

がるです。uheuheさんの「Crypt_Blowfish はECBモードで暗号化されます。」を受けて…補足させてください。
# & フォロー本当にありがとうございます > uheuheさん

ECBモードは「最も楽な実装」ですが、同時に「原則として用いてはいけない」モードなので(苦笑
もし、PEAR::Crypt_Blowfishが「ECBモード以外不可」だとすると…お使いになられないことをお勧めいたします。

ちぃと以前に書いた文章があるので、一部引っ張ってきます。

1.1 ECB モード
エレクトリックコードブック
Electric Codebookの略。もっとも単純でもっとも脆弱なブロック暗号の
モード。
流れとしては以下の通り。
1. 平文からブロック長分を切り出す
2. 切り出した平文と鍵から暗号化する
この繰り返しである。なお、ブロック長が割り切れない(端数が出る) 場合、
パディング
paddingと呼ばれるダミーデータを入れる3。
ECB モードにおいて「別ブロックで同一内容が同一の暗号文となる」ため
に非常に解析が容易であるほかに、場合によっては「解読せずに暗号文の改
ざんが可能である」場合がある4。
したがって、大抵用意されているモードではあるが、絶対に使ってはいけ
ない。


1.2 CBCモード
サイファブロックチェイニング
Cipher Block Chainingの略。
1. 平文からブロック長分を切り出す
2. 一つ前の暗号文と平文をXOR する
3. 上述のXOR したデータと鍵で暗号化する
この繰り返しによって、EBC モードにあるような「同一の平文から同一の
暗号文が出力される」ことを回避する。
なお、1番目のブロックを暗号化する場合は当然ながら「一つ前の暗号文」
がない。そのために、
イニシャライゼーションベクタ
Initialization vector(初期化ベクトル)、略称でIV と呼
ばれる乱数を用いる5。
CBC モードの問題点の一つは「暗号化においては並列処理ができない」こ
とである6 。したがって性能が求められる場合に問題になる場合がある。
また「1 bit の欠落によって以降の全てのブロック処理に影響が出る」の
も、通信環境が悪い場合には憂慮すべき問題点となる場合がある。
ただ、通常はCBC モードがもっとも一般的に用いられていると考えてよい。


1.5 CTRモード
カウンタ
CounTeRの略。カウンタ値を暗号化してその値を鍵ストリームとして用い
ることで暗号化を行う。
1. カウンタ値をインクリメント、暗号化する
2. 平文からブロック長分を切り出す
3. 切り出した平文と1番で暗号化した文字列をXOR して、これを暗号文
とする
なお、1ブロック目の暗号に用いるカウンタ値は、ブロック長の上位半分
を乱数9、下位半分を0とする「初期値」を毎回生成する。
CFB、OFB と似たような構造を持つ「ストリーム的な暗号化」ではあるが
10、CTR モードは「任意のブロックごとに処理ができる」という性質がある
ために、暗号復号ともに、全体を並列に処理することが可能である。
そのために、性能が求められるシーンにおいてはCTR モードが用いられ
ることがある。

この意見に回答する

ツリーへ TOPへ

A03-1
replyersumomo [9月6日 15:07]

とりあえず、暗号の基本的な部分から調べていきます。初心者の私にはまだまだ不明な単語が多いですね。
というか、こういうことをきちんと知っていないと危ないですね。ありがとうございました。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)