2014-11-09 59 views
1

我正在實施DES - CBC。我很困惑什麼cipher.init,cipher.updatecipher.dofinal做。我只是使用init來設置密鑰,並使用dofinal來獲得結果。我不使用更新。那是對的嗎?cipher.update在java中做什麼?

而且什麼用UTF-8ASCII編碼當差的結果呢?

這裏是我的代碼:

byte[] ciphertext; 

Cipher enc = Cipher.getInstance("DES/CBC/PKCS5Padding"); 

enc.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "DES"), new IvParameterSpec(vector)); 

// Is this the complete ciphertext? 
ciphertext = encrypt.doFinal(data.getbytes("UTF-8")); 
+0

它是'byte',而不是'bytes' ... – 2014-11-09 02:23:00

+0

您是否閱讀過['Cipher']上的文檔(https://docs.oracle.com/javase/7/docs/api/javax/crypto/ Cipher.html)? javadoc應該會有所幫助。 – 2014-11-09 02:25:17

回答

1

Cipher.doFinal(byte[])的Javadoc說(在加強調的部分),

加密或單部分操作解密數據,或者結束一個多部分操作。數據被加密或解密,取決於這個密碼是如何初始化的。

處理輸入緩衝區中的字節以及在先前更新操作期間可能緩衝的任何輸入字節,並應用填充(如果請求)。如果使用諸如GCM/CCM的AEAD模式,則在加密的情況下附加認證標籤,或者在解密的情況下驗證。結果存儲在新的緩衝區中。

這樣做完成後,您不必將所有文件(例如)全部讀入內存中,以便對其進行加密。

+0

什麼情況下,我需要調用update()? – dfs 2014-11-09 02:36:42

+0

@dfs我在最後一句中提到了這一點,如果你需要加密一個大文件,將整個文件讀入一個'byte []'以便用整個文件調用'doFinal(byte [])'通常是不切實際的消息一次。相反,當你以塊的形式讀取文件時,你可以使用'update()'來處理文件。 – 2014-11-09 02:41:19

+0

謝謝。我現在明白了。如果我使用UTF-8或ASCII編碼,你知道它對結果有什麼影響嗎(當我將它打印到屏幕上時)?我將以十六進制打印它 – dfs 2014-11-09 02:42:50