我有这段代码:
private static c e;
private static byte[] f = { 55, -86, -102, 55, -23, 26, -83, 103, 125, -57, -110, -34, 70, 102, 48, -103 };
private String a;
private SecureRandom b;
private int c;
private byte[] d;
public c(String paramString, SecureRandom paramSecureRandom)
{
this.a = paramString;
this.b = paramSecureRandom;
}
public static c a()
{
if (e == null)
{
e = new c("AES/CBC/PKCS7Padding", new SecureRandom());
e.a(f, 16);
}
return e;
}
f是字节数组,16是读取使用SecureRandom()生成的IV的16个字节。 (至少我认为它正在做什么?)但是当我使用它时:
byte[] byteArray = { 55, -86, -102, 55, -23, 26, -83, 103, 125, -57, -110, -34, 70, 102, 48, -103 };
String value = new String(byteArray, "ISO-8859-1");
System.out.println(value);
我得到这个输出:7ª7ég}ÇÞFf0
我正在尝试弄清楚我的应用程序如何生成用于加密/解密的加密密钥......上面的结果肯定不是正确的?我完全走错了吗?
我已经在这里包含完整的类代码,这有助于:http://pastie.org/private/5fhp9yqknzoansd1vc0xfg
真的很想知道上面代码实际上是做什么的,所以我可以将它移植到PHP,而不是太好@ Java。
提前致谢。
答案 0 :(得分:4)
您的输出7ª7ég}ÇÞFf0
对我有意义。
您正在使用字符集:ISO-8859-1,因此字节将被解码为它们在该字符集中映射到的字符。
使用基数10创建字节数组,并对java字节进行签名。这意味着您的字节数组具有以下十六进制值(按顺序):
37, AA, 9A, 37, E9, 1A, AD, 67, 7D, C7, 92, DE, 46, 66, 30, 99
根据ISO-8859-1字符集,这些值映射到以下内容:
7, ª, (nil), 7, é, (nil), SHY, g, }, Ç, (nil), Þ, F, f, 0, (nil)
这与你的字符串实际上非常接近。 (nil)
字符不会在字符串中呈现,因为字符集没有相应值的字形。对于角色SHY,我将再次假设没有字形(而标准表明实际上应该存在)。
你的输出对我来说似乎是对的! :)
请记住,您的加密密钥只是一个字节序列。你不应该期望数据是人类可读的。