【发布时间】:2017-04-11 04:05:46
【问题描述】:
尝试在 Java 中解密十六进制字符串时,我能够解密该字符串,但因为被加密的原始数据不是字符串,而是实际上是 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 的�,这会在转换为整数时给我错误的值。
我想知道而不是将其解密为字符串,我是否能够直接将十六进制字符串解密为十六进制字符串,而不是解密为字符串并转换为 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));
【问题讨论】:
-
加密的输出是任意字节,不是有效的可打印字符。
标签: java encryption cryptography aes