代码之家  ›  专栏  ›  技术社区  ›  wadesworld

JavaCiff.DoFialAl~()编写额外字节

  •  8
  • wadesworld  · 技术社区  · 15 年前

    我用Java密码和AES实现加密/解密。除了在对dofinal()的调用中有5个额外的字节外,其他一切都工作正常。所以,我最后得到了一个正确解码的字符串,附加了5个额外的字节。

    我认为原因是整个16字节的块都被写入了。我看到3个16字节的块被写入,包括最后一个。输入加密文件为64字节。未加密的文本应为43个字节。

    dofinal的文档表明它可以返回写入输出缓冲区的字节数。但是,它是0,16,16,16。我已经尝试过各种形式的数据处理和更新,并且在行为上没有任何变化。

    写一个完整的块是有道理的,因为这就是大多数算法的工作原理。但是,如果它不告诉我输出数据的大小,我该如何防止多余的数据呢?

    我应该使用另一种算法吗?AES256是一个要求,但我想知道不同的块类型或填充类型是否允许它写入正确的字节数。

    有什么指导吗?

    剪短(部分)简洁:

    decryptCipher = Cipher.getInstance("AES");
    decryptCipher.init(Cipher.DECRYPT_MODE, aesKey);
    

    解密例程的业务部分。

        long bytesToRead = inputFile.length();
    
        while ((inLen = in.read(buffer)) > 0) {
            int bytesOut = 0;
            byte[] cryptBytes = null;
            int outLen = cipher.getOutputSize(inLen);
            cryptBytes = new byte[outLen];
    
            if (bytesToRead <= buffer.length) {
                try {
                    bytesOut = cipher.doFinal(buffer, 0, inLen, cryptBytes, 0);
                } catch (ShortBufferException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            } else
                try {
                    bytesOut = cipher.update(buffer, 0, inLen, cryptBytes, 0);
                } catch (ShortBufferException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
            out.write(cryptBytes, 0, bytesOut);
            bytesToRead -= inLen;
    
        }
        try {
            out.flush();
            in.close();
            out.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
    2 回复  |  直到 11 年前
        1
  •  15
  •   caf    15 年前

    调用cipher.getInstance()时必须指定填充机制-显然,在加密和解密时必须相同。如:

    decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    

    如果没有填充机制,解密端就不知道明文的结尾在哪里(在最后一个块中)。

        2
  •  1
  •   Lasse V. Karlsen    15 年前

    AES是一种 分组密码 很自然,它会给你整个块,就像所有的块密码一样。

    Wikipedia article on AES 更多信息。

    您说过希望它输出“正确的字节数”。如何确定正确的字节数?