0

過去 3 日間解決しようとしてきた問題があります。特定の結果を得るには、DES を使用してバイト配列を暗号化する必要があります。ただし、Java での DES のデフォルトの実装 (Javax.crypto.cipher、JDK 7、プロバイダ SunJCE バージョン 1.7) は機能しないようです。次のコードがある場合:


    private void testDES() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
        Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
        byte[] keyByte = convertStringToBytes("00 00 00 00 00 00 00 00");
        byte[] data = convertStringToBytes("00 00 00 00 00 00 00 00");
        Key key = new SecretKeySpec(keyByte, "DES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        System.out.println(hexadecimalString(cipher.doFinal(data)));
    }

正しい結果 8C A6 4D E9 C1 B1 23 A7 の代わりに F4 DA 4D 97 BF CF 23 D9 を出力します (テスト ベクトルによると: http://common-lisp.net/project/clbuild/mirror/ironclad/test- vector/des.testvec ) メソッド hexadecimalString および convertStringToBytes は、バイトを 16 進数に、またはその逆に変換するだけです。誰でも私を助けてもらえますか?かなり長い間検索した後、どうすればよいかわかりません。前もって感謝します。ジョー

4

1 に答える 1

1

問題は convertStringToBytes または hexadecimalString のいずれかにあると思います。

以下を置き換えることができます。

byte[] keyByte = convertStringToBytes("00 00 00 00 00 00 00 00");
byte[] data = convertStringToBytes("00 00 00 00 00 00 00 00");

と:

byte[] keyByte = new byte[8];
byte[] data = new byte[8];

... Java では、配列はゼロに初期化されるためです。

上記と同じコードを実行すると (convertStringToBytes ではなく)、期待される結果 (8C A6 ...) が得られます。

編集: まだ問題があるので、ここに完全なプログラムがあります。私の出力は次のとおりです。

8c a6 4d e9 c1 b1 23 a7 

以下のコード:

public class Main {
    public static void main(String[] args) throws GeneralSecurityException {
        Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
        byte[] keyByte = new byte[8];
        byte[] data = new byte[8];
        Key key = new SecretKeySpec(keyByte, "DES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] result = cipher.doFinal(data);
        StringBuilder str = new StringBuilder();
        for (byte b : result) {
             str.append(Integer.toHexString(0xff & b)).append(' ');
        }
        System.out.println(str);
    }
}
于 2012-11-01T10:57:22.217 に答える