当尝试在Java中解密Hex字符串时,我能够解密字符串,但因为加密的原始数据不是String,而是实际的32位十六进制值。
加密的十六进制字符串是“4ba3442d4bc3baf5126b7b271b359e42”,此处使用的密钥是“ac00ac00ac00ac00ac00ac00ac00ac00”
我应该从 aes.online-domain-tools.com 中获取的输出是“×z X.b 3ý。ägíýbÞ。” 但是从这个字符串可以看出,只有zXb3gb是普通的ASCII字符而其他字符是扩展字符,它们在控制台中变成了一个带有 65533 的int值的 反过来我的原始数据不正确。
但如果我们看到来自 aes.online-domain-tools.com 的输出,则扩展ASCII字符的ASCII值是原始数据的正确值但是因为它不是普通的ASCII字符而是扩展字符,它变成了一个值 65533 的 ,它会在输入整数时给出错误的值。
我想知道而不是将其解密为String,我能够将十六进制字符串直接解密为十六进制字符串而不是解密为字符串并转换为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 :(得分:1)
你的解密本身似乎很好......但你对返回数据的处理不是......
doFinal返回一个字节数组
通过将其传递给新的String(...)
来处理它您可能想要的是将该bytearray编码为十六进制数字字符串
看看这里...... How to convert a byte array to a hex string in Java?