Java Byte to String给出了奇怪的结果?

时间:2016-01-05 02:48:18

标签: java php encryption

我有这段代码:

 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。

提前致谢。

1 个答案:

答案 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,我将再次假设没有字形(而标准表明实际上应该存在)。

你的输出对我来说似乎是对的! :)

请记住,您的加密密钥只是一个字节序列。你不应该期望数据是人类可读的。