【发布时间】:2020-04-22 13:43:34
【问题描述】:
我需要将 secretKey.getEncoded() 从 byte[] 转换为 String 以便将密钥保存到 db 并通过消息将密钥发送给另一方。
现在我设法在 Base64 (24 字节) 中做到这一点,但对方只能以 UTF-8 格式读取它(16 字节)
我尝试这样做:String str = new String(bytes, Charsets.UTF_8);
,但我得到了错误的乱码格式,带有像这样的引号:k��$��v/~M�6�L�
这样做的正确方法是什么?
public static String generateAESKey() throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
SecretKey secretKey = kgen.generateKey();
return new String(Base64.encode(secretKey.getEncoded(), Base64.NO_WRAP));
}
【问题讨论】:
-
你可以试试
String str = new String(secretKey.toString(), Charsets.UTF_8); -
你是如何初始化变量
bytes的? -
@Arik6 AES 密钥是随机或伪随机(例如来自 KDF)字节串。在您的情况下,16 个字节对应于 128 位密钥。鉴于它是随机的或接近随机的,为什么您期望尝试将这些随机字节解释为 UTF-8 字符串不会只导致随机垃圾?我建议您和/或另一方在您更好地理解一些基本概念之前推迟使用密码学——错误地使用密码术可能会对用户的信任和隐私造成危险。
-
@Arik6 UTF-8 的一些值是不可打印的,比如前几个是控制字节。所以不,不可能将具有从 0-255 的所有可能值的字节数组转换为可读字符串。这就是使用 base64 的原因。
-
好吧,我不明白。您在问题的文本中声称您不知道如何将二进制字节数组转换为字符串,并举例说明为什么这不起作用。然后你展示了正确方式的代码,然后你问“什么是正确的方式”。
标签: java android encryption public-key-encryption