Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将十六进制字符串转换为字节数组以进行RSA解密_Java_Type Conversion_Rsa_Encryption_Hexdump - Fatal编程技术网

Java 将十六进制字符串转换为字节数组以进行RSA解密

Java 将十六进制字符串转换为字节数组以进行RSA解密,java,type-conversion,rsa,encryption,hexdump,Java,Type Conversion,Rsa,Encryption,Hexdump,我有一个十六进制字符串后RSA加密。当我将其转换为字节[]时,RSA解密给出javax.crypto.BadPaddingException:Blocktype不匹配:0 我正在使用此方法进行转换(在堆栈溢出本身上获得) 公共静态字节[]hexStringToByteArray(字符串数据){ int k=0; byte[]results=新字节[data.length()/2]; 对于(int i=0;i

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

我正在使用此方法进行转换(在堆栈溢出本身上获得)

公共静态字节[]hexStringToByteArray(字符串数据){
int k=0;
byte[]results=新字节[data.length()/2];
对于(int i=0;i结果[k]=(字节)(Character.digit(data.charAt(i++),16)加密方法要求输入为固定长度;您必须将填充添加到所需长度以避免此异常。此大小将取决于密钥大小

编辑:在您对
数据的迭代中也有一个潜在的bug
:如果它的长度不能被2整除,那么第二个
i++
将导致
索引自动边界感知
。您最好在
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));
}
for(int i=0;i+1结果[k]=(字节)(Character.digit(data.charAt(i),16)加密方法要求输入为固定长度;您必须将填充添加到所需长度以避免此异常。此大小将取决于密钥大小

编辑:在您对
数据的迭代中也有一个潜在的bug
:如果它的长度不能被2整除,那么第二个
i++
将导致
索引自动边界感知
。您最好在
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));
}
for(int i=0;i+1结果[k]=(字节)(Character.digit(data.charAt(i),16))您的转换看起来不错。我想您的错误在其他地方。(顺便说一句,正确的方法是链接到相关的问题/答案,而不是“在堆栈溢出本身上获得它”)您可以发布代码的相关解密部分吗?也许您正在使用
String.getBytes()
而不是此例程?您的转换看起来不错。我想您的错误在其他地方。(顺便说一句,与其“在堆栈溢出上获得它”,正确的方法应该是链接到相关的问题/答案。)您可以发布代码的相关解密部分吗?可能您使用的是
String.getBytes()
在某个地方而不是这个例程?这是正确的;但是,通常当您实例化密码时,它会默认选择填充转换,因此不需要手动进行madding。但这完全取决于OPs代码……您的代码版本将给出完全相同的IndexOutOfBoundsException(不过更清楚)这是正确的;但是,通常当您实例化密码时,它会默认选择填充转换,因此不需要手动进行madding。但这完全取决于OPs代码……您的代码版本将给出完全相同的IndexOutOfBoundsException(不过更清楚)