在Java中执行AES解密时,我会遇到奇怪的字符

时间:2016-09-27 20:27:03

标签: java encryption aes

我正在尝试解密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

我猜是编码问题。如何以可读的形式获得解密结果?

谢谢!

1 个答案:

答案 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};

0x1212不同。您在文字中混淆了十六进制和十进制。在解密方面,你的意思是:

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也是安全的。