Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javaaes加密问题_Java_Encryption_Aes_Salt_Crypt - Fatal编程技术网

javaaes加密问题

javaaes加密问题,java,encryption,aes,salt,crypt,Java,Encryption,Aes,Salt,Crypt,每次使用AES更改加密值时,请让任何人调查以下代码并告诉我问题 代码: 输出 我第一次得到下面的加密字符串 CZRIP35M4CnJtuDQ6YpmaQ== /fylTjohAZDsnCaHhiZo3A== 第二次我得到下面的加密字符串 CZRIP35M4CnJtuDQ6YpmaQ== /fylTjohAZDsnCaHhiZo3A== 我有三个问题: 为什么加密字符串不是常量 如何设置块大小?(AES.BlockSize=128;) 如何设置填充模式?(AES.Padding=Paddi

每次使用AES更改加密值时,请让任何人调查以下代码并告诉我问题

代码:

输出 我第一次得到下面的加密字符串

CZRIP35M4CnJtuDQ6YpmaQ==
/fylTjohAZDsnCaHhiZo3A==
第二次我得到下面的加密字符串

CZRIP35M4CnJtuDQ6YpmaQ==
/fylTjohAZDsnCaHhiZo3A==
我有三个问题:

  • 为什么加密字符串不是常量

  • 如何设置块大小?(
    AES.BlockSize=128;

  • 如何设置填充模式?(
    AES.Padding=PaddingMode.PKCS7;

  • 1) 加密文本总是不同的,因为密码初始化提供它自己的IV,因为您没有提供。为了获得一致的输出,您需要提供您“计算”的IV。请记住,无论这段代码最终打算做什么,您都不希望多次使用IV

    2) 密钥大小可以是128、192或256,但块大小始终为128

    3) Java只提供PKCS5,但是AES的实现没有区别。看

    正如已经指出的,所提供的代码存在一些问题,例如第一行实际上没有做任何事情,key和iv都未初始化。我还建议您使用SecureRandom来初始化密钥和iv。如果您计划只使用一个AES密钥,这可以计算一次并放入代码或配置文件中,而不是每次运行PBKDF2。

    1)加密文本总是不同的,因为密码初始化提供了自己的IV,因为您没有提供。为了获得一致的输出,您需要提供您“计算”的IV。请记住,无论这段代码最终打算做什么,您都不希望多次使用IV

    2) 密钥大小可以是128、192或256,但块大小始终为128

    3) Java只提供PKCS5,但是AES的实现没有区别。看

    正如已经指出的,所提供的代码存在一些问题,例如第一行实际上没有做任何事情,key和iv都未初始化。另外,我建议您使用SecureRandom来初始化密钥和iv。如果您计划只使用一个AES密钥,则可以计算一次并将其放入代码或配置文件中,而不是每次都运行PBKDF2

  • 对于第一个问题,@Freiheit已经回答了。 长话短说,基于iv(初始化向量),它充当salt,每个加密都不同。 话虽如此,加密相同的纯文本将产生不同的加密文本,但解密(如有必要)将返回相同的纯文本。 IV有助于使加密可预测。 在数据库中为两个不同的用户存储相同的密码将具有不同的值,但将是相同的密码

  • 配置了当前密码后,您已经有128个块大小。您可以阅读更多有关不同密码转换的信息。您还可以找到不同算法的块大小的更多信息

  • 您只需将
    Cipher.getInstance()
    更改为
    AES/CBC/PKCS7Padding
  • 对于第一个问题,@Freiheit已经回答了。 长话短说,基于iv(初始化向量),它充当salt,每个加密都不同。 话虽如此,加密相同的纯文本将产生不同的加密文本,但解密(如有必要)将返回相同的纯文本。 IV有助于使加密可预测。 在数据库中为两个不同的用户存储相同的密码将具有不同的值,但将是相同的密码

  • 配置了当前密码后,您已经有128个块大小。您可以阅读更多有关不同密码转换的信息。您还可以找到不同算法的块大小的更多信息

  • 您只需将
    Cipher.getInstance()
    更改为
    AES/CBC/PKCS7Padding

  • 除了@micker提供的答案之外,您还需要调用另一个版本的
    Cipher.init()
    ;一个考虑到第四个因素的因素:

    ...
    byte[] iv = new byte[16];
    IvParameterSpec ivSpec = new IvParameterSpec(iv); // <= Wrap your IV bytes here.
    SecretKeySpec secret = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secret, ivSpec); // <= Add IV here.
    ...
    
    。。。
    字节[]iv=新字节[16];
    
    IvParameterSpec ivSpec=新的IvParameterSpec(iv);// 除了@micker提供的答案之外,您还需要调用另一个版本的
    Cipher.init()
    ;一个考虑到第四个因素的因素:

    ...
    byte[] iv = new byte[16];
    IvParameterSpec ivSpec = new IvParameterSpec(iv); // <= Wrap your IV bytes here.
    SecretKeySpec secret = new SecretKeySpec(key, "AES");
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    cipher.init(Cipher.ENCRYPT_MODE, secret, ivSpec); // <= Add IV here.
    ...
    
    。。。
    字节[]iv=新字节[16];
    
    IvParameterSpec ivSpec=新的IvParameterSpec(iv);//salt值在每次执行时都会改变吗?@Freiheit抱歉,我不知道如何检查salt值?当我打印salt值时,它会显示为[0,0,0,0,0,0,0,0,0,0,0,0,0],你是否意识到你总是使用一个充满0的字节数组作为键,并且前4行代码没有任何作用?你也从不使用静脉注射?你为什么关心输出?重要的是它可以用相同的密钥解密。salt的值在每次执行时都会改变吗?@Freiheit抱歉,我不知道如何检查salt的值。当我打印salt的值时,它会显示为[0,0,0,0,0,0,0,0,0,0,0],你意识到你总是使用一个充满0的字节数组作为你的密钥吗,而且前4行代码什么都不做?你也从不使用静脉注射?你为什么关心输出?重要的是它可以用相同的密钥解密。CBC IV必须。CBC IV必须。1。嗯,有点,但是IV和盐是不能互换的。2.对3.第一。嗯,有点,但是IV和盐是不能互换的。2.对3.不