2017-07-27 87 views
-2

我尝试解码十六进制编码结果但不成功 字符串本码编码:9041 解码后的字符串[B @ 1f2be27 请帮我。用java解码十六进制

public static void main(String[] args) throws Exception { 

    String text = "FEBA4C2EDD47FD32"; 
    String encode = encryptData("9041","747062616e6b6570696e6e6577696e746567726174696f6e",168,true); 
    String result = decryptData("FEBA4C2EDD47FD32", "747062616e6b6570696e6e6577696e746567726174696f6e", 168, false); 
    System.out.println(encode); 
    System.out.println(result); // this is a byte array, you'll just see a reference to an array 

} 

// endcode功能 公共静态字符串encryptData(字符串明文,String键,整数密钥大小,布尔paddingEnable) 抛出异常{ 字节[] clearData = plainText.getBytes(); return encryptData(clearData,key,keySize,paddingEnable); }

public static String encryptData(byte[] clearData, String key, int keySize, boolean paddingEnable) 
     throws Exception { 
    byte[] keyBytes = getEncryptionKey(key, keySize); 
    SecretKey secretKey = new SecretKeySpec(keyBytes, "DESede"); 
    String algo = "DESede/ECB/pkcs5padding"; 
    Cipher cipher = Cipher.getInstance(algo); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
    byte[] cipherText = cipher.doFinal(clearData); 
     System.out.println(clearData.toString()); 
    return String.valueOf(Hex.encodeHex(cipherText, false)); 
} 

public static String decryptData(String clearData, String key, int keySize, boolean paddingEnable) 
     throws Exception { 
    byte[] keyBytes = getEncryptionKey(key, keySize); 
    SecretKey secretKey = new SecretKeySpec(keyBytes, "DESede"); 
    String algo = "DESede/ECB/pkcs5padding"; 
    Cipher cipher = Cipher.getInstance(algo); 
    byte[] stringDecode = Hex.decodeHex(clearData.toCharArray()); 
    cipher.init(Cipher.DECRYPT_MODE, secretKey); 
    byte[] cipherText = cipher.doFinal(stringDecode); 
    return cipherText.toString(); 
} 


private static byte[] getEncryptionKey(String keyString, int keySize) 
     throws Exception { 
    int keyLength = keyString.length(); 
    switch (keySize) { 
     case 56: 
      if (keyLength != 16) { 
       throw new InvalidKeyException("Hex Key length should be 16 for a 56 Bit Encryption, found [" + keyLength + "]"); 
      } 
      break; 
     case 112: 
      if (keyLength != 32) { 
       throw new InvalidKeyException("Hex Key length should be 32 for a 112 Bit Encryption, found[" + keyLength + "]"); 
      } 
      break; 
     case 168: 
      if ((keyLength != 32) && (keyLength != 48)) { 
       throw new InvalidKeyException("Hex Key length should be 32 or 48 for a 168 Bit Encryption, found[" + keyLength + "]"); 
      } 
      if (keyLength == 32) { 
       keyString = keyString + keyString.substring(0, 16); 
      } 
      break; 
     default: 
      throw new InvalidKeyException("Invalid Key Size, expected one of [56, 112, 168], found[" + keySize + "]"); 
    } 
    return Hex.decodeHex(keyString.toCharArray()); 
} 

回答

1

截至decryptData()结束时,你有return cipherText.toString();从字节数组本身的Object类调​​用toString()。这不是一个非常有趣的toString()实现 - 它只是基于字节数组对象的内存中的位置返回一些垃圾。您需要将您的字节数组实际转换回String。你可以尝试

return new String(cipherText); 

decryptData(),而不是最后一行。

+0

我试过并成功:),非常感谢! –