Приложение по-прежнему блокируется даже при использовании неблокирующего потока шифров с сокетом - PullRequest
0 голосов
/ 04 мая 2011

Здравствуйте, я использовал шифр в этом посте 5777105

Но код дешифрования по-прежнему блокируется, пока не будет достигнут размер буфера.Вы знаете другой способ сделать его неблокирующим?Обратите внимание, что часть дешифрования работает на Android.

Часть шифрования:

    CipherInputStream cis;
    String salt = "1234567890123456";
    String password = "abcdEFGH";

    password = password.concat(salt);
    String validpassword = password.substring(0, 16);
    SecretKeySpec secretKey = new SecretKeySpec(validpassword.getBytes(),"AES");   
    AlgorithmParameterSpec paramSpec = new IvParameterSpec(salt.getBytes());

    try  {
        // Creation of Cipher objects
        Cipher encrypt = 
         Cipher.getInstance("AES/CFB8/NoPadding");
        encrypt.init(Cipher.ENCRYPT_MODE, secretKey,paramSpec);

        // Open the file
        try {
             fis = new FileInputStream(file);
        } catch(IOException err) {
             System.out.println("Cannot open file!");
             return null;
        }
        cis = new CipherInputStream(fis, encrypt);

        // Write to the Encrypted file
        fos = new FileOutputStream(desFile);
        byte[] b = new byte[256];
        int i = cis.read(b);
        while (i != -1) {
             fos.write(b, 0, i);
             i = cis.read(b);
        }

Часть дешифрования:

    CipherInputStream cis;
    String salt = "1234567890123456";
    String password = "abcdEFGH";

    password = password.concat(salt);
    String validpassword = password.substring(0, 16);          
    SecretKeySpec secretKey =new SecretKeySpec(validpassword.getBytes(),"AES");        
    AlgorithmParameterSpec paramSpec = new IvParameterSpec(salt.getBytes());

     try {
         // Creation of Cipher objects
         Cipher decrypt = 
              Cipher.getInstance("AES/CFB8/NoPadding");
         decrypt.init(Cipher.DECRYPT_MODE, secretKey,paramSpec); 

         // Open the Encrypted file
         cis = new CipherInputStream(is, decrypt); 

         int bytesRead;
         int current = 0;
         byte[] b = new byte[256];
         bytesRead = cis.read(b,0,256);

1 Ответ

0 голосов
/ 05 мая 2011

Причина блокировки cis.read проста: поток Cipher оборачивается вокруг потока сокетов (вы передаете поток сокетов в конструктор потока Cipher), поэтому всякий раз, когда вы вызываете read для потока Cipher, он вызывает код в потоке cipher для читать данные из сокета, чтобы он мог расшифровать данные. Это где (чтение из потока сокета) блоков кода.

У вас не должно быть проблем с блокировкой, если вы запускаете этот код в потоке пользовательского интерфейса. Вы можете запустить этот код в другом рабочем потоке, чтобы ваш пользовательский интерфейс не зависал

...