2016-09-27 95 views
1

我試圖解密AES-ECB 128加密字符串。該字符串沒有用Java加密,我接收它作爲Java輸入,我想解密它。在Java中執行AES解密時出現奇怪字符

我已經與AESLib

uint8_t key[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; 
    char data[] = ""; //16 chars == 16 bytes 
    aes128_enc_single(key, data); 

加密的消息 「」 中的Arduino以加密的形式的字符串是 「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 @JYyғv

我猜是編碼的問題。我怎樣才能以可讀的形式得到解密的結果?

謝謝!

+2

你可以發佈a)密鑰(假設它是一個非敏感的測試密鑰),b)你的'hexStrToByteArray'函數,和c)有關它如何加密的一些細節? –

+1

如果解密爲亂碼,則密鑰或數據不正確或至少錯誤地應用於解密功能。 – zaph

+0

對不起,我在主要信息中添加了更多信息 – Khuzrly

回答

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來保證安全。