最后一个单元没有足够的有效位

问题描述 投票:0回答:1

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

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
java cryptography
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.