Java 将十六进制字符串转换为字节数组以进行RSA解密
我有一个十六进制字符串后RSA加密。当我将其转换为字节[]时,RSA解密给出javax.crypto.BadPaddingException:Blocktype不匹配:0 我正在使用此方法进行转换(在堆栈溢出本身上获得)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
公共静态字节[]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(不过更清楚)