0

文字列を暗号化する関数があります:

BASE64Decoder decoder = new BASE64Decoder();
BASE64Encoder encoder = new BASE64Encoder();

public String encryptValueWithBlowfish(String data, String secretKey) {

    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    try {
        SecretKeySpec key = new SecretKeySpec(decoder.decodeBuffer(secretKey), "Blowfish");
        Cipher cipher = Cipher.getInstance("Blowfish/CBC/NoPadding", "BC");
        String iv = "\0\0\0\0\0\0\0\0";
        IvParameterSpec ivs = new IvParameterSpec(iv.getBytes());
        cipher.init(Cipher.ENCRYPT_MODE, key, ivs);
        MessageDigest sha = MessageDigest.getInstance("SHA-1");
        return encoder.encode(sha.digest(cipher.doFinal(decoder.decodeBuffer(data))));
    } catch (Exception e) {
        lg.info("Failed to encryptValueWithBlowfish: " + e.getMessage());
        return "";
    }
}

ラインcipher.init(Cipher.ENCRYPT_MODE, key, ivs);ライズ例外 "Unsupported keysize or algorithm parameters"。このコードは、別のLinuxマシンで正常に分岐します。どちらの場合も渡されるパラメーターは同じです。私は暗号通貨に強いわけではありません。何が悪いのでしょうか?

4

1 に答える 1

1

何が悪いのでしょうか?

さて、ここではデフォルトの文字エンコーディングを使用しています:iv.getBytes()-それは決して良いスタートではありません。おそらく、2つの異なるマシンのデフォルトのエンコーディングは異なります。

すべてゼロで特定のサイズのバイト配列を作成する場合は、次を使用しないでください。

IvParameterSpec ivs = new IvParameterSpec(new byte[8]);

または、16バイトのIVが必要な場合は、16を使用します。

ここに何があるかは明確ではありませんがdecoder、デフォルトの文字エンコードを使用している場合は、マシンによって異なる可能性があるため、何度も使用します。

于 2013-03-19T11:03:44.033 に答える