最后一个单元的有效位不足

时间:2019-10-16 14:25:21

标签: java cryptography

我正在尝试反序列化256个字节的SecretKey,我已将其转换成一个大整数,然后序列化为一个txt文件,该文件看起来像是“ 22969273808780529062174833620303058617357675423823001978700975369013013049648”,然后反序列化该密钥并将其转换回一个秘密密钥,但是给我一个错误“最后一个单元没有足够的有效位”,我尝试将字符串转换为byte[]

我正在使用Java 8并使用java.crpyto导入来尝试执行此操作。

try {
    BufferedReader reader = new BufferedReader(new FileReader(fileKey)); //läser nyckelfilen
    secretKey = reader.readLine(); //Lägger datan in i strängen

    reader.close();
}
catch (IOException e1) {
    e1.printStackTrace();
}

byte[] KeyData = Base64.getDecoder().decode(secretKey); //gör om nyckeln till bytes

SecretKey KS = new SecretKeySpec(KeyData, 0, KeyData.length, "Blowfish"); // gör nyckeln till en secretkey

1 个答案:

答案 0 :(得分:0)

您输入的字符串不是有效的base64编码字符串。

让我通过解码 base64 中的'Hello'字符串来说明问题的根源:

Base64

'Hello'
    | ASCII     | Base64(A=0, Z=25, z=51, /=63)
'H' | 0100 1000 | 00 000111
'e' | 0110 0101 | 00 011110
'l' | 0110 1100 | 00 100101
'l' | 0110 1100 | 00 100101
'o' | 0110 1111 | 00 101000

解码

  • 使用[A-Za-z0-9+/]字母将base64文本映射为字节
  • 忽略2个前零位并从二进制流中收集字节
'H' 00 0001 11
'e' 00 01 1110
'l' 00 1001 01
'l' 00 10 0101
'o' 00 1010 00 

 0001 1101 0x1D
 1110 1001 0xE9
 0110 0101 0x65
 1010 00?? 0xA? <- Issue (Last unit does not have enough valid bits)