Red de conocimiento del abogados - Ley de patentes - javax.crypto.BadPaddingException: el bloque final dado no se completó correctamente

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.