2017-04-11 109 views
0

當試圖解密Java中的Hex字符串時,我能夠解密字符串,但是因爲原始數據被加密不是字符串,而是實際的32位十六進制值。Java AES解密獲取Decrypted Hex而不是解密字符串

加密的十六進制字符串是「4ba3442d4bc3baf5126b7b271b359e42」,這裏使用的密鑰是「ac00ac00ac00ac00ac00ac00ac00ac00」

其即時通訊應該得到的輸出aes.online-domain-tools.com作爲檢索 is 「×z X。b 3。g gíbÞ。」但從該字符串中可以看出,只有zXb3gb是正常的ASCII字符,而其他字符是擴展字符,它們在控制檯中成爲一個which,其中包含一個int值,這反過來對我的原始數據不正確數據。

但是如果我們看到aes.online-domain-tools.com輸出,擴展ASCII字符的ASCII值的的原始數據的正確的價值觀,而是因爲它是不正常的ASCII字符但是一個擴展字符,它將變成一個值爲這將給我錯誤的值,同時被轉換爲整數。

我想知道而不是將它解密爲字符串,我可以直接將十六進制字符串解密爲十六進制字符串,而不是解密爲字符串並將其轉換爲int。

目前,這是我的解密代碼:

public static String decrypt(String strToDecrypt) 
{ 
    char[] ch=strToDecrypt.toCharArray(); 

    System.out.println("Test: " + ch); 
    try 
    { 

     Cipher cipher2 = Cipher.getInstance("AES/ECB/NoPadding"); 

     cipher2.init(Cipher.DECRYPT_MODE, secretKey); 

     setDecryptedString(new String(cipher2.doFinal(Hex.decodeHex(ch))));   // Output as String eg: testingone 


    } 
    catch (Exception e) 
    { 

     System.out.println("Error while decrypting: "+e.toString()); 
    } 
    return null; 
} 

這是代碼塊我使用它轉換爲INT檢索原始值:

 System.out.println("String To Decrypt : " + strToDecrypt); 

    final String decryptedString = getDecryptedString(); 
    char[] asciiLine = decryptedString.toCharArray(); 

    for (char ch:asciiLine) 
    { 
     System.out.println("Decrypted : " + (int)ch+" "); 
    } 

    System.out.println("TestDecrypted : " + test.getDecryptedString()); 
    System.out.println("StringDecrypted : " + decryptedString); 
    System.out.println("DecodeDecrypted : " + Integer.decode(decryptedString)); 
+0

加密的輸出是任意字節,無效的可打印字符。 –

+0

可能的重複[如何在Java中將字節數組轉換爲十六進制字符串?](http://stackoverflow.com/questions/9655181/how-to-convert-a-byte-array-to-a-hex-字符串中的Java) –

回答

1

您解密本身似乎只是罰款...但你的處理返回的數據不是...

doFinal返回一個字節數組

你要處理,通過它傳遞給新的String(...)

你可能想要的是該字節組編碼爲一個十六進制數字串

這裏看看...... How to convert a byte array to a hex string in Java?

+0

哦,我..謝謝..兄弟託管打印預期輸出已經..多謝指導。所以它是處理返回的數據錯誤的方法.. –