Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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
Java密码AES未加密整个字符串_Java_Encryption_Cryptography_Aes - Fatal编程技术网

Java密码AES未加密整个字符串

Java密码AES未加密整个字符串,java,encryption,cryptography,aes,Java,Encryption,Cryptography,Aes,我正在尝试使用java密码和AES算法对字符串进行加密和解密。但不知何故,它不想加密整个字符串。我的目标不是安全地加密特定的内容,我希望有人以后不能很容易地读取存储在文件中的字符串 要加密,我使用以下代码: Cipher Cipher=Cipher.getInstanceAES; 字节[]输入=plain.getBytes; cipher.initCipher.ENCRYPT_模式,密钥; 字节[]加密=cipher.doFinalinput; 返回加密的新字符串; 为了解密,我使用以下代码:

我正在尝试使用java密码和AES算法对字符串进行加密和解密。但不知何故,它不想加密整个字符串。我的目标不是安全地加密特定的内容,我希望有人以后不能很容易地读取存储在文件中的字符串

要加密,我使用以下代码:

Cipher Cipher=Cipher.getInstanceAES; 字节[]输入=plain.getBytes; cipher.initCipher.ENCRYPT_模式,密钥; 字节[]加密=cipher.doFinalinput; 返回加密的新字符串; 为了解密,我使用以下代码:

Cipher Cipher=Cipher.getInstanceAES; 字节[]输入=加密的.getBytes; cipher.initCipher.DECRYPT_模式,密钥; 字节[]已解密=cipher.doFinalinput; 返回已解密的新字符串; 为了测试上述代码,我使用以下参数:

SecretKeySpec key=new SecretKeySpecnew byte[]{103,38125,-67,-71,-23,-119102,78,-3,-33,-23,-5,32,-112,-124},AES; 字符串平原=Lorem ipsum door sit amet,concertetur adipsum elit。拍卖馆长奥纳·比本杜姆。 该测试将生成加密后再解密的字符串:

�T���Ѩ�%���Kr sit amet, consectetur adipiscing elit. Curabitur auctor ornare bibendum.

有几个问题:

byte[] encrypted = cipher.doFinal(input);
return new String(encrypted);
问题是,您不能仅仅将字节数组字符串化,您需要以不同的格式表示字节数组,例如Base64或Hex。字符串仅用于可打印字符

同样,在解密之前,您需要将编码的字符串解码为字节数组

编辑:

另一个问题-您应该指定完整的


默认情况下,如果提供了IV初始化向量,AES参数应使用CBC模式;如果IV未定义,AES参数应使用ECB模式。据我所知,这就是Oracle JDK的工作方式

并非所有运行时都能保证。您正在使用哪个平台/jre。由于您的第一个字节块是加扰的,我假设实现是使用random IV,您可以使用密码。获取IV,解密时必须通过IV

cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

IvParameterSpec ivParamSpec = new IvParameterSpec(iv);
SecretKey symmetricKey = new 
SecretKeySpec(encryptionParams.getKey(), SYMMETRIC_KEY_ALG);

cipher.init(Cipher.ENCRYPT_MODE, symmetricKey, ivParamSpec);
对于CBC,IV必须是长度为AES块大小128位=16字节的随机字节数组,通常的做法是将IV前置到密文

请务必了解正确使用加密的相关知识,否则您可能最终会得到不安全的解决方案


我有一个你可以尝试使用的小软件。

有几个问题:

byte[] encrypted = cipher.doFinal(input);
return new String(encrypted);
问题是,您不能仅仅将字节数组字符串化,您需要以不同的格式表示字节数组,例如Base64或Hex。字符串仅用于可打印字符

同样,在解密之前,您需要将编码的字符串解码为字节数组

编辑:

另一个问题-您应该指定完整的


默认情况下,如果提供了IV初始化向量,AES参数应使用CBC模式;如果IV未定义,AES参数应使用ECB模式。据我所知,这就是Oracle JDK的工作方式

并非所有运行时都能保证。您正在使用哪个平台/jre。由于您的第一个字节块是加扰的,我假设实现是使用random IV,您可以使用密码。获取IV,解密时必须通过IV

cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

IvParameterSpec ivParamSpec = new IvParameterSpec(iv);
SecretKey symmetricKey = new 
SecretKeySpec(encryptionParams.getKey(), SYMMETRIC_KEY_ALG);

cipher.init(Cipher.ENCRYPT_MODE, symmetricKey, ivParamSpec);
对于CBC,IV必须是长度为AES块大小128位=16字节的随机字节数组,通常的做法是将IV前置到密文

请务必了解正确使用加密的相关知识,否则您可能最终会得到不安全的解决方案


我有一个小参数,您可以尝试使用。

默认情况下,如果提供了IV初始化向量,AES参数应使用CBC模式,如果IV未定义,则应使用ECB模式。据我所知,这就是Oracle JDK的工作方式。没有。它只是在初始化时选择ECB模式,然后如果提供IV,则在初始化时失败。唯一的延迟操作是根据密钥afaik选择提供程序。@MaartenBodewes我保持更正。然而,在问题中,我发现没有提供IV,并且第一个块被置乱,这意味着CBC模式与错误的IV零向量?一起使用?。我会对JRE verion/platform感到好奇,因为编码的无效使用会对密文的大部分造成干扰,而不仅仅是第一个块。也可能是第一个密文块由于编码错误而损坏,这是我唯一能想到的。如果密文字符被替换为� 然后是的。。。通常,只有在完全了解询问者的实际情况时,您才会发现,有时这只是复制或诸如此类的奇怪错误。默认情况下,如果提供了IV初始化向量,AES参数应使用CBC模式,如果IV未定义,则应使用ECB模式。据我所知,Oracle JDK就是这样工作的。没有。它只是在初始化时选择ECB模式,然后如果提供IV,则在初始化时失败。唯一的延迟操作是根据密钥afaik选择提供程序。@MaartenBodewes我保持更正。然而,在问题中,我看到没有提供IV,并且第一个块被加扰,这意味着CBC模式与wro一起使用
零向量?。我会对JRE verion/platform感到好奇,因为编码的无效使用会对密文的大部分造成干扰,而不仅仅是第一个块。也可能是第一个密文块由于编码错误而损坏,这是我唯一能想到的。如果密文字符被替换为� 然后是的。。。通常只有当询问者的实际情况被完全了解时,你才会发现,有时只是抄袭或诸如此类的奇怪错误。