我试图使用带有AES的IV,以便加密的文本是不可预测的.但是,加密的十六进制字符串始终相同.
我实际上尝试了一些尝试通过将一些额外的参数传递给cipher init调用来添加一些随机性的方法:
1)手动IV生成
byte[] iv = generateIv();
IvParameterSpec ivspec = new IvParameterSpec(iv);
Run Code Online (Sandbox Code Playgroud)
2)要求密码生成IV
AlgorithmParameters params = cipher.getParameters();
params.getParameterSpec(IvParameterSpec.class);
Run Code Online (Sandbox Code Playgroud)
3)使用PBEParameterSpec
byte[] encryptionSalt = generateSalt();
PBEParameterSpec pbeParamSpec = new PBEParameterSpec(encryptionSalt, 1000);
Run Code Online (Sandbox Code Playgroud)
所有这些似乎对加密文本没有影响....帮助!
我的代码:
package com.citc.testencryption;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class Main extends Activity {
public static final int SALT_LENGTH = 20;
public static final int PBE_ITERATION_COUNT = 1000;
private static final String RANDOM_ALGORITHM = …Run Code Online (Sandbox Code Playgroud) 我正在尝试在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 SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv));
byte[] deciphertext = cipher.doFinal(ciphertext);
Run Code Online (Sandbox Code Playgroud)
我需要这个固定密钥和IV用于测试目的,但我得到以下异常:
Exception in thread "main"
java.security.InvalidAlgorithmParameterException:
Wrong IV length: must be 16 bytes long at
com.sun.crypto.provider.SunJCE_h.a(DashoA12275) at
com.sun.crypto.provider.AESCipher.engineInit(DashoA12275) at
javax.crypto.Cipher.a(DashoA12275) at
javax.crypto.Cipher.a(DashoA12275) at
javax.crypto.Cipher.init(DashoA12275) at
javax.crypto.Cipher.init(DashoA12275)
Run Code Online (Sandbox Code Playgroud)
如何在此AES实现中使用此固定IV?有什么办法吗?
为了使流密码能够抵御重复的密钥攻击,IV不应该重复.但是SecureRandom在这方面是否优于简单的非安全随机(或仅用于生成不可预测的序列)?
假设我使用AES CBC模式的固定大小的消息,并且我为每个IV生成一个新的Random(使用当前的纳米时间作为种子),与SecureRandom相比,这是否会增加重复IV的概率?
为什么这个init会成功:
Cipher AESCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
AESCipher.init(Cipher.ENCRYPT_MODE, secretKey, secRandom);
Run Code Online (Sandbox Code Playgroud)
虽然失败了:
Cipher AESCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
AESCipher.init(Cipher.DECRYPT_MODE, secretKey, secRandom);
Run Code Online (Sandbox Code Playgroud)
在线程"main"中抛出异常java.security.InvalidKeyException:缺少参数
secretKey由KeyGenerator生成,secureRandom由SecureRandom.getInstance("SHA1PRNG")生成,具有随机静态种子集.
谢谢
我的工作部门需要使用由另一个部门编写的加密库的权力,问题是加密库已经硬编码了其AES计数器模式初始化向量(全零).(基本上,另一个部门采用了Bouncycastle库并在其周围包装了自己的破解代码.)我们已经记录了此代码的功能问题,所以现在除非管理层决定采取行动,否则我们会使用破坏的加密库.
我想知道我们是否可以通过在明文中添加一个唯一的IV然后在解密后截断明文的前16个字节来伪造正确的初始化向量,例如
ciphertext = encrypt(++sixteenByteCounter + plaintext)
plaintext = decrypt(ciphertext).subArray(16, ciphertext.length)
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很好,但我不是加密专家
我想尝试加密文件并使用以下堆栈溢出响应。然而,在测试初始化向量时,我发现它只影响前 16 个字节。
当我将一个空的 iv 传递给解密密码(前 16 个字节除外)时,数据被意外解密。 [我假设图书馆没有坏,而且我做的事情不正确;但这是一个可怕的想法,其他人可能在同一条船上却没有意识到这一点。]
例子:
Initial bytes ..... 2222222222222222222222222222222222222222222222222222
Encrypted bytes ... b35b3945cdcd08e2f8a65b353ff754c32a48d9624e16b616d432
Decrypted bytes ... 3c4154f7f33a2edbded5e5af5d3d39b422222222222222222222
Run Code Online (Sandbox Code Playgroud)
问:为什么整个解密没有失败?
推测:我想我可以通过一次迭代 16 个字节的数据并通过对先前加密的 16 个字节块进行散列来更新每轮的 iv 来进行加密。然而,这似乎是我期望图书馆做的繁忙的工作。我本来希望提出实施指南的专家会提到它。但我只是抓住了这里的稻草。据我所知,也许安全社区只担心第一个区块的黑客攻击。
注意:刚才我发现了一个 5.5 年前的堆栈溢出帖子,它发现了同样的问题;不幸的是,它仍然没有回应。
package test;
import java.security.AlgorithmParameters;
import java.security.spec.KeySpec;
import java.util.Formatter;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
/*
* Issue: Using "AES/CBC/PKCS5Padding" encryption, the Initialization Vector
* appears to only affect the first block?!?
*
* Example Output
* iv …Run Code Online (Sandbox Code Playgroud) 我有 16 字节数据存储在 Uint8Array 中。我需要将这些数据存储在浏览器中,并且必须在其他类中获取它。
所以我的代码如下所示:
const ivBytes = window.crypto.getRandomValues(new Uint8Array(16));
localStorage.setItem("iv",JSON.stringify(ivBytes))
console.log("content of ivBytes:" + ivBytes)
Run Code Online (Sandbox Code Playgroud)
在其他课程中,我尝试获取这样的数据,但它不起作用
let array = JSON.parse(localStorage.getItem("iv"))
console.log("the iv value we get is: " + ivBytes)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试获取数组的内容时,它并没有准确地给出 ivBytes 的内容。输出如下:

如何在浏览器中存储 Uint8array 并使用 localStorage 在其他类中以相同的方式获取它?提前致谢。
javascript local-storage initialization-vector typed-arrays typescript
我通过 AES 加密/解密示例进行了以下观察,这对我来说非常违反直觉。
我尝试在 CBC 模式下使用 AES 加密和解密一个简单的有效负载。我的理解是,根据这个答案,初始化向量不必是秘密的: https: //security.stackexchange.com/a/17046。在我看到的大多数示例中,初始化向量是加密有效负载的非随机部分。
但通过更改初始化向量,我能够在加密期间更改消息。
例如,请参阅我从/sf/answers/1535015331/复制并改编的这个 python 示例。我设置了硬编码的ivforencrypt并稍微调整了ivfor decrypt。通过此更改,我可以将消息从"hello world"更改为"hello!world"。
import base64
import hashlib
from Crypto.Cipher import AES
class AESCipher(object):
def __init__(self, key):
self.bs = AES.block_size
self.key = hashlib.sha256(key.encode()).digest()
def encrypt(self, raw):
raw = self._pad(raw)
#iv = Random.new().read(AES.block_size)
# | here is the difference to the iv from decrypt
iv = b'\xe2\xe0l3H\xc42*N\xb0\x152\x98\x9cBh'
cipher = AES.new(self.key, AES.MODE_CBC, iv)
code = cipher.encrypt((raw.encode())) …Run Code Online (Sandbox Code Playgroud) 使用.NET加密敏感信息时 AesCryptoServiceProvider库我为每个加密的值生成一个唯一的初始化向量(IV)。在保存加密数据的数据库记录中,我有一个名为“ IV”的字段,该字段存储用于稍后解密的初始化向量。
可以将初始化矢量与密文一起存储吗?通过将IV附加到密文中也许呢?如果是这样,是否有标准方法?
encryption aes aescryptoserviceprovider initialization-vector
我试着找到答案,自己看这里并在别处搜索了一段时间,但我还是有一些问题.
假设这个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 …Run Code Online (Sandbox Code Playgroud) aes ×7
encryption ×6
java ×5
cryptography ×3
android ×1
javascript ×1
pycrypto ×1
python ×1
random ×1
salt ×1
secret-key ×1
typed-arrays ×1
typescript ×1