我正在尝试解密AES-ECB 128加密字符串。该字符串未使用Java加密,我将其作为Java输入接收,我想解密它。
我已使用AESLib在Arduino中加密消息“0123456789012345”
uint8_t key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
char data[] = "0123456789012345"; //16 chars == 16 bytes
aes128_enc_single(key, data);
加密形式的字符串为“1425EC9B5D983FF7DF45A4A8089E69FC”。
这就是我在java中用来解密它的原因:
private static byte[] key = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15};
public static String decrypt()
{
byte[] info= hexStrToByteArray("1425EC9B5D983FF7DF45A4A8089E69FC");
try
{
Cipher cipher = Cipher.getInstance("AES/ECB/NOPADDING");
final SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedResult= cipher.doFinal(info);
String result = new String(result, "UTF-8");
return result;
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}
private static byte[] hexStrToByteArray(String hex) {
ByteArrayOutputStream baos = new ByteArrayOutputStream(hex.length() / 2);
for (int i = 0; i < hex.length(); i += 2) {
String output = hex.substring(i, i + 2);
int decimal = Integer.parseInt(output, 16);
baos.write(decimal);
}
return baos.toByteArray();
}
我从这个函数得到的是:.1 @JY y ғv
我猜是编码问题。如何以可读的形式获得解密结果?
谢谢!
答案 0 :(得分:2)
您的密钥不正确。
在加密方面,你有:
uint8_t key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
在解密方面,你有:
private static byte[] key = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15};
0x12
与12
不同。您在文字中混淆了十六进制和十进制。在解密方面,你的意思是:
private static byte[] key = {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
或者:
private static byte[] key = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
顺便说一下你的原始数据是us-ascii而不是utf-8;在这里并没有真正有所作为,并且不是问题的一部分,但你应该在解密方面使用us-ascii也是安全的。