1
String plain1= "Test";
byte[] cipher = SplashSecure.getInstance().encrypt2(plain1);
String plain2 = SplashSecure.getInstance().decrypt2(cipher);

プレーン = テスト������������������������

復号化後plainText2は と等しくなるはずplaintextです。しかし、そうではありません。

メソッドの暗号化/復号化。

 public void initKey(String key) {
    String paddedKey = Utils.padString(key);
    mKeyspec = new SecretKeySpec(Utils.getBytes(paddedKey), "AES/ECB/NoPadding");
                   // Utils.getBytes returns "paddedKey.getBytes("CP1252")"
 }

public byte[] encrypt2(String data) {
    try {
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, mKeyspec);
        String paddedData = Utils.padString(data);
        return cipher.doFinal(Utils.getBytes(paddedData));

    } catch(InvalidKeyException e) {
        e.printStackTrace();
    // Series of catch blocks
    }
    return null;
}

public String decrypt2(byte[] cypherText) {
    try {
        Cipher cipher = Cipher.getInstance("AES/ECB/NoPadding");
        cipher.init(Cipher.DECRYPT_MODE, mKeyspec);
        byte[] plainTextBytes = cipher.doFinal(cypherText);
        return Utils.getString(plainTextBytes);
        // Utils.getString returns "new String(bytes, "CP1252");"
    } catch(InvalidKeyException e) {
        // Series of catch blocks.
    } 
    return null;
}

編集

public static String padString(String source) {
    char paddingChar = '\0';
    int size = 16;
    int padLength = size - source.length() % size;

    for (int i = 0; i < padLength; i++) {
        source += paddingChar;
    }

    return source;
}

編集

Windows(暗号化する他のクライアントとサーバー)とAndroidで暗号化と復号化を機能させようとしています。Windows クライアントは、Rijndael クラス ( http://svn.openfoundry.org/pcman/2007.06.03/Lite/Rijndael.h ) を使用する VC++ アプリであり、Android はhttp://www.cs.ucdavis.edu/を使用します。 ~rogaway/ocb/ocb-java/Rijndael.java . Windows クライアントはデータを暗号化し、サーバーに保存しました。暗号化されたデータを取得し、復号化してユーザーに表示する Android 用のクライアントを構築する必要があります。

復号化に正しいキーを使用していると確信しています。

4

1 に答える 1

2

AES のブロック サイズは 128 ビット (つまり 16 バイト) です。このサイズのブロック単位でしかデータを処理できないため、使用するように指示してもNoPadding対応できません。

ここで発生している可能性が最も高いのは、使用している AES 実装が、入力の 4 バイトを最大 16 バイトに内部的にパディングし、結果を暗号化していることです。復号化すると、同じ 16 バイト、つまり「T」、「e」、「s」、「t」、および 12 ガベージ バイトが返されます。

表示される出力はこれをサポートしています: "Test" の後に 24?個のシンボルが続きます。?ガベージ バイトごとに2 つのシンボルを出力する理由はわかりませんが、ガベージ バイトを Unicode で解釈することに関係していると思います。復号化された BLOB の未加工のバイト値を出力することで、何が起こっているかを確認できます。

簡単に言えば、「NoPadding」はブロック暗号には意味がないということです (または、NoPadding を使用する場合は、自分でパディングとアンパディングを行う必要があります)。

于 2013-03-02T18:30:15.350 に答える