AES CBC模式下的初始化矢量(IV)
我知道静脉应该是随机的,并用纯文本构成以启动加密.我的问题是,除了钥匙外,我还必须记住随机IV以进行解密吗? 解决方案 IV需要随机,但不需要秘密.通常的做法是在传输之前将静脉注射到cyphertext.解密时,将Cyphertext的前16个字节用作IV,以解密其余部分.这样,您就不必单独存储它,因为它包含在Cyphertext中.
6 2024-01-19
编程技术问答社区
openssl-使用密钥和IV解密base64字符串
我正在尝试解密base64字符串,该字符串已在OpenSSL中加密AES256.我获得了会话密钥和IV,并用我的钥匙加密.我将它们转换为十六进制,以便可以使用以下openssl命令: openssl enc -d -aes256 -iv iv.hex -K sessionkey.hex -in message.b64 -out message.txt 我发现iv是一个非HEX值的错误.我从Base64中的IV和会话密钥开始,该密钥已加密我的密钥.所以我做了以下操作: //将base64转换为二进制 openssl base64 -d -in iv.b64 -out iv.bin openssl base64 -d -in sessionkey.b64 -out sessionkey.bin //使用我的私钥 解密 openssl rsautl -decrypt -inkey mykey.pem -in sessionkey.bin -out sessionk
2 2024-01-19
编程技术问答社区
AES 256加密 -- 改变初始化向量可以在不知道密钥的情况下稍微改变解密的信息
我用AES加密/解密示例进行了以下观察,这对我来说是非常直观的. 我试图加密并在CBC模式下使用AES进行简单的有效载荷. 根据此答案,我的理解是/是初始化向量不必是秘密的: https://security.stackexchange.com/A/17046 . 在我看到的大多数示例中,初始化向量是加密有效载荷的非随机部分. 但是,通过更改初始化向量,我能够在加密过程中更改消息. 参见例如,我复制并根据 https://stackoverflow.com/a/a/a/a/a/21928790/6695561 encrypt设置了一个硬编码iv,然后将iv稍微适应decrypt. 通过此更改,我可以将消息从"hello world"更改为"hello!world". import base64 import hashlib from Crypto.Cipher import AES class AESCipher(object): def __in
0 2024-01-19
编程技术问答社区
将IV与密码文本一起存储 Crypto++ CBC AES加密
我正在尝试使用AES在CBC模式和Crypto ++ Library 中对文件进行加密(并在此之后解密) 这是我已经做过的: using namespace CryptoPP; AutoSeededRandomPool rnd; //generating the key and iv SecByteBlock key(AES::MAX_KEYLENGTH); rnd.GenerateBlock(key, key.size()); byte iv[AES::BLOCKSIZE]; rnd.GenerateBlock(iv, AES::BLOCKSIZE); 要加密文件,我以二进制模式将其打开,然后将内容转储到字符串: : std::ifstream fin(file_path, std::ios::binary); if (!fin) { std::cout
6 2024-01-19
编程技术问答社区
需要解决AES中错误的IV长度问题
我正在尝试在Java中实现AES,这是我使用的代码: byte[] sessionKey = {00000000000000000000000000000000}; byte[] iv = {00000000000000000000000000000000}; byte[] plaintext = "6a84867cd77e12ad07ea1be895c53fa3".getBytes(); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv)); byte[] ciphertext = cipher.doFinal(plaintext); cipher.init(Cipher.DECRYPT_MODE, new
6 2024-01-19
编程技术问答社区
在Java中为AES生成随机IV
我正在实施Android中PBE的AES加密引擎,我找到了实施IV创建的两种方法,我想知道哪个是更好,更安全的IvParameterSpec: 方法#1: SecureRandom randomSecureRandom = SecureRandom.getInstance("SHA1PRNG"); byte[] iv = new byte[cipher.getBlockSize()]; randomSecureRandom.nextBytes(iv); IvParameterSpec ivParams = new IvParameterSpec(iv); 方法#2: AlgorithmParameters params = cipher.getParameters(); byte[] iv2 = params.getParameterSpec(IvParameterSpec.class).getIV(); ivParams = new IvParameterSp
6 2024-01-19
编程技术问答社区
AES加密如何传输IV
我了解,唯一的IV在加密以防止频率分析等攻击方面很重要.问题:用于AES CBC加密,什么是什么重要性iv?有一个非常明确的答案,解释了IV的重要性. 在清晰的文本中发送IV时会有任何安全孔吗?还是需要使用用于发送对称密钥的相同的公共/私钥加密? 如果需要对IV发送加密,那么为什么不每次都会生成一个新的对称密钥,而是将IV视为密钥的一部分呢?生成对称键的成本太高了吗?还是可以最大程度地减少运输的数据量? 典型的关键建立协议将导致双方都涉及计算它们的数据,但只有他们都知道.使用Diffie-Hellman(或任何椭圆形曲线变体),上述共享数据具有固定的长度,并且无法控制其值(它们都获得了相同的看似随机的位序列). > 两个实体如何在没有共享信息的情况下得出"看似随机的位序列"?是否对共享信息发送了加密的假设?而且,如果发送了加密的共享信息,为什么不发送IV加密? 由于应用程序需要安全地运输对称密钥,因此将IV与密钥本身分开似乎是一种优化.还是我错过了什么?
2 2024-01-19
编程技术问答社区
秘密与非秘密的初始化向量
今天,我正在悠闲阅读,并偶然发现了第5.8节(第45页)的 使用离散对数加密图(修订)(nist特别出版物800-56a)的配对关键建立方案的建议.我对此感到非常困惑: 批准的密钥推导功能 (KDF)应用于推出秘密 来自共同秘密的键控材料. KDF的输出仅应为 用于秘密关键材料,这样 作为用于数据的对称键 加密或消息完整性,一个 秘密初始化向量或 将习惯的主键 生成其他键(可能使用 不同的过程).非分解键合 材料(例如非秘密 初始化向量)不得 使用共享秘密生成. 现在我不是Alan Turing,但是我认为初始化向量不必保密.在什么情况下,人们想要一个"秘密初始化向量"? thomas pornin 说IV是公开的,他似乎对密码很熟悉.同样,使用 caf .. 解决方案 初始化向量不需要秘密(这不是关键),但它也不需要公开(发件人和接收者必须知道它,但英格兰女王也不需要知道). 典型的关键建立协议将导致双方都涉及计算它们的数据,但只有他们都知道.使用Diffie
4 2023-08-24
编程技术问答社区
初始化向量的特征
我绝不是密码学专家,我一直在阅读有关堆栈溢出和Wikipedia上的几个问题,但就定义IV及其用法而言,没有什么真正"清晰的". 我发现的点: 为了加强加密,将静脉注射到明文消息中 静脉注射是真正的随机 每个消息都有自己的独特IV 有时会使用时间戳和加密哈希,而不是随机值,但是这些被认为是不安全的,因为可以预测时间戳 WEP的弱点之一(在802.11中)是IV在特定量加密后重置的事实,从而重复IV 我敢肯定 还有许多其他要点,有人能想到我错过的任何其他特征吗? 解决方案 iv是"影响加密过程的公共价值". IV的点通常是要"随机化"输入数据,以避免泄漏有关哪些输入块在明文中相同的信息(因为"现实生活"数据中相同的块发生了很多. 是否是通过预序来输入的,还是以其他方式输入,取决于使用的算法.为了在CBC模式下使用块密码对称加密,IV预先置于加密数据(CBC使用,对于每个块,以前的加密块; IV扮演加密块-1的作用-1). ). ). ). )
6 2023-07-24
编程技术问答社区
使用PyCrypto AES-256进行加密和解密
我正在尝试使用接受两个参数的pycrypto来构建两个函数:消息和密钥,然后加密/解密消息. 我在网上找到了几个链接来帮助我,但是每个链接都有缺陷: 此外,我给函数的密钥不能保证具有预期的确切长度.我该怎么做才能实现? 另外,有几种模式,推荐哪种?我不知道该使用什么:/ 最后, iv iv ?我可以为加密和解密提供不同的IV,还是在不同结果中返回? 解决方案 这是我的实现,它可以通过一些修复程序对我有用.它增强了与32个字节的密钥和秘密短语对齐,iv至16个字节: : import base64 import hashlib from Crypto import Random from Crypto.Cipher import AES class AESCipher(object): def __init__(self, key): self.bs = AES.block_size self.key =
12 2023-06-29
编程技术问答社区
什么是openssl iv,为什么我需要一个密钥和一个iv?
我将使用以下脚本来加密和解密一些数据.我之所以使用它,是因为我当前的加密在我们的新服务器上不起作用.我们目前正在使用McRypt,所以我想更改为OpenSSL. 在我们的数据库中,我们使用使用128位键的AES加密,所以我知道什么是键,但是我不知道openssl iv是什么?为什么我需要一个钥匙和iv. 我将要使用的代码是这个,我在网站上找到了它,因为我不太了解加密. 显然我会修改它,以便将钥匙保存在其他地方. function encrypt_decrypt($action, $string) { $output = false; $encrypt_method = "AES-256-CBC"; $secret_key = 'This is my secret key'; $secret_iv = 'This is my secret iv'; // hash $key = hash('sha256', $se
124 2023-04-19
编程技术问答社区
将AES IV预置在CipherText中存储在一个数据库中是否安全?
我想将AES加密数据存储在DB字段中. 存储AES IV(每行唯一)是否安全?例如 iv_ciphertext 两者都将在base64中编码. 所使用的密钥不会存储在数据库中. 解决方案 这是安全的.初始化矢量的目的是将一些随机性插入产生的密码(因此相同的消息不会导致相同的密码).这只是不可预测的. 它可以公开存储在数据库中.通常,它附加到消息的第一个字节上.如上所述,它存在避免统计攻击.
22 2023-04-12
编程技术问答社区
无法为使用openssl的aes gcm设置IV
我正在尝试使用C ++中OPENSL提供的AES GCM加密机制,并在此链接上使用示例作为参考: 但是,以下语句给我错误: /* Set IV length if default 12 bytes (96 bits) is not appropriate */ if(1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, 16, NULL)) handleErrors(); 我遇到的错误是: 错误:‘evp_ctrl_gcm_set_ivlen'在此范围中没有声明". 我不明白,为什么我不能将ivlen设置为16个字节?我不想 使用12个字节的默认值.任何指针都会很棒. 解决方案 我解决了错误.实际上,在示例代码中,初始化加密操作和设置IV长度的顺序如下: * Initialise the encryption operation. */ if(1 != EVP_EncryptInit_ex(
32 2023-03-01
编程技术问答社区
良好的AES初始化向量实践
根据我的问题, aes加密...缺少重要的作品,现在,我了解到,在字符串上创建可逆加密的假设有些关闭.我现在有 public static byte[] EncryptString(string toEncrypt, byte[] encryptionKey) { var toEncryptBytes = Encoding.UTF8.GetBytes(toEncrypt); using (var provider = new AesCryptoServiceProvider()) { provider.Key = encryptionKey; provider.Mode = CipherMode.CBC; provider.Padding = PaddingMode.PKCS7; using (var encryptor =
30 2023-02-05
编程技术问答社区
用CryptoJS加密,用php解密。IV的用途是什么?
我正在寻找一种方法,将密码加密在Cryptojs中,然后在PHP中解密.我看过有关同一主题的其他帖子,但是我需要有人解释所有IV和关键内容. 我的加密加密代码: password = document.getElementById("usrp").value; password = CryptoJS.AES.encrypt(password, ); 解决方案 iv 您使用的是需要IV的CBC操作模式.如果您将静态IV用于所有密文,那么您会错过有关语义安全的重要属性.如果您使用相同的IV,攻击者可能会观察您的密文,并确定您是否使用相同的密钥发送了相同的明文,因为密文将相同. 为了防止这种情况,您可以为每次加密生成一个随机IV. IV不必是秘密,但必须是不可预测的.由于它不一定是秘密,因此您可以简单地将其重新放置到密文中,然后将其切成薄片,然后再将其切成薄片或以结构化的方式发送.您需要
44 2023-01-30
编程技术问答社区
CTR模式使用初始向量(IV)
据我所知,CTR模式不使用初始向量. 它只是采用一个计数器,用给定的键加密,然后用明文进行XOR的结果,以获取密文. 其他块密码模式(例如CBC)在进行加密之前,它们会用初始矢量进行明文. 所以这是我的问题.我在Java中有以下代码(使用Bouncycastle库): Cipher cipher = Cipher.getInstance("AES/CTR/PKCS5Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] result = cipher.doFinal("Some plaintext"); 上面代码的每个不同呼叫都具有相同的键,给出了不同的输出!但是这样做时: byte[] IV = new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; Cipher cipher = Cipher.getInstance("A
124 2022-12-27
编程技术问答社区
C# 不能生成初始化向量IV
我尝试创建三倍加密的IV初始化向量时会出现以下错误. 请参阅代码示例: TripleDESCryptoServiceProvider tripDES = new TripleDESCryptoServiceProvider(); byte[] key = Encoding.ASCII.GetBytes("SomeKey132123ABC"); byte[] v4 = key; byte[] connectionString = Encoding.ASCII.GetBytes("SomeConnectionStringValue"); byte[] encryptedConnectionString = Encoding.ASCII.GetBytes(""); // Read the key and convert it to byte stream tripDES.Key = key; tripDES.IV = v4; 这是我从VS. 获得的例外 指定的初始化向
64 2022-09-08
编程技术问答社区
为什么随机IV对AES-CBC来说是好的,而对AES-GCM来说就不是了?
我一直在使用AES-CBC进行加密,每次加密纯文本时,我都会使用随机IV.据我所知,这是推荐的方法. 我一直在研究AES-GCM/AES-CTR,主要是为AEAD.我尚未实现任何内容,但是从我阅读的所有内容来看,基本上是缩短的IV,并且有一个内部计数器用于每个加密调用.开发人员/需要确保在32位计数器循环返回之前的NONCE更改,否则可能会使用相同的键使用相同的Nonce(IV),该密钥可以加密相同的纯文本并泄漏加密密钥. . 我不真正理解的是,为什么AES-CBC可以随机iv良好,但是我所读的某些内容表明AES-GCM的随机nonce(iv)是一个坏主意.我唯一能想到的是,AES-CBC的IV比AES-GCM的NONCE更长,因此AES-GCM的重复NONCE的可能引擎盖更大. 我需要加密从几个字节到10-20 GB的数据.我知道AES-GCM在计数器周期之前可以加密数据的数据大小(〜60GB)有限制.我可以解决此限制,因为我的数据低于此限制. 有人可以阐明为
304 2022-09-08
编程技术问答社区
使用PyCrypto AES 256进行加密和解密
我正在尝试使用接受两个参数的pycrypto构建两个函数:消息和键,然后加密/解密消息. 我在网上找到了几个链接来帮助我,但是每个链接都有缺陷: codekoala 的这一方法使用OS. urandom,pycrypto劝阻. 此外,我给函数的键不能保证具有预期的确切长度.我该怎么做才能实现? 另外,有几种模式,建议哪种模式?我不知道该使用什么:/ 最后,静脉注射到底是什么?我可以为加密和解密提供不同的静脉注射,还是在不同结果中返回? 编辑:删除代码部分,因为它不安全. 解决方案 这是我的实现,对我有一些修复,并增强了用32字节和IV的密钥和秘密短语对齐,iv至16个字节: import base64 import hashlib from Crypto import Random from Crypto.Cipher import AES class AESCipher(object): def __init__(self,
20 2022-09-08
编程技术问答社区
C# 不能生成初始化向量IV
当我尝试为 TripleDES 加密器创建 IV 初始化向量时出现以下错误. 请看代码示例: TripleDESCryptoServiceProvider tripDES = new TripleDESCryptoServiceProvider(); byte[] key = Encoding.ASCII.GetBytes("SomeKey132123ABC"); byte[] v4 = key; byte[] connectionString = Encoding.ASCII.GetBytes("SomeConnectionStringValue"); byte[] encryptedConnectionString = Encoding.ASCII.GetBytes(""); // Read the key and convert it to byte stream tripDES.Key = key; tripDES.IV = v4; 这是我从 VS 得到的异常.
1574 2022-07-19
编程技术问答社区