2017-04-11 69 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

哦,我..谢谢..兄弟托管打印预期输出已经..多谢指导。所以它是处理返回的数据错误的方法.. –