若干釣り気味のタイトルですが、Crypt::CBCの2.15がインストールされたサーバで
my $cipher = Crypt::CBC->new({ key => 'foo', cipher => 'Blowfish' });
warn $cipher->encrypt_hex( 'bar' );

とすると「53616c7465645f5fcf0eb6374be3c083823b5e4bd39192b0」などと暗号化されます。
で、これをdecrypt_hexすると、
my $cipher = Crypt::CBC->new({ key => 'foo', cipher => 'Blowfish' });
warn $cipher->decrypt_hex( '53616c7465645f5fcf0eb6374be3c083823b5e4bd39192b0' );

ちゃんと「bar」と復号化できます。あたりまえです。
ここで、同様にdecrypt_hexしたあとに、encrypt_hexするとどうなるでしょう。
my $cipher = Crypt::CBC->new({ key => 'foo', cipher => 'Blowfish' });
warn $cipher->decrypt_hex( '53616c7465645f5fcf0eb6374be3c083823b5e4bd39192b0' );
warn $cipher->encrypt_hex( 'bar' );

こうすると最初のwarnで「bar」が、次のwarnで「53616c7465645f5fcf0eb6374be3c083823b5e4bd39192b0」が出力されます。
最初に暗号化したときと同じように暗号化されてるようですね。何回やっても同じ値が返されます。

次に2.17がインストールされたサーバだとどうでしょう。
my $cipher = Crypt::CBC->new({ key => 'foo', cipher => 'Blowfish' });
warn $cipher->encrypt_hex( 'bar' );

こうすると「53616c7465645f5f241223b0d5e71b627c0d3cb07ffa6b88」と出力されます。1回目と値が違いますが、それは暗号に使う初期ベクトルを指定していないのでランダムに初期ベクトルが選択されるためです。

ここで以下のようにします。
my $cipher = Crypt::CBC->new({ key => 'foo', cipher => 'Blowfish' });
warn $cipher->decrypt_hex( '53616c7465645f5f241223b0d5e71b627c0d3cb07ffa6b88' );
warn $cipher->encrypt_hex( 'bar' );

1つ目のwarnは、2.15のときと同様に「bar」と表示されますが、2つ目のwarnでは「53616c7465645f5f31d2160e14111260cb2ed17d0cafde98」とまったく違う値が表示されるではありませんか。何回も実行すると毎回その都度違う値が出力されます。(もちろんdecrypt_hexしたらちゃんと「bar」になる値です)

なんでかなーと思ってChangesを見てみたら、
-The salt, iv and key are now reset before each complete encryption cycle. This avoids inadvertent reuse of the same salt.

と書いてありました。このsaltとivとkeyを毎回リセットするようになったのが原因じゃないかなと思っています。

で、バージョンが違っても同じように暗号化/復号化ができるようにするにはどうしたらいいかと言うと、
my $cipher = Crypt::CBC->new({
    key => "foo",
    cipher => "Blowfish",
    iv => "12345678",
    prepend_iv => 0,
});
warn $cipher->encrypt_hex("mdl12345678");

このように iv(8バイトの文字列) を固定で指定してやって、prepend_iv を false にしてやるとバージョンが違っても同じように暗号化/復号化ができるようです。しかも、iv と prepend_iv を指定してやったときよりも暗号化後の文字列が短い。(セキュリティの強度的には弱くなってるんじゃないかと思いますが…)

ということで、もし2.15でこのように値が同じようなものを期待してプログラミングされたプログラムのあるサーバのCrypt::CBCを2.17にバージョンアップすると、いきなり意味不明のバグが起り得るというわけです。

かなりBK臭がしますが覚え書きとして書いておきます。暗号化系のものはなにかと難しいですね…。

以下は今回参考にさせて頂いたサイトです。
Crypt::CBCの暗号化ブロック連鎖モード