Я работаю над набором программ, которые шифруют данные, а затем дешифруют их снова (чтобы создать документ, который должен быть проверен офисом).
Я использую DES для пользовательских данных, а затем шифрую ключ DES с помощью открытого ключа офиса, эта часть не генерирует ошибок, но когда я пытаюсь расшифровать ключ и использовать его следующим образомпоявляется ошибка: javax.crypto.BadPaddingException: учитывая, что последний блок заполнен неправильно.
Я искал эту ошибку, но так как ни один из найденных случаев не похож на мой,Я не могу найти, что не так.
Вот код, который я использую для генерации и шифрования ключа DES (шифрование выполняется путем извлечения открытого ключа из файла):
//create DES key
KeyGenerator generadorDES = KeyGenerator.getInstance("DES");
generadorDES.init(56);
SecretKey claveDES = generadorDES.generateKey();
//encrypt data with DES key
Cipher cifradorDES = Cipher.getInstance("DES/ECB/PKCS5Padding");
cifradorDES.init(Cipher.ENCRYPT_MODE, claveDES);
byte[] bufferDatos = datosJson.getBytes();
byte[] datosCifrados = cifradorDES.doFinal(bufferDatos);
//encrypt DES key
Security.addProvider(new BouncyCastleProvider());
KeyFactory keyFactoryRSA = KeyFactory.getInstance("RSA", "BC");
File ficheroClavePublica = new File(args[2] + ".publica");
int tamanoFicheroClavePublica = (int) ficheroClavePublica.length();
byte[] bufferPub = new byte[tamanoFicheroClavePublica];
FileInputStream in = new FileInputStream(ficheroClavePublica);
in.read(bufferPub, 0, tamanoFicheroClavePublica);
in.close();
X509EncodedKeySpec clavePublicaSpec = new X509EncodedKeySpec(bufferPub);
PublicKey clavePublicaOficina = keyFactoryRSA.generatePublic(clavePublicaSpec);
Cipher cifradorRSAOficina = Cipher.getInstance("RSA", "BC");
cifradorRSAOficina.init(Cipher.ENCRYPT_MODE, clavePublicaOficina);
byte[] claveDESCifrada = cifradorRSAOficina.doFinal(claveDES.getEncoded());
Затем я сохраняю его вместе с остальными данными, и когда наступает очередь офиса для расшифровки, это код (опять же, закрытый ключ извлекается файлом):
//decrypt DES key
File ficheroClavePrivada = new File(args[2] + ".privada");
int tamanoFicheroClavePrivada = (int) ficheroClavePrivada.length();
byte[] bufferPriv = new byte[tamanoFicheroClavePrivada];
FileInputStream in = new FileInputStream(ficheroClavePrivada);
in.read(bufferPriv, 0, tamanoFicheroClavePrivada);
in.close();
PKCS8EncodedKeySpec clavePrivadaSpec = new PKCS8EncodedKeySpec(bufferPriv);
PrivateKey clavePrivadaOficina = keyFactoryRSA.generatePrivate(clavePrivadaSpec);
Cipher cifradorRSA = Cipher.getInstance("RSA", "BC");
cifradorRSA.init(Cipher.DECRYPT_MODE, clavePrivadaOficina);
byte[] claveSecretaB = cifradorRSA.doFinal(claveDESCifrada);
SecretKeyFactory secretKeyFactoryDES = SecretKeyFactory.getInstance("DES");
DESKeySpec DESspec = new DESKeySpec(claveSecretaB);
SecretKey claveSecreta = secretKeyFactoryDES.generateSecret(DESspec);
//decrypt user data
byte[] datosPeregrinoCifrados = paqueteCred.getContenidoBloque("datosPeregrino");
Cipher cifradorDES = Cipher.getInstance("DES/ECB/PKCS5Padding");
cifradorDES.init(Cipher.DECRYPT_MODE, claveSecreta);
byte[] datosPeregrinoDES = cifradorDES.doFinal(datosPeregrinoCifrados);
В соответствии с ошибкой,исключение в последней строке. Я думаю, что это весь соответствующий код для исполнения, и снова я не уверен, что может быть не так. Заранее спасибо.