2011-04-08 176 views
4

我的目标是用AES加密字符串 我使用Base64进行加密,因为AES需要一个字节数组作为输入。 此外,我想每一个可能的字符(包括中国和德国符号)被正确地AES使用Base64加密

byte[] encryptedBytes = Base64.decodeBase64 ("some input"); 
System.out.println(new Base64().encodeToString(encryptedBytes)); 

存储我想“一些输入”应当被打印。而是打印“someinpu”。 我不可能使用sun.misc。*而是我使用apache.commons.codec

是否有人有线索发生了什么问题?

回答

18

是 - “某些输入”不是有效的base64编码字符串。

base64的想法是,你编码二进制数据到文本。然后,您将该文本数据解码为字节数组。你不能仅仅将任何文本解码,就好像它是一个完整的base64消息,而不是你可以尝试将一个mp3解码为一个jpeg图像。

加密的字符串应该是这样的过程:

  • 编码串的二进制数据,例如使用UTF-8(text.getBytes("UTF-8")
  • 加密使用AES
  • 编码使用Base64编码,以获取文本

解密是那么的事密文的二进制数据:

  • 解码以base64文本到二进制密文
  • 解密密文得到二进制明文
  • 解码二进制明文成字符串使用th与上面第一步相同的编码,例如, new String(bytes, "UTF-8")
1

您无法使用Base64将任意文本转换为字节;这不是它设计的目的。

相反,你应该使用UTF8:

byte[] plainTextBytes = inputString.getBytes("UTF8"); 

String output = new String(plainTextBytes, "UTF8");