Java 字节到字符串给出奇怪的结果?

标签 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

我正在尝试弄清楚我的这个应用程序是如何生成用于加密/解密的加密 key 的……上面的结果肯定是对的?我在这里完全走错路了吗?

我在这里包含了完整的类代码以防有帮助:http://pastie.org/private/5fhp9yqknzoansd1vc0xfg

真的很想知道上面的代码实际上在做什么,所以我可以将它移植到 PHP,不太好@Java。

提前致谢。

最佳答案

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

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

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

关于Java 字节到字符串给出奇怪的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34603426/

相关文章:

用于在 CURLOPT_URL 中传递变量的 php pb

encryption - 这是什么类型的加密?

c# - 检查 Outlook 邮件 (*.message) 是否经过数字签名或加密

java - JAXB:使用缩进编码输出 XML 在第一行创建空换行符

php - 替换全局变量,如何以及为什么

java - 从斯坦福分类器输出置信度分数的方法?

php - MySQL 查询行的最快方法

java - 解密图像时,给出 javax.crypto.BadPaddingException : pad block corrupted Android

Java 8 ToLongFunction 什么时候应该使用它?

java - 文件压缩