标签: initialization-vector

AES Cipher没有拿起IV

我试图使用带有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)

android aes salt initialization-vector

5
推荐指数
1
解决办法
6726
查看次数

需要解决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 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?有什么办法吗?

java aes initialization-vector

5
推荐指数
2
解决办法
5万
查看次数

SecureRandom真的需要生成初始化向量还是足够随机?

为了使流密码能够抵御重复的密钥攻击,IV不应该重复.但是SecureRandom在这方面是否优于简单的非安全随机(或仅用于生成不可预测的序列)?

假设我使用AES CBC模式的固定大小的消息,并且我为每个IV生成一个新的Random(使用当前的纳米时间作为种子),与SecureRandom相比,这是否会增加重复IV的概率?

java random encryption cryptography initialization-vector

5
推荐指数
1
解决办法
1090
查看次数

为什么我的AES Cipher会在init的DECRYPT_MODE上抛出一个InvalidKeyException

为什么这个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")生成,具有随机静态种子集.

谢谢

java encryption aes secret-key initialization-vector

5
推荐指数
1
解决办法
9170
查看次数

AES计数器模式 - 加密库对其初始化向量进行了硬编码

我的工作部门需要使用由另一个部门编写的加密库的权力,问题是加密库已经硬编码了其AES计数器模式初始化向量(全零).(基本上,另一个部门采用了Bouncycastle库并在其周围包装了自己的破解代码.)我们已经记录了此代码的功能问题,所以现在除非管理层决定采取行动,否则我们会使用破坏的加密库.

我想知道我们是否可以通过在明文中添加一个唯一的IV然后在解密后截断明文的前16个字节来伪造正确的初始化向量,例如

ciphertext = encrypt(++sixteenByteCounter + plaintext)
plaintext = decrypt(ciphertext).subArray(16, ciphertext.length)
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎很好,但我不是加密专家

cryptography aes initialization-vector

5
推荐指数
1
解决办法
646
查看次数

密码学:为什么我的加密初始化向量只影响前 16 个字节?

我想尝试加密文件并使用以下堆栈溢出响应。然而,在测试初始化​​向量时,我发现它只影响前 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)

java encryption cryptography initialization-vector

5
推荐指数
1
解决办法
1067
查看次数

如何使用 javascript 使用 localstorage 在浏览器中存储 Uint8array

我有 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

5
推荐指数
1
解决办法
7052
查看次数

AES 256 加密 -> 更改初始化向量会在不知道密钥的情况下稍微更改解密的消息

我通过 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)

python encryption aes pycrypto initialization-vector

5
推荐指数
1
解决办法
1516
查看次数

是否存储初始化向量-单独的字段?

使用.NET加密敏感信息时 AesCryptoServiceProvider库我为每个加密的值生成一个唯一的初始化向量(IV)。在保存加密数据的数据库记录中,我有一个名为“ IV”的字段,该字段存储用于稍后解密的初始化向量。

可以将初始化矢量与密文一起存储吗?通过将IV附加到密文中也许呢?如果是这样,是否有标准方法?

encryption aes aescryptoserviceprovider initialization-vector

4
推荐指数
1
解决办法
623
查看次数

Java AES CTR IV和计数器

我试着找到答案,自己看这里并在别处搜索了一段时间,但我还是有一些问题.

假设这个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)

java encryption aes initialization-vector

4
推荐指数
1
解决办法
5810
查看次数