【问题标题】:Convert Hex string to Byte Array for RSA Decryption将十六进制字符串转换为字节数组以进行 RSA 解密
【发布时间】:2011-10-14 03:21:13
【问题描述】:

RSA 加密后我有一个十六进制字符串。当我将其转换为字节 [] 时,RSA 解密给出 javax.crypto.BadPaddingException: Blocktype mismatch: 0

我正在使用这种方法进行转换(在堆栈溢出本身上得到它)

public static byte[] hexStringToByteArray(String data) {
    int k = 0;
    byte[] results = new byte[data.length() / 2];
    for (int i = 0; i < data.length();) {
        results[k] = (byte) (Character.digit(data.charAt(i++), 16) << 4);
        results[k] += (byte) (Character.digit(data.charAt(i++), 16));
        k++;
    }
    return results;
}

请给点建议。

【问题讨论】:

  • 您的转化看起来不错。我想你的错误在其他地方。 (顺便说一句,正确的方法是链接到相关的问题/答案,而不是“在 Stack Overflow 上获得它”。)
  • 能否贴出相关解密部分的代码?也许您在某处使用String.getBytes() 而不是这个例程?

标签: java type-conversion rsa encryption hexdump


【解决方案1】:

加密方式要求输入是固定长度的;您将不得不将填充添加到所需的长度以避免此异常。此大小将取决于密钥大小。

编辑:data 的迭代中还有一个潜在的错误:如果它的长度不能被 2 整除,那么第二个 i++ 将导致 IndexOutOfBoundsException。您最好在for 循环中将i 增加2,并在访问数据时使用[i] 和[i+1]:

for (int i = 0; i + 1 < data.length(); i += 2, k++)
{
    results[k] = (byte) (Character.digit(data.charAt(i), 16) << 4);
    results[k] += (byte) (Character.digit(data.charAt(i + 1), 16));
}

【讨论】:

  • 这是真的;但是,通常当您实例化密码时,它会默认选择填充变换,因此无需手动使用 madding。但这完全取决于 OPs 代码...
  • 您的代码版本将给出完全相同的 IndexOutOfBoundsException。 (不过,这更清楚。)
猜你喜欢
  • 1970-01-01
  • 2013-01-14
  • 2021-10-31
  • 2019-02-12
  • 2017-06-17
相关资源
最近更新 更多