1

String を復号化する Perl コードがあり、Java でも同じことをしたいと考えています。これはPerlコードです:

my $c = Crypt::CBC->new( -key => $keyString, -cipher => 'Blowfish', -header => 'randomiv');
return $c->decrypt_hex($config->{encrypted_password})

これはJavaコードでの私の試みです:

Cipher cipher = Cipher.getInstance("Blowfish/CBC/PKCS5Padding");

// setup an IV (initialization vector) that should be
// randomly generated for each input that's encrypted
byte[] iv = new byte[cipher.getBlockSize()];
new SecureRandom().nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);

// decrypt
SecretKey secretKey = new SecretKeySpec(Base64.decodeBase64(keyString), "Blowfish");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
byte[] decrypted = cipher.doFinal(Base64.decodeBase64(input));
return Hex.encodeHexString(decrypted);

私は得ています:javax.crypto.BadPaddingException: Given final block not properly padded。しかし、これによると、Crypt CBCライブラリはPKCS5デフォルトのパディングとして使用します。

また、最後に16進エンコードを行っていますか?

4

2 に答える 2

1

問題の 1 つは、暗号化に使用される IV をインポートする代わりに、ランダムな IV を生成することです。暗号化で使用される IV にアクセスできますか? 暗号文の先頭にあるのでしょうか?

于 2013-01-28T23:07:14.330 に答える
0

私は Perl を使用していないので、私の回答が有効かどうかはよくわかりません。Base64 は、探している適切なデコードではない可能性があります。

SecretKeySpec を作成するには、次のようにしてみてください。

SecretKey secretKey = new SecretKeySpec(keyString.getBytes("ASCII"), "Blowfish");

テキストをデコードするには、 http: //commons.apache.org/codec/apidocs/org/apache/commons/codec/binary/Hex.html にある Hex.decodeHex(char[]) を確認してください...したがって、コードは次のようになります。

byte[] decrypted = cipher.doFinal(Hex.decodeHex(input.toCharArray()));

String unencryptedStuff = new String(decrypted);
于 2013-01-28T23:12:26.737 に答える