如何在Android中encryption和解密文件?

我想encryption文件并将其存储在SD卡中。 我想解密该encryption的文件,并将其存储在SD卡中。 我试图encryption文件,打开文件stream和encryption是,但它不工作。 我想知道如何做到这一点。

CipherOutputStreamCipherInputStreamCipherFileInputStream / FileOutputStream

我会build议像Cipher.getInstance("AES/CBC/PKCS5Padding")创buildCipher类的东西。 CBC模式安全,不存在非随机明文的ECB模式漏洞 。 它应该出现在任何通用的密码库中,确保高度的兼容性。

如果要使用相同的密钥对多个文件进行encryption,请不要忘记使用安全随机生成器生成的初始化向量 (IV)。 你可以在密文的开头加前缀IV。 它总是正好一个块(16字节)的大小。

如果你想使用密码,请确保你使用了一个好的密钥派生机制(查找基于密码的encryption或基于密码的密钥派生)。 PBKDF2是最常用的基于密码的密钥派生scheme, 在大多数Java运行时 (包括Android)中都存在。 请注意,SHA-1是一个有点过时的散列函数,但它应该罚款PBKDF2,并且目前是最兼容的选项。

在编码/解码string时总是要指定字符编码,否则当平台编码与上一个不同时会遇到麻烦。 换句话说,不要使用String.getBytes()而是使用String.getBytes(Charset.forName("UTF-8"))

为了使其更安全,请在密文和IV上添加安全校验和(MAC或HMAC),最好使用不同的密钥来添encryption码的完整性和真实性。 如果没有authentication标签,密文可能会被改变,使得变更无法被检测到。

被警告CipherInputStream 可能 不会报告BadPaddingException ,这包括为validation密码生成的BadPaddingException

我有一个类似的问题,encryption/解密我想出了这个解决scheme:

 public static byte[] generateKey(String password) throws Exception { byte[] keyStart = password.getBytes("UTF-8"); KeyGenerator kgen = KeyGenerator.getInstance("AES"); SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto"); sr.setSeed(keyStart); kgen.init(128, sr); SecretKey skey = kgen.generateKey(); return skey.getEncoded(); } public static byte[] encodeFile(byte[] key, byte[] fileData) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal(fileData); return encrypted; } public static byte[] decodeFile(byte[] key, byte[] fileData) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] decrypted = cipher.doFinal(fileData); return decrypted; } 

要将encryption文件保存到sd,请执行以下操作:

 File file = new File(Environment.getExternalStorageDirectory() + File.separator + "your_folder_on_sd", "file_name"); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file)); byte[] yourKey = generateKey("password"); byte[] filesBytes = encodeFile(yourKey, yourByteArrayContainigDataToEncrypt); bos.write(fileBytes); bos.flush(); bos.close(); 

解码文件使用:

 byte[] yourKey = generateKey("password"); byte[] decodedData = decodeFile(yourKey, bytesOfYourFile); 

为了读取文件到一个字节数组有一个不同的方式。 示例: http : //examples.javacodegeeks.com/core-java/io/fileinputstream/read-file-in-byte-array-with-fileinputstream/

将CipherOutputStream或CipherInputStream与Cipher和FileOutputStream / FileInputStream结合使用。

我们有同样的问题,并由我的问题线程中的人解决。 你应该看看:CipherInputStream和CipherOutputStream。 它们被用来encryption和解密字节stream。 为详细的源代码检查出Kiril回答这个链接: 如何在Android中使用AESencryptionSD卡中的文件?

我有同样的问题,我从这个代码得到解决scheme。

 private static final String ALGO = "AES"; private static final byte[] keyValue = new byte[] { 'o', 'n', 'e', 'n','e', 't', 'e','d', 'o', 'c', 'e', 'i', 'r', 's', 'r', 'p' }; public static String decrypt(String encryptedData){ String decryptedValue = null; try{ Key key = generateKey(); Cipher c = Cipher.getInstance(ALGO); c.init(Cipher.DECRYPT_MODE, key); byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); byte[] decValue = c.doFinal(decordedValue); decryptedValue = new String(decValue); }catch(Exception e){ //LOGGER.error("In TD:" + e); //Teneno_StartupService.loadForConnectionFailed(); } return decryptedValue; } private static Key generateKey(){ Key key = new SecretKeySpec(keyValue, ALGO); return key; }