0

ECB モードで DES アルゴリズムを使用して文字列を暗号化する BlackBerry JDE 5.0.0 で開発されたアプリケーションがあります。暗号化後、結果は base64 エンコーディングでエンコードされます。しかし、暗号化方法から得た結果とオンライン暗号化エンジンで得た結果を比較すると、最後の数文字で常に異なる結果が得られます。オンライン エンクリプター エンジンを使用して暗号化メソッドから取得した結果を復号化しようとしましたが、結果が有効ではないようです。では、最後のいくつかの文字でその異なる結果を修正するにはどうすればよいですか?

ここに私の暗号化方法コード:

public String encryptDESECB(String text) throws MessageTooLongException
{
    byte[] input = text.getBytes();
    byte[] output = new byte[8];
    byte[] uid = null;
    uid = "431654625bd37673e3b00359676154074a04666a".getBytes();
    DESKey key = new DESKey(uid);
    try {
            DESEncryptorEngine engine = new DESEncryptorEngine(key);
            engine.encrypt(input, 0, output, 0);
            String x= BasicAuth.encode(new String(output));
            System.out.println("AFTER ENCODE"+x);
            return new String(x);
    } catch (CryptoTokenException e) {
        return "NULL";
    } catch (CryptoUnsupportedOperationException e) {
        return "NULL";
    }
}

暗号化したい文字列は "00123456" です。暗号化方法から取得した結果は次のとおりです。YnF2BWFV/8w= オンライン暗号化エンジンから取得した結果 ( http://www.tools4noobs.com/online_tools/encrypt/ ) : YnF2BWFV9sw= Android から取得した結果 (同じ暗号化アルゴリズムとメソッドを使用): YnF2BWFV9sw=

Android のコードは次のとおりです。

public static String encryptDesECB(String data) {
    try {
        DESKeySpec keySpec = newDESKeySpec("431654625bd37673e3b00359676154074a04666a".getBytes("UTF8"));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey key = keyFactory.generateSecret(keySpec);

        // ENCODE plainTextPassword String
        byte[] cleartext = data.getBytes("UTF8");

        Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, key);

        Logger.log(Log.INFO, new String(cipher.doFinal(cleartext)));

        String encrypedPwd = Base64.encodeToString(cipher.doFinal(cleartext), Base64.DEFAULT);

        Logger.log(Log.INFO, encrypedPwd);

        return encrypedPwd;

    } catch (Exception e) {
        Logger.log(e);
        return null;
    }
}

誰でもこれで私を助けることができますか?

4

2 に答える 2

0

DES は 8 バイト ブロックで動作するため、これはパディングが原因である可能性が最も高いです。

詳細については、次のリンクをご覧ください。

http://www.tero.co.uk/des/explain.php#パディング

コンテンツを適切に復号化できる限り、問題ありません。

于 2013-07-08T10:59:20.277 に答える
0

私は自分の間違いを見つけました。私の BasicAuth クラスは、暗号化された文字列をエンコードするための正しいクラスではないことがわかりました。現在、エンコーディングに正しい Base64 クラスを使用していますが、うまくいきました。

于 2013-07-09T04:50:17.220 に答える