1

Java の Triple Des Algorithm 実装をインターネットで検索しました。

私は多くの解決策を見つけて、そのうちの1つを選択しました(私にとってより良いドキュメントがあるもの)。私はテストし、正常に動作します。

次に、Java 用の AES アルゴリズムの実装を探しました。そして良いものを見つけました。Triple Des Algorithm の実装と非常に似ていますが、まったく同じではありません。

AES Algorithm 実装を使用し、Cipher インスタンス パラメータを「AES」から「DESede」に変更すると、何が追加されるのでしょうか。私は変更を加え、コードをテストし、問題なく動作しました。しかし、返された文字列は、以前の Triple Des Algorithm 実装で返された文字列とは異なります。

タイトルが言うように、Triple Des Algorithm 実装の正しいバージョンを使用しているかどうかはどうすればわかりますか?

これは最初の実装です:

public String encrypt(SecretKey key, String stringIn){

    String outString = "";      

    if (stringIn.isEmpty() || stringIn.toUpperCase().equals("NULL")){
        return "";
    }

    try {   

        if (key == null)
            key = this.key;


        InputStream in = new ByteArrayInputStream(stringIn.getBytes("UTF-8"));

        ByteArrayOutputStream out = new ByteArrayOutputStream();

        // Create and initialize the encryption engine
        Cipher cipher = Cipher.getInstance("DESede");
        cipher.init(Cipher.ENCRYPT_MODE, key);

        // Create a special output stream to do the work for us
        CipherOutputStream cos = new CipherOutputStream(out, cipher);

        // Read from the input and write to the encrypting output stream
        byte[] buffer = new byte[2048];

        int bytesRead;

        while ((bytesRead = in.read(buffer)) != -1) {
            cos.write(buffer, 0, bytesRead);
        }

        cos.close();

        // For extra security, don't leave any plaintext hanging around memory.
        java.util.Arrays.fill(buffer, (byte) 0);

        outString = out.toString();

    } catch (UnsupportedEncodingException e) {

        e.printStackTrace();

    } catch (NoSuchAlgorithmException e) {

        e.printStackTrace();

    } catch (NoSuchPaddingException e) {

        e.printStackTrace();

    } catch (InvalidKeyException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        return outString;
    }

}

これは2番目のものです:

public String encrypt(SecretKey key, String stringIn){

    String outString = "";      

    if (stringIn.isEmpty() || stringIn.toUpperCase().equals("NULL")){
        return "";
    }


    try {   

        if (key == null)
            key = this.key;

        Cipher ecipher = Cipher.getInstance("DESede");

        ecipher.init(Cipher.ENCRYPT_MODE, key);

        byte[] bytes = stringIn.getBytes("UTF8");

        byte[] encVal = ecipher.doFinal(bytes);

        outString = new sun.misc.BASE64Encoder().encode(encVal);

    } catch (UnsupportedEncodingException e) {

        e.printStackTrace();

    } catch (NoSuchAlgorithmException e) {

        e.printStackTrace();

    } catch (NoSuchPaddingException e) {

        e.printStackTrace();

    } catch (InvalidKeyException e) {

        e.printStackTrace();

    } catch (IOException e) {

        e.printStackTrace();

    } finally {

        return outString;
    }

}

これはテストケースです:

    String In: 6985475896580019
    String Returned when I Encripted with First code: Kœ¼i …€‡ä«‘]<žéù âpU
    String Returned when I Encripted with Second code: w1ujopasjH6ccFKgUtOgansFNBtxbWe8YwDhso2pZN8=

私の下手な英語でごめんなさい。

ご協力いただきありがとうございます

4

1 に答える 1

0

cipher.init(mode,key)ランダムなIVを生成します。これは実際にそれを使用する最も安全な方法です。これを使用.getIV()して、暗号化されたテキストで返す必要があります(これも自動です。Javaは、暗号化ストリームの最初の数バイトにそれを追加します。これにより、復号化がOKになります)。異なるIVは、異なるキーと同じように結果を変更しますが、秘密にする必要はありません。同じものが同じように暗号化されないようにするだけです。

アルゴリズムを比較するため、または含まれていない既知のアルゴリズムで復号化するためにIVを強制するには、次を使用します。cipher.init(mode,key,new IvParameterSpec(iv))

于 2012-10-23T00:44:43.180 に答える