Получение ошибок при попытке расшифровать файл - PullRequest
0 голосов
/ 27 декабря 2018
package test;

/**
 * Created by
 * newbme on 12/25/2018.
 */
    import javax.crypto.Cipher;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.spec.IvParameterSpec;
    import javax.crypto.spec.SecretKeySpec;

    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.UnsupportedEncodingException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;

    public class MyJava {



        /**
         * IT IS THIS CLASS THAT WILL ENCRYPT OR DECRYPT
         * ANY  FILE
         */

        private static final String SECRET_KEY_1 = "ssdkF$HUy2A#D%kd";
        private static final String SECRET_KEY_2 = "weJiSEvR5yAC5ftB";
        private IvParameterSpec ivParameterSpec;
        private SecretKeySpec secretKeySpec;
        private Cipher cipher;
        private File from,to;
        private static boolean trouble =false;





        /**
         * CBC MODE
         */
        public MyJava(File from,File to) throws UnsupportedEncodingException, NoSuchPaddingException, NoSuchAlgorithmException {
            ivParameterSpec = new IvParameterSpec(SECRET_KEY_1.getBytes("UTF-8"));
            secretKeySpec = new SecretKeySpec(SECRET_KEY_2.getBytes("UTF-8"), "AES");
            cipher = Cipher.getInstance("AES/CBC/PKCS5PADDING");
            //INITIALIZE THE PLACE TO READ AND SAVE FILE
             this.from =from;
             this.to =to;

            //if the desination doesnt exists create it
            if(! this.to .exists()){
                try {
                    this.to.getParentFile().mkdirs();
                    this.to.createNewFile();
                }catch (Exception ex){
                    ex.printStackTrace();
                }
            }
            }




        /**
         *
         * USE THIS METHOD TO ENCRYPT ANYTHING
         */
        public boolean encrypt()throws Exception{
            FileInputStream fis =null;
            FileOutputStream fos=null;
            boolean success =false;
                try {
                    cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
                    //read the file into memory
                     fis = new FileInputStream(from);
                     fos = new FileOutputStream(to);
                    byte [] inBytes = new byte[50*1024];
                    int count;
                    while( ( count = fis.read(inBytes)) > 0){
                            byte encrypted[]  = cipher.doFinal(inBytes);
                            fos.write(encrypted,0,count);
                            fos.flush();
                    }
                    success =true;
                }catch(InvalidKeyException ivke){
                    ivke.printStackTrace();
                    trouble = true;
                }finally{
                    if(fis!=null)fis.close();
                    if(fos!=null)fos.close();
                }
            //return Base64.encodeBase64String(encrypted);
            return success;
        }






        /**
         *
         * USE THIS METHOD TO DECRYPT ANYTHING
         */
        public boolean decrypt() throws Exception{
         FileInputStream fis =null;
         FileOutputStream fos=null;
         boolean success =false;
         try {
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
            //read the file into memory
            fis = new FileInputStream(from);
            fos = new FileOutputStream(to);
            byte [] inBytes = new byte[50*1024];
            int count;
            while( ( count = fis.read(inBytes)) > 0){
                byte decrypted[]  = cipher.doFinal(inBytes);//this line fails
                fos.write(decrypted,0,count);
                fos.flush();
            }
            success =true;
        }catch(InvalidKeyException ivke){
             trouble = true;
            ivke.printStackTrace();
        }finally{
            if(fis!=null)fis.close();
            if(fos!=null)fos.close();
        }
        //return Base64.encodeBase64String(encrypted);
        return success;
    }

        private static boolean isInvalidKeyException(){
            return trouble;
        }

    public static void main(String [] R){
         File f = new File(PATH);
        //encrypt
         new MyJava(f,new File("c:/logs1/"+f.getName())).encrypt();
                         //Toast.makeText(context,"to decrypt",Toast.LENGTH_LONG).show();
        //decrypt
                            new MyJava(f,new File("c:/logs2/"+f.getName())).decrypt();
        }
    }

Ошибка:

D/OpenSSLLib: OpensslErr:Module:30(101:); file:external/boringssl/src/crypto/cipher/cipher.c ;Line:460;Function:EVP_DecryptFinal_ex
W/System.err: javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT
W/System.err:     at com.android.org.conscrypt.NativeCrypto.EVP_CipherFinal_ex(Native Method)
W/System.err:     at com.android.org.conscrypt.OpenSSLCipher$EVP_CIPHER.doFinalInternal(OpenSSLCipher.java:568)
W/System.err:     at com.android.org.conscrypt.OpenSSLCipher.engineDoFinal(OpenSSLCipher.java:350)
W/System.err:     at javax.crypto.Cipher.doFinal(Cipher.java:2056)
W/System.err:     at com.presentapps.aiapp.utility.AISCipher.decrypt(AISCipher.java:122)
W/System.err:     at com.presentapps.aiapp.popups.ActionPop$1.onClick(ActionPop.java:65)

Здравствуйте, я пытался зашифровать файл, который может быть текстовым файлом или музыкальным файлом и т. Д. Программа как бы шифрует его без каких-либоисключение, однако, когда я пытаюсь расшифровать, он вызывает исключение.Я пытался использовать режим CBC, чтобы он работал уже несколько дней, может кто-нибудь помочь указать на мои ошибки?

И, на самом деле, я запускаю его на устройстве Android, поэтому я изменил корневую часть с помощью "c:" во время публикации на SO, опубликованная ошибка была получена из консоли отладчика на AS

IЯ новичок в Java, просто улучшаю свое обучение, поэтому любая помощь приветствуется.Спасибо.

1 Ответ

0 голосов
/ 27 декабря 2018

Обратите внимание, что реальный код должен использовать не секретный случайный IV для каждого шифрования, а не фиксированный, секретный IV.Пароли должны использовать функцию хеширования паролей для преобразования в ключи.PBKDF2 доступен для Android и Java для этой цели.

Существует ряд проблем с вашим кодом:

  • Вы звоните Cipher.doFinal() каждый раз через цикл.В сочетании с фиксированным IV, результат фактически эквивалентен режиму ECB и, следовательно, небезопасен.Используйте Cipher.update() для всех промежуточных блоков до последнего блока, затем вызовите Cipher.doFinal().
  • Вы предоставляете неверные данные для шифрования и дешифрования каждый раз, когда читаете меньше полного буфера в inBytes.
  • count - количество прочитанных байтов, необязательно размером encrypted.Вы должны вывести именно содержимое encrypted, а не какой-то его фрагмент.
  • Ваш основной метод шифрует файл на PATH и записывает результат в c:/logs1/PATH.Затем он пытается расшифровать файл на PATH, но этот файл является открытым текстом, а не зашифрованным текстовым файлом.

Вот исправленные методы encrypt и decrypt:

public boolean encrypt() throws Exception {
    FileInputStream fis = null;
    FileOutputStream fos = null;
    boolean success = false;
    try {
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);
        //read the file into memory
        fis = new FileInputStream(from);
        fos = new FileOutputStream(to);
        byte[] inBytes = new byte[50 * 1024];
        int count;
        while ((count = fis.read(inBytes)) > 0) {
            byte encrypted[] = cipher.update(inBytes, 0, count);
            fos.write(encrypted);
        }
        byte encrypted[] = cipher.doFinal();
        fos.write(encrypted);
        fos.flush(); // redundant, since closing the stream will flush it.
        success = true;
    } catch (InvalidKeyException ivke) {
        ivke.printStackTrace();
        trouble = true;
    } finally {
        if (fis != null) fis.close();
        if (fos != null) fos.close();
    }
    //return Base64.encodeBase64String(encrypted);
    return success;
}

public boolean decrypt() throws Exception {
    FileInputStream fis = null;
    FileOutputStream fos = null;
    boolean success = false;
    try {
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
        //read the file into memory
        fis = new FileInputStream(from);
        fos = new FileOutputStream(to);
        byte[] inBytes = new byte[50 * 1024];
        int count;
        while ((count = fis.read(inBytes)) > 0) {
            byte decrypted[] = cipher.update(inBytes, 0, count);
            fos.write(decrypted);
        }
        byte decrypted[] = cipher.doFinal();
        fos.write(decrypted);
        fos.flush();
        success = true;
    } catch (InvalidKeyException ivke) {
        trouble = true;
        ivke.printStackTrace();
    } finally {
        if (fis != null) fis.close();
        if (fos != null) fos.close();
    }
    //return Base64.encodeBase64String(encrypted);
    return success;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...