【问题标题】:What does cipher.update do in java?cipher.update 在 java 中做了什么?
【发布时间】:2014-11-09 02:16:41
【问题描述】:

我正在实施 DES - CBC。我对cipher.initcipher.updatecipher.dofinal 做了什么感到困惑。我只是使用 init 来设置密钥和dofinal 来获得结果。我不使用更新。对吗?

另外使用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"));

【问题讨论】:

  • 这是byte,而不是bytes...
  • 您是否阅读了Cipher 上的文档? javadocs 应该会有所帮助。

标签: java cryptography aes des cbc-mode


【解决方案1】:

Cipher.doFinal(byte[]) 的 Javadoc 说(部分添加了重点),

在单部分操作中加密或解密数据,或完成多部分操作。数据被加密或解密,具体取决于此密码的初始化方式。

处理输入缓冲区中的字节,以及在先前更新操作期间可能已缓冲的任何输入字节,并应用填充(如果请求)。如果使用GCM/CCM等AEAD模式,加密时附加认证标签,解密时验证。结果存储在一个新的缓冲区中。

这样做是为了您不必将所有文件(例如)读入内存即可对其进行加密。

【讨论】:

  • 在什么情况下我需要调用 update()?
  • @dfs 我在最后一句话中谈到了这一点,如果您需要加密一个大文件,将整个文件读入byte[] 以便调用doFinal(byte[]) 与整个文件通常是不切实际的一下子发消息。相反,您将使用update() 在分块读取文件时对其进行处理。
  • 谢谢。我现在明白了。如果我使用 UTF-8 或 ASCII 编码,你知道它对结果(当我打印到屏幕时)有什么影响吗?我会用十六进制打印它
  • @dfs 这取决于消息。
猜你喜欢
  • 2012-08-07
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 1970-01-01
  • 1970-01-01
  • 2021-09-05
相关资源
最近更新 更多