簡體   English   中英

Java cipher.doFinal()寫入額外的字節

[英]Java cipher.doFinal() writing extra bytes

我正在使用Java Cipher和AES實現加密/解密。 除了在調用doFinal()時寫入5個額外字節外,一切都運行良好。 所以,我最終得到一個正確解碼的字符串,附加了5個額外的字節。

我相信原因是正在寫入整個1​​6字節的塊。 我看到寫了3個16字節塊,包括最后一個。 輸入加密文件是64字節。 未加密的文本應為43個字節。

doFinal的文檔表明它可以返回寫入輸出緩沖區的字節數。 但是,它是0,16,16,16。 我已嘗試過各種形式的doFinal並更新並且不會改變行為。

它是有意義的,它寫出一個完整的塊,因為這是大多數這些算法的運作方式。 但是,如果它不會告訴我輸出數據的大小,我該如何防止過多的數據呢?

或許我應該使用其他算法? 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();
    }

調用Cipher.getInstance()時必須指定填充機制 - 顯然在加密和解密時必須相同。 例如:

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

如果沒有填充機制,解密端就沒有關於明文結尾位置的信息(在最后一個塊內)。

AES是一種分組密碼 ,自然它會給你整個塊,就像所有分組密碼一樣。

有關更多信息,請參閱有關AESWikipedia文章

你說你想要它輸出“正確的字節數”。 你怎么決定什么是正確的字節數?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM