2010-09-20 10 views
5

Szyfruję plik w Javie i wysyłam zaszyfrowany plik i klucz prywatny do urządzenia z Androidem. Ale podczas odszyfrowywania pliku w systemie Android, daje on uszkodzony blok pad bloku. Nawiasem mówiąc, sam kod deszyfrowania działa na PCBlok pad uszkodzony podczas deszyfrowania (Android)

Oto szyfrowania:

public void encrypt(File inf, File outf, File publicKey, int userId, int resourceId) throws ArServerConnectionException { 
    // ENCRYPTION BEGIN 
    try { 
     pkCipher = Cipher.getInstance("RSA"); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    // create AES shared key cipher 
    try { 
     aesCipher = Cipher.getInstance("AES"); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (NoSuchPaddingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 
     makeKey(); 
    } catch (NoSuchAlgorithmException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
      // File operation 

      try { 
     saveKey(new File(System.getProperty("user.home") + "/" + userId 
       + "/keyfile"), publicKey); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (GeneralSecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    // File operation 

    try { 
     encryptFiles(inf, outf); 
    } catch (InvalidKeyException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    // /ENCRYPTION END 
} 

    public void saveKey(File out, File publicKeyFile) throws IOException, 
     GeneralSecurityException { 
    // read public key to be used to encrypt the AES key 
    byte[] encodedKey = new byte[(int) publicKeyFile.length()]; 
    new FileInputStream(publicKeyFile).read(encodedKey); 

    // create public key 
    X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey); 
    KeyFactory kf = KeyFactory.getInstance("RSA"); 
    PublicKey pk = kf.generatePublic(publicKeySpec); 

    // write AES key 
    pkCipher.init(Cipher.ENCRYPT_MODE, pk); 
    CipherOutputStream os = new CipherOutputStream(
      new FileOutputStream(out), pkCipher); 
    os.write(aesKey); 
    os.close(); 
} 
    public void makeKey() throws NoSuchAlgorithmException { 
    KeyGenerator kgen = KeyGenerator.getInstance("AES"); 
    kgen.init(AES_Key_Size); 
    SecretKey key = kgen.generateKey(); 
    aesKey = key.getEncoded(); 
    aeskeySpec = new SecretKeySpec(aesKey, "AES"); 
} 

Oto część deszyfrowania:

public class FileDecrypt { 
    public static final int AES_Key_Size = 256; 

    Cipher pkCipher, aesCipher; 
    byte[] aesKey; 
    SecretKeySpec aeskeySpec; 
    private String pubKeyPath=null; 
    private String prvKeyPath=null; 
    private String keyFilePath=null; 
    private String encFilePath=null; 
    private String unencFilePath=null; 


    public String getEncFilePath() { 
     return encFilePath; 
    } 

    public void setEncFilePath(String encFilePath) { 
     this.encFilePath = encFilePath; 
    } 

    public String getUnencFilePath() { 
     return unencFilePath; 
    } 

    public void setUnencFilePath(String unencFilePath) { 
     this.unencFilePath = unencFilePath; 
    } 

    public String getPubKeyPath() { 
     return pubKeyPath; 
    } 

    public void setPubKeyPath(String pubKeyPath) { 
     this.pubKeyPath = pubKeyPath; 
    } 

    public String getPrvKeyPath() { 
     return prvKeyPath; 
    } 

    public void setPrvKeyPath(String prvKeyPath) { 
     this.prvKeyPath = prvKeyPath; 
    } 

    public String getKeyFilePath() { 
     return keyFilePath; 
    } 

    public void setKeyFilePath(String keyFilePath) { 
     this.keyFilePath = keyFilePath; 
    } 
    public void decrypt() { 
     Log.i("DECRYPT","**************************************************DECRYPT&*******************"); 
     Log.i("encFilePath",encFilePath); 
     Log.i("pubKeyPath",pubKeyPath); 
     Log.i("prvKeyPath",prvKeyPath); 
     Log.i("keyFilePath",keyFilePath); 
     Log.i("unencFilePath",unencFilePath); 
     Log.i("DECRYPT","********************************************DECRYPT&*******************"); 
     try { 
      pkCipher = Cipher.getInstance("RSA"); 
     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NoSuchPaddingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      aesCipher = Cipher.getInstance("AES"); 
     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NoSuchPaddingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     //DECRYPTION BEGIN 

     File pkf=new File(pubKeyPath); 
     byte[] encodedKey = new byte[(int) pkf.length()]; 
     try { 
      new FileInputStream(pkf).read(encodedKey); 
      // create public key 
      X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encodedKey); 
      KeyFactory kf = KeyFactory.getInstance("RSA"); 
      PublicKey pk = kf.generatePublic(publicKeySpec); 

      // write AES key 
      pkCipher.init(Cipher.ENCRYPT_MODE, pk); 
     } catch (FileNotFoundException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvalidKeyException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (InvalidKeySpecException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      loadKey(new File(keyFilePath), new File(prvKeyPath)); 
     } catch (GeneralSecurityException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     try { 
      decrypt(new File(encFilePath), new File(unencFilePath)); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     //DECRYPTION END 
    } 

    /** 
    * Decrypts an AES key from a file using an RSA private key 
    */ 
    public void loadKey(File in, File privateKeyFile) 
      throws GeneralSecurityException, IOException { 
     // read private key to be used to decrypt the AES key 
     byte[] encodedKey = new byte[(int) privateKeyFile.length()]; 
     new FileInputStream(privateKeyFile).read(encodedKey); 

     // create private key 
     PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(encodedKey); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     PrivateKey pk = kf.generatePrivate(privateKeySpec); 

     // read AES key 
     pkCipher.init(Cipher.DECRYPT_MODE, pk); 
     aesKey = new byte[AES_Key_Size/8]; 
     CipherInputStream is = new CipherInputStream(new FileInputStream(in), 
       pkCipher); 
     is.read(aesKey); 
     aeskeySpec = new SecretKeySpec(aesKey, "AES"); 
    } 

    /** 
    * Decrypts and then copies the contents of a given file. 
    */ 
    public void decrypt(File in, File out) throws IOException 
     { 
     try { 
      aesCipher.init(Cipher.DECRYPT_MODE, aeskeySpec); 
     } catch (InvalidKeyException e) { 
      Log.i("EXCEPTION","INVALID KEY EXCEPTION"); 
      e.printStackTrace(); 
     } 

     CipherInputStream is = new CipherInputStream(new FileInputStream(in), 
       aesCipher); 
     FileOutputStream os = new FileOutputStream(out); 

     copy(is, os); 

     is.close(); 
     os.close(); 
    } 

    /** 
    * Copies a stream. 
    */ 
    private void copy(InputStream is, OutputStream os) throws IOException { 
     int i; 
     byte[] b = new byte[2048]; 
     while ((i = is.read(b)) != -1) { 
      os.write(b, 0, i); 
     } 
    } 
} 

Odpowiedz

4

Mieliśmy również do czynienia z tym samym problemem, Został on rozwiązany tylko na robieniu części szyfrowania również po stronie Androida (Korzystanie z Androida SDK), a następnie odszyfrowanie go na urządzeniu. Nie znaleziono innych poprawnych przyczyn problemu.

+0

Yeap, rozwiązaliśmy problem dokładnie tak, jak powiedziałeś. –

0

Najbardziej prawdopodobną przyczyną jest kod, który są używane do wysyłania pliku na urządzenie jest nieprawidłowe. Być może jest to obcięcie, dopełnienie lub w inny sposób uszkodzenie danych, aby nie odszyfrować poprawnie. Spróbuj przetestować plik statyczny i sprawdź, czy możesz go wyizolować.

+1

dostaję plik z urządzenia i testowanie go w moim komputerze i jest prawidłowo rozszyfrował. Dlatego też pomyślałem, że nie ma problemu z przeniesieniem pliku –

0

Komputer, na którym szyfrujesz plik, korzysta z innego dostawcy zabezpieczeń (głównie SunJCE), a Android używa dostawcę zabezpieczeń "BC" (Bouncy Castle przed wersją 4.2, AndroidOpenssl po 4.2), aby odszyfrować plik. W związku z tym odszyfrowywanie nie powiedzie się na urządzeniu z Androidem. Proszę użyć dmuchanego słoja na zamek odpowiadającego typowi komputera z tej lokalizacji Bouncy castle jar download.

Szyfruj za pomocą dostawcy "BC" w kodzie Java na PC.

Cipher cipher = Cipher.getInstance("AES", "BC"); 

Decyption będzie działać dobrze na android strony :)

Powiązane problemy