如何在Android中使用AESencryptionSD卡中的文件?

我想从SD卡encryption图像,并使用AES再次将其存储在SD卡中。 主要思想是应用程序浏览图像,然后按下button时将其encryption,然后将其存储在SD卡中。 所以我的形象将是安全的。

我已经成功地使用AES从本教程http://www.androidsnippets.com/encryptdecrypt-strings做stringencryption,但我不知道如何做到这一点的图像,而不是string。

这是我如何用一个string:

public static String encrypt(String seed, String cleartext) throws Exception { byte[] rawKey = getRawKey(seed.getBytes()); byte[] result = encrypt(rawKey, cleartext.getBytes()); return toHex(result); } private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception { SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal(clear); return encrypted; } 

任何人都可以帮助我举例如何使用AESencryption图像的代码?

也许它必须使用I / O文件stream,但我不知道如何实现这个代码。

如果您input密码的用户input,请务必阅读此答案 。

你应该看看: CipherInputStream和CipherOutputStream 。 它们被用来encryption和解密字节stream。

我有一个名为cleartext的文件。 该文件包含:

 Hi, I'm a clear text. How are you? That's awesome! 

现在,你有一个encrypt()函数:

 static void encrypt() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { // Here you read the cleartext. FileInputStream fis = new FileInputStream("data/cleartext"); // This stream write the encrypted text. This stream will be wrapped by another stream. FileOutputStream fos = new FileOutputStream("data/encrypted"); // Length is 16 byte // Careful when taking user input!!! https://stackoverflow.com/a/3452620/1188357 SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES"); // Create cipher Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, sks); // Wrap the output stream CipherOutputStream cos = new CipherOutputStream(fos, cipher); // Write bytes int b; byte[] d = new byte[8]; while((b = fis.read(d)) != -1) { cos.write(d, 0, b); } // Flush and close streams. cos.flush(); cos.close(); fis.close(); } 

执行此function后,应该有一个文件名encrypted 。 该文件包含encryption的字符。

解密你有decryptfunction:

 static void decrypt() throws IOException, NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { FileInputStream fis = new FileInputStream("data/encrypted"); FileOutputStream fos = new FileOutputStream("data/decrypted"); SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, sks); CipherInputStream cis = new CipherInputStream(fis, cipher); int b; byte[] d = new byte[8]; while((b = cis.read(d)) != -1) { fos.write(d, 0, b); } fos.flush(); fos.close(); cis.close(); } 

执行解密之后,应该有一个名为decrypted的文件。 该文件包含自由文本。

你写你是一个“noob”,但取决于使用encryption的情况下,如果你不正确的做法,你可能会造成很大的伤害。 了解你的工具!

CipherOutputStream的使用Oracle文档 :

 SecretKeySpec skeySpec = new SecretKeySpec(y.getBytes(), "AES"); FileInputStream fis; FileOutputStream fos; CipherOutputStream cos; // File you are reading from fis = new FileInputStream("/tmp/a.txt"); // File output fos = new FileOutputStream("/tmp/b.txt"); // Here the file is encrypted. The cipher1 has to be created. // Key Length should be 128, 192 or 256 bit => ie 16 byte SecretKeySpec skeySpec = new SecretKeySpec("MyDifficultPassw".getBytes(), "AES"); Cipher cipher1 = Cipher.getInstance("AES"); cipher1.init(Cipher.ENCRYPT_MODE, skeySpec); cos = new CipherOutputStream(fos, cipher1); // Here you read from the file in fis and write to cos. byte[] b = new byte[8]; int i = fis.read(b); while (i != -1) { cos.write(b, 0, i); i = fis.read(b); } cos.flush(); 

因此,encryption应该工作。 当你逆转进程时,你应该能够读取解密的字节。