2011-05-04 48 views
0

无阻塞密码流,即使仍然块你好,我使用的密码在这个岗位5777105应用使用带有插座

但直到达到解密代码仍然块缓冲区的大小。你知道另一种方法来使它不被阻塞吗?请注意,解密部分正在Android上运行。

加密部分:

CipherInputStream cis; 
    String salt = "123456789"; 
    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 = "123456789"; 
    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); 

回答

0

原因cis.read被阻塞很简单:周围的流套接字的密码流包装(你通过套接字流密码流构造函数),因此无论何时调用密码流上的读取操作,都将导致密码流中的代码从套接字读取数据,以便它可以解密数据。这是从哪里(从套接字流读取)代码块。

你应该没有任何问题阻止您在UI线程中运行此代码的单元。您可以在另一个工作线程上运行此代码,以便您的UI不会冻结