问题标签 [initialization-vector]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
encryption - 初始化向量的特征
我绝不是密码学专家,我一直在阅读有关 Stack Overflow 和 Wikipedia 的一些问题,但就定义 IV 及其用法而言,没有什么是真正“明确”的。
我发现的要点:
- 在明文消息前添加 IV 以加强加密
- IV 是真正随机的
- 每条消息都有自己独特的 IV
- 有时使用时间戳和加密哈希来代替随机值,但这些被认为是不安全的,因为可以预测时间戳
- WEP(在 802.11 中)的弱点之一是 IV 将在特定数量的加密后重置,从而重复 IV
我敢肯定还有很多其他的要点,有人能想到我错过的任何其他特征吗?
c# - C# 无法生成初始化向量 IV
当我尝试为 TripleDES 加密器创建 IV 初始化向量时,出现以下错误。
请看代码示例:
这是我从 VS 得到的例外。
指定的初始化向量 (IV) 与此算法的块大小不匹配。
我哪里错了?
谢谢
c# - 在编码中应该使用什么加密以及它如何影响密钥和初始化向量?
我正在研究加密以及编码如何影响密钥和初始化向量的生成。
我正在TripleDESCryptoServiceProvider
使用 ASCII 编码需要 24 字节密钥和 8 字节初始化向量。如果我决定使用不同的编码,这将如何影响密钥和初始化向量的生成?
我应该使用哪种编码来代替 UTF8/16/32?
谢谢
android - AES 密码不接收 IV
我正在尝试使用带有 AES 的 IV,以便加密文本是不可预测的。但是,加密的十六进制字符串始终相同。
实际上,我已经尝试了一些方法来尝试通过将一些额外的参数传递给 cipher init 调用来增加一些随机性:
1) 手动 IV 生成
2)要求密码生成IV
3) 使用 PBEParameterSpec
所有这些似乎对加密文本没有影响....帮助!
我的代码:
c - 生成一个没有良好随机性来源的初始化向量
对于 Rockbox 的密码存储插件(用 C 编写),我需要生成初始化向量。
问题是我没有很好的随机性来源。Rockbox 提供的 random() 不是加密 RNG。而且我几乎没有任何可以访问的随机源(没有鼠标移动,......在运行 Rockbox 的 iPod 上)。
该密钥当前是通过 PBKDF2 从用户提供的密码和盐(这是一个常量前缀 + 来自 random() 的一些数据)中派生的。我认为伪随机数据对于具有 10000 次 PBKDF2 迭代的盐来说应该足够好。
但是,我从哪里获取初始化向量?如果我获取一些半随机数据(时间 + 随机())和 SHA,比如 10000 次,可以吗?我应该使用从 random() 中获取的种子来使用 arc4random 吗?
如果我实际上从不使用相同的密钥两次(每次更改存储的数据时都会重新计算盐),我什至需要 IV 吗?处理此类情况的最佳方法是什么?
编辑:只有一个用户(我,拥有 IPod),加密算法:AES-CBC 256 位。该文件仅存储各种网站的站点/帐户/密码列表。它很少被修改(每当我在网站上创建一个新帐户时),当这种情况发生时,就会生成一个新的盐和一个新的 IV。
java - 初始向量的 CTR 模式使用(IV)
据我所知,CTR 模式不使用初始向量。它只需要一个计数器,用给定的密钥对其进行加密,然后将结果与明文进行异或运算,以获得密文。
其他分组密码模式(如 CBC)在进行加密之前会使用初始向量对明文进行异或运算。
所以这是我的问题。我在 Java 中有以下代码(使用 bouncycastle 库):
使用相同键对上述代码的每次不同调用都会产生不同的输出!但是在做的时候:
在上述代码的每次调用中,我都会得到相同的结果。但这是为什么呢?我的意思是,CTR 不需要 IV,那么为什么当我不在每次调用中都给出 IV 时我得到不同的结果,而当我给出 IV 时它返回相同的结果呢?如果我在使用 CTR 时总是使用上述 IV(全零),那会安全吗?
任何想法都会非常有帮助。谢谢
cryptography - 使用带有单块加密的常量 IV
我有很多小秘密要加密存储在数据库中。数据库客户端将拥有密钥,而数据库服务器将不处理加密和解密。我所有的秘密都是 16 字节或更少,这意味着使用 AES 时只有一个块。我正在使用常量 IV(和密钥)来使加密具有确定性,我进行确定性加密的原因是能够使用密文轻松查询数据库并确保相同的秘密不会存储两次(通过使列 UNIQUE )。据我所知,只要密钥是秘密的,这样做应该没有问题。但我想确定:我是对还是错?如果我错了,可以进行哪些攻击?
顺便说一句:哈希在这里毫无用处,因为可能的明文数量相对较少。使用散列,获取原始明文将是微不足道的。
.net - 使用 Rfc2898DeriveBytes 类获取 Key 和 IV
我刚刚开始熟悉加密和 .NET 框架。在查看了许多示例后,我发现使用 .NET Class 时会出现重复的模式Rfc2898DeriveBytes
。当使用此类获取加密密钥和初始化向量时,似乎使用了相同的方法。
这是来自MSDN 博客的一些代码,演示了如何获取密钥和初始化向量。
我在其他地方也看到过这个。我想我会认为它会是这样的......
我一定在这里遗漏了一些东西。如果密钥和初始化向量 (IV) 只是随机数,那么在使用正确的密码和盐时如何再次获得它们?
security - 秘密与非秘密初始化向量
今天,我在悠闲地阅读并偶然发现了使用离散对数密码术的成对密钥建立方案推荐(修订版)(NIST 特别出版物 800-56A)的第 5.8 节(第 45 页)。我对此感到非常困惑:
应使用经批准的密钥导出函数 (KDF) 从共享秘密中导出密钥材料。KDF 的输出只能用于密钥材料,例如用于数据加密或消息完整性的对称密钥、秘密初始化向量或将用于生成其他密钥的主密钥(可能使用不同的过程)。不得使用共享密钥生成非秘密密钥材料(例如非秘密初始化向量)。
现在我不是 Alan Turing,但我认为初始化向量不必保密。在什么情况下需要一个“秘密初始化向量”? Thomas Pornin说 IV 是公开的,他似乎精通密码学。与caf 一样。
security - 使用 MITM 攻击安全地推导 IV (Nonce)
我知道对于大多数密码来说,一个好的随机数非常重要。我正在使用 AES-GCM,并且正在使用 96 位随机数和 256 位 AES 密钥。我之前在这里问过一些关于如何通过不安全的渠道协商随机数的问题。
我正在使用 ECDH 导出共享密钥,并计划使用 X9.63 标准方法从中导出密钥材料。我知道在协商密钥时可以将随机生成的 96 位附加到盐的末尾。然后我可以像 XOR 一样以某种方式将两者结合起来(这是一个点对点系统),并有一个随机的、好的随机数。
当然,这并不能阻止 MITM 攻击,比如通过 ARP 欺骗。公钥本身由中央服务器认证,其公钥与应用程序一起分发。因此,认证不能因为使用GCM而被篡改。但是,随机数当然没有经过认证,因此可以潜在地 MITM 对等方,保持他们的密钥相同,但用可预测或静态(或全零或其他)的东西替换 IV,这会导致所选对象的漏洞(已知?)明文攻击。
这是我正在谈论的事情的一个场景,以防它令人困惑。Alice (A) 和 Bob (B) 都生成良好的随机 96 位 nonce 材料(Am 和 Bm)并将它们附加到他们的 x.509 证书中。为了说明,我将使用小数字 Am=1234 和 Bm=4321。当没有 MITMed 时,每个人都会计算 Am⊕Bm = 5171。这将用作随机数。Eve 决定 MITM 他们打败 IV。她确保他们最终会得到常数 IV “6666”。当 A 向 B 发送 Am“1234”时,Eve ARP 欺骗 Bm 并将其替换为“2795”。当 B 将 Bm“4321”发送给 A 时,Eve 将其替换为“7896”。1234⊕7896 == 4312⊕2795 == 6666。
以下是我的想法/想法:
使用签名密钥 (ECDSA) 对 nonce 材料进行签名:在这一点上,我无法验证 GCM 本身之外的任何内容(即我没有使用 ECDSA 密钥或管理它们)。我想严格遵守 Suite B 算法。我知道我可以使用 GCM 验证明文(AEAD 的“AD”部分——带有关联数据的验证加密),但当然我还没有建立 IV……所以我不能用这个验证 IV 材料,可以我?对我来说,我似乎应该能够只使用 GCM 的对称密钥(我已经通过 ECDH 建立)来对此进行身份验证,因为它不需要加密,所以没有秘密——只有明文和 GCM MAC - 但我无法弄清楚如何在没有 BC 的 IV 的情况下初始化 AEADBlockCipher。“傻瓜”会不会很蠢 首先用全零 IV 初始化密码,正确的密钥,然后将 Nonce 处理为“关联数据”(未加密),最终确定缓冲区(附加 MAC),将其发送给对等方,然后重新初始化用真正的 IV 和相同的密钥加密?或者,我很确定我可以使用 ECDSA 签署随机数(如果我愿意,可能与 ECDH 公钥一起),但这需要分发也由服务器认证的 ECDSA 公钥,这增加了我想要的复杂性宁可避免(这也是我的第一个签约想法)
记录并禁止重复使用相同的 IV/Key 组合:IV 的重要之处在于它只与给定的密钥一起使用一次。因此,如果有人进行上述 MITM 攻击以反复用人为替换 IV,这个想法只会注意到并关闭连接。如果他们用派生出未使用 IV 的有效替代对替换它,攻击者将不会获得任何优势(对吗?)。在我的设计中,ECDH 对的私钥从未真正命中磁盘,因此在程序调用之间我将拥有所有新的对称密钥,因此这组密钥+IV 对可以很容易地保存在内存中,所以我真的很喜欢这种方法:- )
使用来自 ECDH 的秘密材料作为“面具”来制作秘密 IV:获取已建立的ECDH秘密材料(尚未传递给X9.63密钥生成器(BC中的ECDHKEKGenerator))。以某种方式从中获取 96 位 (Km),例如材料本身的前 96 位或材料的 SHA-1 摘要的前 96 位。Alice 和 Bob 生成随机的 96 位 nonce 材料(Am 和 Bm)。A 和 B 分别计算 Am⊕Km 和 Bm⊕Km,然后将它们的值发送给对方。一旦 A 有 Bm⊕Km,B 有 Am⊕Km,A 执行 Km⊕(Bm⊕Km) 得到 Bm,B 执行 Km⊕(Am⊕Km) 得到 Am。然后 A 和 B 都执行 Am⊕Bm,我们最终得到了 IV。如果它被篡改,A 和 B 将有不同的 IV,因为 Eve 不知道 Km,所以她不能精确地操纵它,对吧?这将导致 GCM 在交换第一条消息时检测到篡改,因此不会造成任何伤害。这种方法有什么问题?
很抱歉这个问题很长,请不要告诉我不要实现自己的协议,因为我这样做是为了了解作为 CS 学生的实现细节——而不是如何忽略它们。