2014-11-09 36 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