0

Blowfish を使用して単純なパスワード ストアを実装しています。いくつかの異なるパスワード/キーの組み合わせを試して、復号化された値がまだゴミである多くのインスタンスに遭遇するまで、すべて問題ありませんでした。

以下は、問題を示すスタンドアロン クラスです。次の出力が得られます。

'Aaaaaaa7' encrypted: 'r?—èLèdÓ,·Ã¸ÍÒ'*
'Aaaaaaa7' decrypted: 'ñü=€¼(T'*

常に正しく復号化されることを保証するために何をする必要があるかについての考え。

(JDK 1.6.0_26 で jce.jar を使用)

ありがとう、

デビッド

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class BlowfishTwoWayHashImpl {

    static {
        test();
    }

    public static void test() {
        String key = "wibble";

        String passwordToEnrypt = "Aaaaaaa7";

        String enc = BlowfishTwoWayHashImpl.encryptBlowfish(passwordToEnrypt, key);
        System.out.println("'" + passwordToEnrypt + "' encrypted: '" + enc + "'");

        String dec = BlowfishTwoWayHashImpl.decryptBlowfish(enc, key);
        System.out.println("'" + passwordToEnrypt + "' decrypted: '" + dec + "'");
    }


    private static final String CIPHER_NAME = "Blowfish";

    public static String encryptBlowfish(String toEncrypt, String key) {
        return processString(toEncrypt, key, Cipher.ENCRYPT_MODE);
    }

    public static String decryptBlowfish(String toDecrypt, String key) {
        return processString(toDecrypt, key, Cipher.DECRYPT_MODE);
    }

    private static String processString(String toEncrypt, String key, int encryptDecryptMode) {

        SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), CIPHER_NAME);

        Cipher cipher;
        try {
            cipher = Cipher.getInstance(CIPHER_NAME);
            cipher.init(encryptDecryptMode, secretKeySpec);
            return new String(cipher.doFinal(toEncrypt.getBytes()));
        }
        catch (Exception e) {
            throw new RuntimeException(e.toString());
        }
    }

}
4

1 に答える 1

4

これを行わないでください:

return new String(cipher.doFinal(toEncrypt.getBytes()));

コード内のいたるところにプラットフォームのデフォルトエンコーディングを使用しています。これをしないでください。データが失われます。

本物のテキストをバイトに変換する場合(暗号化など)は、特定の文字セットを使用します-UTF-8が適切な選択です。同じ文字セットを使用して、「エンコードされたテキスト」からにデコードしますString

任意のバイナリデータをテキストに変換する場合は、base64エンコーディングを使用します。たとえば、このパブリックドメインのBase64エンコーディングライブラリを使用します。

String(byte[])基本的に、またはコンストラクターを使用して新しい文字列を作成するString(byte[], String)と、「これは本物のテキストデータです。文字列としてデコードしてください」と言います。データが実際に暗号化の結果である場合、それはテキストデータではありません...それは任意のバイトの束です。

于 2012-03-12T13:44:26.223 に答える