Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/27.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_Aes_Badpaddingexception - Fatal编程技术网

Java AES字符串解密“给定的最终块未正确填充” 对于所有的仇恨者,我读了很多像这样的主题,其中没有一个是有帮助的。

Java AES字符串解密“给定的最终块未正确填充” 对于所有的仇恨者,我读了很多像这样的主题,其中没有一个是有帮助的。,java,encryption,aes,badpaddingexception,Java,Encryption,Aes,Badpaddingexception,这儿还是这儿 我想先加密然后解密字符串。阅读许多关于 给定最后一个块未正确填充异常,但这些解决方案中没有一个有效 我的班级: 有人知道在这里换什么钥匙吗?*。最后的方法是什么?让它工作 @对于那些好奇的人来说,方法必须是静态的,因为这是更大事物的一部分 加密的结果是二进制数据。在大多数情况下,它不能被解释为有效的字符串编码。因此,对new Stringencrypted的调用很可能会扭曲加密的字节,在执行packet.getBytes之后,您将得到一个包含不同内容的字节数组 解密现在失败,因为密

这儿还是这儿

我想先加密然后解密字符串。阅读许多关于 给定最后一个块未正确填充异常,但这些解决方案中没有一个有效

我的班级:

有人知道在这里换什么钥匙吗?*。最后的方法是什么?让它工作


@对于那些好奇的人来说,方法必须是静态的,因为这是更大事物的一部分

加密的结果是二进制数据。在大多数情况下,它不能被解释为有效的字符串编码。因此,对new Stringencrypted的调用很可能会扭曲加密的字节,在执行packet.getBytes之后,您将得到一个包含不同内容的字节数组

解密现在失败,因为密码文本已更改。填充字节未正确恢复,无法删除


要解决这个问题,不要将密码文本转换为字符串,保留字节数组。

加密的结果是二进制数据。在大多数情况下,它不能被解释为有效的字符串编码。因此,对new Stringencrypted的调用很可能会扭曲加密的字节,在执行packet.getBytes之后,您将得到一个包含不同内容的字节数组

解密现在失败,因为密码文本已更改。填充字节未正确恢复,无法删除

要解决此问题,请不要将密码文本转换为字符串,请保留字节数组。

使用byte[]packet2=packet.getBytes时,您正在基于默认编码(例如,可能是UTF-8)转换字符串。那很好。但是,然后您将密文转换回如下字符串:return packet=new Stringencrypted,如果在稍后的解密过程中没有使用另一个字节[]packet2=packet.getBytes往返到同一字节数组,那么这可能会给您带来麻烦

试试这个:return packet=new Stringencrypted,ISO-8859-1,byte[]packet2=packet.getBytesISO-8859-1-这不是我想要的,但是它应该往返字节数组。

当您使用byte[]packet2=packet.getBytes时,您正在基于默认编码转换字符串,例如UTF-8。那很好。但是,然后您将密文转换回如下字符串:return packet=new Stringencrypted,如果在稍后的解密过程中没有使用另一个字节[]packet2=packet.getBytes往返到同一字节数组,那么这可能会给您带来麻烦


请尝试以下操作:return packet=new Stringencrypted,ISO-8859-1,byte[]packet2=packet.getBytesISO-8859-1-这不是我想要的,但它应该往返于字节数组。

您可以在此处检查或阅读这两个链接。他们都没有解决这个问题的办法,为什么-1?我写道,我读了很多像这样的话题,只是因为我讨厌仇恨。你可以在这里查看,或者之前阅读这两个链接。他们都没有解决这个问题的办法,为什么-1?我写道,我读了很多像这样的话题,只是因为我讨厌hatersI不能保留字节数组,这就是重点;字符串还保留填充的字节。当我想要打印它时,它会打印类似于此打印文本的内容,其中[]如果必须将字节数组转换为字符串,则使用可以恢复二进制内容的编码,如base64。不幸的是,base64不支持符号等,AES使用它们:我应该搜索这种编码;Base64不支持'。如果将扩展ASCII 0xC2'进行Base64编码,则得到w4I=。您可以将明文的字节数组加密为密文的字节数组,然后对密文进行Base64编码以携带它。解码密文将密文的字节数组解密为明文的字节数组。我不能保留字节数组,这就是重点;字符串还保留填充的字节。当我想要打印它时,它会打印类似于此打印文本的内容,其中[]如果必须将字节数组转换为字符串,则使用可以恢复二进制内容的编码,如base64。不幸的是,base64不支持符号等,AES使用它们:我应该搜索这种编码;Base64不支持'。如果将扩展ASCII 0xC2'进行Base64编码,则得到w4I=。您可以将明文的字节数组加密为密文的字节数组,然后对密文进行Base64编码以携带它。解码密文将密文的字节数组解密为明文的字节数组。
package aes;

import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.swing.JOptionPane;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;

public class EncryptionExample {

private static SecretKeySpec    key;
private static IvParameterSpec  ivSpec;
private static Cipher           cipher; 
private static byte[]           keyBytes;
private static byte[]           ivBytes;
private static int              enc_len;

public static void generateKey() throws Exception
        {
        
            String complex = new String ("9#82jdkeo!2DcASg");
            keyBytes = complex.getBytes();
            key = new SecretKeySpec(keyBytes, "AES");

            complex = new String("@o9kjbhylK8(kJh7"); //just some randoms, for now
            ivBytes = complex.getBytes();
            ivSpec = new IvParameterSpec(ivBytes);

            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        }
        
        public static String encrypt(String packet) throws Exception
        {
            byte[] packet2 = packet.getBytes();
            cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
            byte[] encrypted = new byte[cipher.getOutputSize(packet2.length)];
            enc_len = cipher.update(packet2, 0, packet2.length, encrypted, 0);
            enc_len += cipher.doFinal(encrypted, enc_len);
            
            return packet = new String(encrypted);
        }
        
        public static String decrypt(String packet) throws Exception
        {
            byte[] packet2 = packet.getBytes();
            cipher.init(Cipher.DECRYPT_MODE, key, ivSpec);
            byte[] decrypted = new byte[cipher.getOutputSize(enc_len)];
            int dec_len = cipher.update(packet2, 0, enc_len, decrypted, 0);
HERE EXCEPTION>>>>> dec_len += cipher.doFinal(decrypted, dec_len);  <<<<<<<<<
            
            return packet = new String(decrypted);
        }
        
        
        // and display the results
    public static void main (String[] args) throws Exception 
    {
        
          // get the text to encrypt
        generateKey();
        String inputText = JOptionPane.showInputDialog("Input your message: ");
        
        String encrypted = encrypt(inputText);
        String decrypted = decrypt(encrypted);            
                
        JOptionPane.showMessageDialog(JOptionPane.getRootFrame(),
                    "Encrypted:  " + new String(encrypted) + "\n"
                      +  "Decrypted: : " + new String(decrypted));
          .exit(0);
    }
}
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:479)
at javax.crypto.Cipher.doFinal(Cipher.java:2068)
at aes.EncryptionExample.deszyfrujBez(EncryptionExample.java:HERE tag)
at aes.EncryptionExample.main(EncryptionExample.java:Main starting)