【发布时间】:2017-04-01 14:13:12
【问题描述】:
所以目前我正在尝试将一些加密文本写入文件,然后能够将其读回,解密并将其显示给用户。我目前正在使用 AES-256 和 PBKDF2 密码派生,因为我希望能够使用用户的密码来加密/解密文件。这些文件是简单的文本文件。我目前用来加密一些文本并将其保存到文件的代码如下。据我所知,从使用 adb 看,这可以正常工作。
FileOutputStream out = new FileOutputStream(mypath);
String defaultMessage = "Empty File";
int iterationCount = 1000;
int keyLength = 256;
int saltLength = keyLength / 8;
SecureRandom randomGenerator = new SecureRandom();
byte[] salt = new byte[saltLength];
randomGenerator.nextBytes(salt);
KeySpec keySpec = new PBEKeySpec(submittedPassword.toCharArray(), salt, iterationCount, keyLength);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] iv = new byte[cipher.getBlockSize()];
randomGenerator.nextBytes(iv);
IvParameterSpec ivParams = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, key, ivParams);
byte[] ciphertext = cipher.doFinal(defaultMessage.getBytes("UTF-8"));
String finalMessage = ciphertext.toString() + "]" + iv.toString() + "]" + salt.toString();
out.write(finalMessage.getBytes());
out.close();
P.S 以上是在 Try/Except 之内。
下面的代码是我当前尝试用来读取文件然后解密的代码,但是,当我尝试通过最后的测试视图显示解密的内容时,它没有显示出来。
FileInputStream fileInputStream = new FileInputStream(mypath);
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
StringBuffer stringBuffer = new StringBuffer();
while ((fileContents = bufferedReader.readLine()) != null) {
stringBuffer.append(fileContents + "\n");
}
String fileContentsString = stringBuffer.toString();
String[] fileContentsList = fileContentsString.split("]");
byte[] cipherText = fileContentsList[0].getBytes();
Toast.makeText(getApplicationContext(), fileContentsList[0], Toast.LENGTH_LONG).show();
byte[] iv = fileContentsList[1].getBytes();
byte[] salt = fileContentsList[2].getBytes();
KeySpec keySpec = new PBEKeySpec(submittedPassword.toCharArray(), salt, 1000, 256);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
byte[] keyBytes = keyFactory.generateSecret(keySpec).getEncoded();
SecretKey key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
IvParameterSpec ivParams = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, key, ivParams);
byte[] plaintext = cipher.doFinal(cipherText);
String plainrStr = new String(plaintext , "UTF-8");
textEdit.setText(plainrStr);
希望有人可以在这里为我提供一些帮助。同样,第二个代码段位于 Try/Except 语句中。
【问题讨论】:
-
如果您在进行任何加密或解密之前继续读取和写入完整的文件内容(不推荐),您不妨使用以安全方式执行此操作的库。喜欢这个:github.com/tozny/java-aes-crypto
-
@ArtjomB。不,想法是文件内容被加密,然后保存。当用户想要查看内容时,从文件中读取,然后解密。
-
还是希望得到答案,还没解决!!!
-
你试过那个库吗?
-
我没有,因为根据您的描述,这不是我要找的。 Atm 我的主要问题是解密时来自 doFinal。
标签: java android file encryption