javax.crypto.BadPaddingException: el bloque final dado no se completó correctamente
Para implementar el relleno con PKCS7Padding en el lado de Java, debe utilizar el componente bouncycastle. Proporcionaré la descarga de este paquete a continuación.
¡Aquí hay una prueba simple, código!
001 paquete?com.encrypt.file;
002 import?java.io.UnsupportedEncodingException
003 importjava.security.Key ?
006 importar?java.security.Security;
007
008 importarjavax.crypto.Cipher ?
009 importarjavax.crypto.SecretKey; ?
010 importjavax.crypto.spec.SecretKeySpec; ?
011
012 public?classAES256Encryption{ ?
013 ?
014 ? /**
015 ? * Algoritmo de clave
016 * Java6 admite claves de 56 bits y bouncycastle admite 64 bits
017 ? * */> ?
018 public?static?finalString KEY_ALGORITHM="AES"; ?
019
020 /**
021 ? * Algoritmo de cifrado/descifrado/modo de trabajo/método de relleno
022 ? * ?
023 * JAVA6 admite el método de relleno PKCS5PADDING
024 ? * El castillo hinchable admite el método de relleno PKCS7Padding
025 ? * */ ?
026 public?static?finalString CIPHER_ALGORITHM="AES/ECB/PKCS7Padding"; p>
027 ?
028 /**
029 ? * ?
030 * Generar claves, java6 solo admite claves de 56 bits, bouncycastle admite claves de 64 bits
031 ? * @return byte[] clave binaria
032 ? * */?
033 public?static? ] initkey()?throwsException{ ?
034 ?
035 ////¿Crear una instancia del generador de claves?
036 // Security.addProvider(new) org.bouncycastle.jce.provider.BouncyCastleProvider());
037 // KeyGenerator kg=KeyGenerator.getInstance(KEY_ALGORITHM, "BC"); //Inicializa el generador de claves, AES requiere que la longitud de la clave sea de 128 bits
, 192 bits, 256 bits?
039 ////? kg.init(256 ?
040 ////? kg.init(128);
041 ///? //¿Generar una clave?
042 ///? SecretKey secretKey=kg.generateKey() ?
043 //Obtener el binario clave secreta ¿Formulario de codificación de clave?
044 // return secretKey.getEncoded() ?
045 //Para facilitar la prueba, he codificado la clave aquí. Es necesario generarlo automáticamente, se puede utilizar el código comentado anteriormente
046 return?new?byte[] {?0x08,?0x08,?0x04,?0x0b,?0x02,?0x0f,?0x0b ,?0x0c,
047 0x01,?0x03,?0x09,?0x07,?0x0c,?0x03,?0x07,?0,?0x04,?0x0f,
048 0x06 ,?0x0f,?0x0e, ?0x09, ?0x05, ?0x01, ?0, ?0, ?0x01, ?0x09,
049 0x06, ?0x07, ?0x09, ?0x0d?}; /p>
050 }
051
052 /**
053 ? * Clave de conversión
054 ? @param key clave binaria
055 ? * @return Key
056 ? * */?
057 public?static?Key toKey(byte[] clave )?throwsException { ?
058 //¿Crear una instancia de clave DES?
059 //¿Generar clave?
060 SecretKey secretKey=newSecretKeySpec(key, KEY_ALGORITHM); ?
061 returnsecretKey ?
062 } ?
063
064 /**
065 ? * Datos cifrados
066 ? * @param datos a cifrar
067 ? * @param clave Clave
068 ? Datos cifrados
069 ? * */ ?
070 public?static?byte[] encrypt(byte[] datos, byte[] clave)?throwsException{ ?
p>071 //¿Restaurar clave?
072 Clave k=toKey(key); ?
073 /**
074 * ¿Creación de instancias?
075? * Utilice el método de llenado PKCS7PADDING e impleméntelo de la siguiente manera, que consiste en llamar a bouncyc.
implementación del componente astle
076 ? * Cipher.getInstance(CIPHER_ALGORITHM, "BC")
077 */?
078 Security.addProvider(new?org .bouncycastle.jce.provider.BouncyCastleProvider());
079 Cipher cipher=Cipher.getInstance(CIPHER_ALGORITHM,?"BC");
080 //Inicialización, establecida en ¿Modo de cifrado?
081 cipher.init(Cipher.ENCRYPT_MODE, k); ?
082 //¿Realizar la operación?
083 returncipher.doFinal(data) ?
084 } ?
085 /**
086 ? * Datos descifrados
087 * @param datos Datos descifrados
088 ? * @param clave clave
089 ? * @return byte[] Datos descifrados
090 ?
091 public?static?byte[] decrypt(byte[] datos, byte[] clave)?throwsException{ ?
092 //¿Clave de bienvenida?
093 Clave k =toKey(key); ?
094 /**
095 ? * Creación de instancias
096 * Utilice el método de llenado PKCS7PADDING, de la siguiente manera. es llamar al componente bouncycastle para lograrlo
097 ? * Cipher.getInstance(CIPHER_ALGORITHM, "BC")
098 */ ?
099 Cipher cipher =Cipher.getInstance(CIPHER_ALGORITHM); ?
100 //Inicialización, configurado en modo de descifrado
101 cipher.init(Cipher.DECRYPT_MODE, k ?
102 //¿Realizar operación?
103 returncipher.doFinal(data ?
104 } ?
105 /**
106 ? * @param args
107 ? * @throws UnsupportedEncodingException
108 * @throws ¿Excepción?
109 ? /p >
110 public?static?void?main(String[] args)?throwsUnsupportedEncodingExceptio
n{ ?
111 ?
112 Cadena str="AES" ?
113 System.out.println("texto original: " str); ?
114 ?
115 //¿Clave de inicialización?
Clave 116 bytes[]
117 ¿Intentar?{
118 clave = AES256Encryption.initkey();
119 System.out.print("Clave: ");
120 for(int?i =? 0); ilt; clave.longitud; i ){
121 System.out.printf("x", clave[i]); 123 System.out.print("\n");
124 //¿Datos cifrados?
125 bytes[] data=AES256Encryption.encrypt(str.getBytes(), clave ?
126 System.out.print("Después del cifrado:");
127 for(int?i =?0; ilt; data.length; i ) {
128 System.out.printf("x", datos[i]);
129 }
130 System.out.print("\ n); ");
131 ?
132 //¿Descifrar datos?
133 data=AES256Encryption.decrypt(datos, clave); ?
134 System.out.println("Después del descifrado: " newString(data));
135 }?catch?(Exception e) {
136 // TODO Auto - bloque de captura generado
137 e.printStackTrace()
138 } ?
139
140 } ?
141 }
Captura de pantalla del resultado después de ejecutar el programa:
Para ejecutar el programa, necesita crear usted mismo una aplicación sencilla, con un diseño simple:
Texto cifrado cifrado:
Puede ver que el texto cifrado aquí es consistente con el texto cifrado en el lado de Java, por lo que lo hemos completado con éxito. Siempre que el texto cifrado y la clave sean coherentes, no debería haber ningún problema con el descifrado. Si necesita descifrar más tarde, puede llamar al método de descifrado usted mismo.
Enlace de descarga jce_policy-6.zip:/technetwork/java/javase/downloads/jce-6-download-429243.html
Después de descargar y descomprimir, descomprima los dos paquetes jar dentro (local_policy.jar, US_export_policy.jar) reemplace los dos paquetes en la carpeta de seguridad en la ruta de instalación de jdk.
Java es un lenguaje de programación orientado a objetos que puede escribir software de aplicación multiplataforma. La tecnología Java tiene una excelente versatilidad, eficiencia, portabilidad de plataforma y seguridad. Se usa ampliamente en PC, centros de datos, consolas de juegos, supercomputadoras científicas, teléfonos móviles e Internet. También cuenta con la comunidad profesional de desarrolladores más grande del mundo.