2013-03-02 64 views
1
String plain1= "Test"; 
byte[] cipher = SplashSecure.getInstance().encrypt2(plain1); 
String plain2 = SplashSecure.getInstance().decrypt2(cipher); 

平原=測試相同的純文本加密和解密犯規給使用AES/ECB/NoPadding

解密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)和android使用的VC++應用程序http://www.cs.ucdavis.edu/~rogaway/ocb/ocb-java/Rijndael.java Windows客戶端已加密數據並將其存儲在服務器上。我需要爲Android構建一個客戶端,以獲取加密數據,解密並顯示給用戶。

我確定即時通訊使用正確的密鑰解密。

+0

發佈'Utils.padString()'代碼也很有用 – iTech 2013-03-02 04:50:19

+0

什麼是'plainText2'? – 2013-03-02 04:56:18

+0

它用於測試加密..我檢查plaintext2等於明文。以確保加密工作正常.. – Ronnie 2013-03-02 05:01:18

回答

2

AES的塊大小爲128位(即16字節)。它可以只有以這種大小的塊處理數據,所以即使您已經告訴它使用NoPadding它也無法遵守。

這裏發生的最可能的事情是您正在使用的AES實現內部填充您的四個字節的輸入高達16字節並加密結果。當你解密時,你會得到相同的16個字節,即'T','e','s','t'和12個垃圾字節。

您看到的輸出支持:「測試」,後跟24個?符號。我不知道爲什麼它會爲每個垃圾字節打印兩個?符號,但我猜測這是解釋unicode中的垃圾字節的問題。你可以通過打印出解密後的blob的原始字節值來看到發生了什麼。

簡短的回答是'NoPadding'對於分組密碼沒有意義(或者,如果你打算使用NoPadding,那麼你必須自己填充和取消鍵盤事物)。

+0

我猜,沒有填充表示開發人員會照顧填充。我用null('\ 0')字符填充數據。同時解密我的責任,刪除額外的自定義填充。我通過識別空字符的第一個索引並返回前面的子字符串作爲明文來解決這個問題。 – Ronnie 2013-03-02 19:10:15

+0

我的應用程序必須與傳統應用程序一起工作,所以我不能使用其他內置填充選項。 C++遺留應用程序使用'\ 0'來填充。 – Ronnie 2013-03-02 19:13:01