当前位置: 首页 > 知识库问答 >
问题:

cipher.getInstance()和cipher.getInit()用于AES加密的随机IV情况下的每个消息

苏富
2023-03-14

在一个多线程Java应用程序中,我们使用AES-256对磁盘上的文件进行加密和解密。请注意,多个线程可以对不同文件的加密和解密方法进行并发调用。

加密:

Cipher encrypter = Cipher.getInstance(algorithm, new BouncyCastleProvider());
IvParameterSpec ivSpec = getIvParamSpec(encrypter.getBlockSize());
encrypter.init(Cipher.ENCRYPT_MODE, key, ivSpec);
//..encrypt the data
Cipher decrypter = Cipher.getInstance(algorithm, new BouncyCastleProvider());
IvParameterSpec ivSpec = readIvParamSpec(decrypter.getBlockSize(), is);
decrypter.init(Cipher.DECRYPT_MODE, key, ivSpec);
//.. decrypt the data
SecureRandom random = new SecureRandom();
byte[] iv = new byte[ivSizeBytes];
random.nextBytes(iv);
new IvParameterSpec(iv);

共有1个答案

田嘉澍
2023-03-14

我的问题是,既然每次加密都使用random IV,那么是否需要对所有调用调用cipher.getInstance()和cipher.init()?

只要不在线程之间共享密码实例,就可以重用它们。正如Artjom提到的,密码实例是有状态的。它们既存储IV,也存储最后的密文(用作CBC模式加密的下一个向量),还可能存储一些缓冲的明文。将该状态与来自不同线程的输入混合将导致混乱。

由于每个文件加密都需要一个新的random,因此在调用doFinal方法之后,需要再次调用init。Init没有那么重量级;AES的子密钥派生可能会影响性能,但通常这不是一个大问题。

多次重新创建bouncycastleprovider是一个非常糟糕的主意,即使它可能在下面使用某种单例。但基本上您不需要Java唯一的Bouncy Castle实现。Oracle one可以使用将在兼容处理器上直接使用AES-NI指令集的AES-NI本质。那将绕着弹力城堡跑一圈--预计速度会提高7到13倍(!)。

 类似资料:
  • 我目前需要一种使用AES-128对称加密对字符串加密和字节数组解密的方法,使用C#。我找不到办法,但也许我错过了什么。

  • 问题内容: 我在下面的(E.1)中使用它来进行我的应用程序,显然我认识并理解了其中的一个巨大的安全漏洞。我对加密越来越感兴趣,并且想更好地理解它,我需要随IV一起生成一个随机密钥,但是不确定如何正确地执行此操作。有人可以向我解释一下熟悉AES加密的工作原理(IV和KEY)吗? )因此,我将来能够更好地理解并可以运用我的知识,本质上,我只是想使代码更安全,谢谢。 (E.1) 问题答案: AES密钥仅

  • 我在下面(E.1)中使用它作为我的应用程序,显然有一个我认识和理解的巨大的明显的安全漏洞。我对加密越来越感兴趣,想更好地理解它,我需要生成一个随机密钥和一个IV,但不确定如何正确地执行。有人能向我解释一下熟悉AES加密的人是如何工作的吗? (E.1)

  • 我想在js中制作一个网页,将加密明文,所以我可以把它发送给朋友,谁将使用相同的网页来解密它。 我们将共享同一密钥,并将其用于多条消息。 我知道当使用AES CBC-有需要随机iv为每个消息,但我喜欢使用AES CTR。 我将使用256键,而不是密码。 我有两个问题: 我可以在CTR和no iv中多次使用同一密码吗 如果我将使用CBC,在发送加密消息的同时发送明文iv是否安全 我使用的是aes js

  • 我试图在CBC模式下使用AES和Crypto++库加密(和解密)一个文件 以下是我已经做的: 为了加密文件,我以二进制模式打开它,并将内容转储为字符串: 当我将尝试解密此文件时,我如何分别提取iv和密文?IV是16字节长,但在这里我完全迷失了,我不知道如何做。

  • 我从这里得到了提示:PHP中的双向加密 作为测试环境,im运行WAMP LocalHost。