- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我已经尝试通过自己在此处查看并在其他地方搜索了很长时间来找到答案,但我仍然有一些疑问。
假设这段 Java 代码:
try
{
int cipherMode = Cipher.ENCRYPT_MODE;
SecretKeySpec secretKey = ...; // generated previously using KeyGenerator
byte[] nonceAndCounter = new byte[16];
byte[] nonceBytes = ...; // generated previously using SecureRandom's nextBytes(8);
// use first 8 bytes as nonce
Arrays.fill(nonceAndCounter, (byte) 0);
System.arraycopy(nonceBytes, 0, nonceAndCounter, 0, 8);
IvParameterSpec ivSpec = new IvParameterSpec(nonceAndCounter);
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
cipher.init(cipherMode, secretKey, ivSpec);
File inFile = new File(...);
File outFile = new File(...);
long bytesRead = 0;
try (FileInputStream is = new FileInputStream(inFile);
FileOutputStream os = new FileOutputStream(outFile))
{
byte[] inBuf = new byte[512 * 1024];
byte[] outBuf = new byte[512 * 1024];
int readLen = 0;
ByteBuffer byteBuffer = ByteBuffer.allocate(8);
byteBuffer.putLong(bytesRead);
while ((readLen = is.read(inBuf)) != -1)
{
bytesRead += readLen;
cipher.update(inBuf, 0, readLen, outBuf, 0);
os.write(outBuf);
}
cipher.doFinal(outBuf, 0);
os.write(outBuf);
is.close();
os.close();
}
catch (Exception e) {
System.out.printf("Exception for file: %s\n", e);
}
}
catch (Exception e) {
System.out.printf("Exception: %s\n", e);
}
我的问题是:
关于 CTR 模式的计数器更新,上面的代码是否被认为是正确的?具体来说,我不会自己更新计数器。我应该改用下面的 while 循环吗?我尝试这样做是因为我查看了 cipher.getIV() 在循环中返回的内容,但它没有改变,并且 getIV() 的描述没有详细说明:
while ((readLen = is.read(inBuf)) != -1)
{
// use offset for last 8 bytes as counter
byteBuffer.putLong(bytesRead);
System.arraycopy(byteBuffer.array(), 0, nonceAndCounter, 8, 8);
bytesRead += readLen;
IvParameterSpec ivSpec = new IvParameterSpec(nonceAndCounter);
cipher.init(cipherMode, secretKey, ivSpec);
cipher.update(inBuf, 0, readLen, outBuf, 0);
os.write(outBuf);
}
我有更多与修改后的 while 循环方法相关的问题。这样调用cipher.init()可以吗?我这样做是因为我还没有找到只更新 IV 的方法(真的是计数器)。
这么大的 block 大小可以吗,还是应该让它变小?那么它应该有多大呢?
最佳答案
- Is the above code considered OK regarding counter updates for CTR mode?
是的。
但是您可能想要稍微调整一下随机数和计数器的大小。如果您的 nonce 只有 64 位长,由于生日悖论,您可能会在 232 加密后遇到 nonce 冲突(如果接近该点,概率会增加)。如果您对所有这些加密使用相同的 key (我的意思是消息/文件而不是 block )并且发生冲突,这被认为是 CTR 模式的灾难性中断,因为它是两次或多次加密。
您应该考虑使用 96 位随机数和 32 位计数器。缺点是您最多只能安全地加密 232 block ,大约每条消息/文件 68 GB。
- I have more questions related to the modified while loop approach. Is it OK to call cipher.init() in such a way?
没有。
你真的不应该自己更新计数器。请注意,字节和 block 密码 block 之间存在不匹配:您建议的计数器更新使用已经处理过的字节作为新计数器值,它比按 block 计数的自然 CTR 模式计数器前进得更快。您正在耗尽计数器,因此碰撞的可能性越来越大。例如,如果在用数字表示时 nonce 相差 1,则如果 nonce 部分较短而计数器部分较长,则可能会发生重叠。如果随机数是 96 位长,那么您只能安全地加密大小为 68/16 GB = 4.5 GB 的消息/文件。
此外,由于字节/ block 不匹配,这不再是 CTR 模式,您将很难将此代码移植到其他语言。
- Is such a large block size OK or should it be made smaller? In that case how big should it be?
不确定您的意思,AES 具有 128 位或 16 字节的固定 block 大小。
如果您指的是输入/输出缓冲区,那么您应该在您选择的平台上对其进行基准测试以确定。它看起来当然没问题。
关于Java AES CTR IV 和计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45211389/
题目地址:https://leetcode-cn.com/problems/course-schedule-iv/ 题目描述 你总共需要上 n 门课,课程编号依次为 0 到 n-1 。 有的课会
我即将使用以下脚本来加密和解密一些数据。我正在使用它,因为我当前的加密在我们的新服务器上不起作用。我们目前正在使用 mcrypt,所以我想更改为 openssl。 在我们的数据库中,我们使用 aes
有人可以告诉我为什么会收到此错误消息吗?显然这是我缺少的某种转换 预期 IV 长度为 16 但实际为 24 我用它来调用它 String encrypted = "E5ADDEB05D9D7B3925
这是我用来加密/解密数据的代码: // Set the method $method = 'AES-128-CBC'; // Set the encryption key $encryption_ke
1.题目 给定一个整数数组 prices ,它的第 i 个元素 prices[i] 是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。 注意:你
已关闭。这个问题是 not about programming or software development 。目前不接受答案。 这个问题似乎不是关于 a specific programming
在 AES 中,我的理解是盐是使密码更安全的东西,它不会被添加到加密文本中。但是IV是用来加密第一个消息 block 的东西,将被添加到加密文本中。 我有什么问题吗? 最佳答案 AES 本身并不直接使
我需要编写一个简化的加密 API,它可以通过使用随机生成的 key 或密码派生的 key 轻松处理对称加密。 密码生成是使用 OpenSSL 库中的 PKCS5_PBKDF2_HMAC() 函数并使用
我正在 Java 中使用 AES/CTR/NoPadding 使用恒定 key 和随机 IV 来加密我的消息。 我计划将 IV 添加到密文前面,然后对其进行 Base64 编码。 现在有一个问题困扰着
如果在加密明文时使用随机IV,那么密文的接收者如何知道IV是什么以对其进行解密? 这是对上一个关于 IVs here. 的 stackoverflow 问题的回复的后续问题 The IV allows
我“到处”都找过了,但找不到。是否有示例说明如何使用 c++ Quantlib 来对具有合成行使价/到期日的期权价格进行插值? 例如,如果“今天”是 2017 年 2 月 6 日,我得到了 2017
当我尝试为 TripleDES 加密器创建 IV 初始化向量时出现以下错误。 请看代码示例: TripleDESCryptoServiceProvider tripDES = new TripleDE
我无法理解以下句子:“初始化向量 (IV) 中的数字全为零(不是 ASCII 字符‘0’)。 我的目标是使用 openssl enc 命令使用 aes-128-cbc 和 key K(比如 12345
我正在阅读有关如何对 key 加盐以确保加密安全的教程,但没能充分理解它。我对密码学了解不多,需要一些帮助。我正在使用 commoncrypto 来加密文件,并且已经完成,除了它不安全这一事实....
我正在尝试创建dBase文件,因为似乎我的Export vba代码中的.TransferDatabase()方法要求该文件存在(请继续获取“字段将不适合记录”。假设由于文件不存在)。 我在网上使用vb
是否建议我使用 initialization vector加密/解密我的数据?它会让事情变得更安全吗?这是需要根据具体情况进行评估的事情之一吗? 为了将其放入实际上下文中,Win32 加密函数 Cry
我可以知道一个 R 包和代码,用于通过可用的诊断测试(例如,弱仪器测试、外生性测试(使用 Wu-Hausman)、Sargan 测试)运行固定效应工具变量 (IV) 回归吗? 我知道 plm 代码提供
我可以知道一个 R 包和代码,用于通过可用的诊断测试(例如,弱仪器测试、外生性测试(使用 Wu-Hausman)、Sargan 测试)运行固定效应工具变量 (IV) 回归吗? 我知道 plm 代码提供
我试图在加密后但写入之前将一个 16 字节安全生成的 IV 附加到每个文件上。这样我以后就可以通过从文件中拉出 IV 来解密它。这是我到目前为止的代码: public static void encr
了解 PKCS5_PBKDF2_HMAC()需要一个salt 并返回一个derivedKey 还有那个GCM::Encryption.SetKeyWithIV()需要 iv(以及 derivedKey
我是一名优秀的程序员,十分优秀!