電子書籍の厳選無料作品が豊富!

またお世話になりますm( __ __ )m
PEAR の BlowFish を用いての暗号化、復号化についての質問です。

例えば、"hello" という文字列を暗号化します。

そして、

$_str = $_blowfish->decrypt($_crypt_str);

と復号した時に、
取得した文字列 $_str は 8byte に満たない部分が \0 で埋まってきます。すなわち "hello\0\0\0" となります。
ちなみに "hello_World" を暗号化して復号すると "hello_World\0\0\0\0\0" となります。

私が調べた限りでは、8byte で割り算した余りの部分が \0 で埋められてくるという仕様?なのかバグなのからしいです。

とりあえずそのままでは使い物にならないので、

$_trim_str = rtrim($_str);

として、一応期待通りの動きをしていますが、こういう安易な使い方でよろしいのでしょうか?
そもそも復号文字列が 8 byte 余り部分を \0 で埋めてくるなどと言うのは私の使い方が間違っているかと疑わざるをえません。

どなたかご存知の方いましたらこの辺のモヤモヤをスッキリさせていただけませんでしょうか?

ちなみに暗号化モードは CBC で、初期化ベクトルは 8 byte です。

A 回答 (2件)

http://blog.livedoor.jp/katz_stlips/archives/514 …
の真ん中より下の方に

>で、ここで注意しなきゃいけないのは、
>暗号化する文字列は8の倍数桁じゃないとダメってトコ。

>つまり、6文字の場合は+2バイト、12文字の場合は+4バイト分
>パディング(文字埋め)してあげないといかんのです。

とあります。
また、こちらはPerlのBlofishの説明ですが、
http://perldoc.jp/docs/modules/Crypt-Blowfish-2. …
「注意」に
>8バイトよりも多く暗号化しないのであれば、あなたのデータは 正確に長さ8バイトでなければなりません。必要であれば独自にパディングしてください。

とあります。
なので正常な動作のようです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

ご提示の2つのURL見させていただきました。
GoodGoodGood!です。

納得できました。

お礼日時:2009/09/24 20:22

>ちなみに暗号化モードは CBC で、初期化ベクトルは 8 byte です。



省略せずに、コードを示されてはいかがでしょう?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!