javax.crypto.BadPaddingException: данный последний блок не заполнен должным образом. [Проблема с использованием расшифрованного ключа DES] - PullRequest
1 голос
/ 19 октября 2019

Я работаю над набором программ, которые шифруют данные, а затем дешифруют их снова (чтобы создать документ, который должен быть проверен офисом).

Я использую 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);

В соответствии с ошибкой,исключение в последней строке. Я думаю, что это весь соответствующий код для исполнения, и снова я не уверен, что может быть не так. Заранее спасибо.

...