2017-10-14 1 views
-1

Je fais le cryptage et le décryptage du document. Initialement j'ai lu le fichier dans le tableau d'octets et ai passé ce tableau d'octets à ma méthode chiffrée. Jusqu'à 50 Mo de taille, je suis capable de crypter le fichier sans aucun problème. Mais si j'augmente mon fichier SIZE à 80 Mo, il est faling dans cipher.doFinal() en disant hors de memoryException. Alors, comment crypter un fichier plus gros sans aucun problème? et aussi la méthode doFinal() a une limitation de taille. S'il vous plaît, faites-moi savoir. et voici mon code:comment décrypter avec decipher.doFinal (file_encrypt)

decrypt public String (byte [] file_encrypt) throws Exception {

String key22 = myKey; 
    byte[] b = key22.getBytes(); 

    final SecretKey key = new SecretKeySpec(b, "DESede"); 
    final IvParameterSpec iv = new IvParameterSpec(new byte[8]); 
    final Cipher decipher = Cipher.getInstance("DESede/CBC/NoPadding"); 
    decipher.init(Cipher.DECRYPT_MODE, key, iv);  
    final byte[] plainText = decipher.doFinal(file_encrypt); 


    try { 
     String dir = Environment.getExternalStorageDirectory() + File.separator + ".android"; 
     String dir2 = Environment.getExternalStorageDirectory() + File.separator + ".android/.androidmain"; 
     File folder = new File(dir); //folder name 
     File folder2 = new File(dir2); //folder name 
     if (!folder.exists()) 
      folder.mkdirs(); 
     if (!folder2.exists()) 
      folder2.mkdirs(); 

     File file = new File(Environment.getExternalStorageDirectory() + File.separator + ".android/.androidmain/file"); 


     if (file.exists()) { 
      // Toast.makeText(contInst, "111", Toast.LENGTH_SHORT).show(); 
     } else { 
      // Toast.makeText(contInst, "3333", Toast.LENGTH_SHORT).show(); 
      file.createNewFile(); 
     } 

     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); 


     bos.write(plainText); 
     bos.flush(); 
     bos.close();   
     videoplay.setSource(Uri.fromFile(file)); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 


    return "ok"; 
} 

Répondre

0

Lors du chiffrement ou déchiffrement, à la fois le texte et le texte crypté devrait être dans la mémoire (RAM) au moins une fois. Mais Java vous permet d'utiliser la mémoire limitée.

Si vous voulez passer de 50 Mo à 80 Mo, peut-être en utilisant android:largeHeap=true dans l'application de votre manifeste va fonctionner. Mais si vous souhaitez une limite supérieure, vous pouvez effectuer le chiffrement en séparant le fichier et en effectuant le chiffrement pièce par pièce.

+0

oui je sais doit chunk morceau le tableau d'octets et l'essayer, mais n'a pas fonctionné – golbahar