[英]How to encrypt and decrypt images in android?
我是android的新手,现在我正在构建一个android应用程序以加密和隐藏数据,这是我的mini项目的一部分。请告诉我使用AES算法在android中加密和解密图像的代码。
You can use the java cryptography library. 您可以使用Java加密库。 Here is an example of what you can do: 这是您可以做什么的示例:
byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 }; //Choose a key wisely
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
fis = new FileInputStream("some_img.png");
cis = new CipherInputStream(fis, cipher);
fos = new FileOutputStream("encrypted_img.enc");
byte[] b = new byte[8];
int i = cis.read(b);
while (i != -1) {
fos.write(b, 0, i);
i = cis.read(b);
}
fos.close();
See more at http://docs.oracle.com/javase/7/docs/technotes/guides/security/crypto/ 请参阅http://docs.oracle.com/javase/7/docs/technotes/guides/security/crypto/
You can use the following methods to Encrypt or Decrypt media files such as video or images -- 您可以使用以下方法来加密或解密媒体文件,例如视频或图像-
public class Encrypter {
private final static int DEFAULT_READ_WRITE_BLOCK_BUFFER_SIZE = 1024;
private final static String ALGO_VIDEO_ENCRYPTOR = "AES/CBC/PKCS5Padding";
@SuppressWarnings("resource")
public static void encrypt(SecretKey key,
AlgorithmParameterSpec paramSpec, InputStream in, OutputStream out)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IOException {
try {
Cipher c = Cipher.getInstance(ALGO_VIDEO_ENCRYPTOR);
c.init(Cipher.ENCRYPT_MODE, key, paramSpec);
out = new CipherOutputStream(out, c);
int count = 0;
byte[] buffer = new byte[DEFAULT_READ_WRITE_BLOCK_BUFFER_SIZE];
while ((count = in.read(buffer)) >= 0) {
out.write(buffer, 0, count);
}
} finally {
out.close();
}
}
@SuppressWarnings("resource")
public static void decrypt(SecretKey key, AlgorithmParameterSpec paramSpec,
InputStream in, OutputStream out)
throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
InvalidAlgorithmParameterException, IOException {
try {
Cipher c = Cipher.getInstance(ALGO_VIDEO_ENCRYPTOR);
c.init(Cipher.DECRYPT_MODE, key, paramSpec);
out = new CipherOutputStream(out, c);
int count = 0;
byte[] buffer = new byte[DEFAULT_READ_WRITE_BLOCK_BUFFER_SIZE];
while ((count = in.read(buffer)) >= 0) {
out.write(buffer, 0, count);
}
} finally {
out.close();
}
}
}
Here i am encrypting the videos.For example following is my MainActivity that uses these methods to encrypt the video file. 我在这里加密视频。例如下面是我的MainActivity,它使用这些方法来加密视频文件。
public class MainActivity extends AppCompatActivity {
private final static String ALGO_RANDOM_NUM_GENERATOR = "SHA1PRNG";
private final static String ALGO_SECRET_KEY_GENERATOR = "AES";
private final static int IV_LENGTH = 16;
Cursor mVideoCursor;
ArrayList<HashMap<String, String>> listOfVideo;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listOfVideo = new ArrayList();
String[] videoColumns = {MediaStore.Video.Media.DATA,MediaStore.Video.Media.DURATION,
MediaStore.Video.Media.SIZE,MediaStore.Video.Media.DISPLAY_NAME};
mVideoCursor = getApplicationContext().getContentResolver().query
(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, videoColumns, null, null, null);
mVideoCursor.moveToFirst();
for (int i = 0; i < mVideoCursor.getCount(); i++) {
listOfVideo.add(new HashMap<String, String>() {
{
put("data", String.valueOf(mVideoCursor.getString(
mVideoCursor.getColumnIndex(MediaStore.Video.Media.DATA))));
put("duration", String.valueOf(mVideoCursor.getString(
mVideoCursor.getColumnIndex(MediaStore.Video.Media.DURATION))));
put("displayName", String.valueOf(mVideoCursor.getString(
mVideoCursor.getColumnIndex(MediaStore.Video.Media.DISPLAY_NAME))));
put("size", String.valueOf(mVideoCursor.getString(
mVideoCursor.getColumnIndex(MediaStore.Video.Media.SIZE))));
mVideoCursor.moveToNext();
}
});
}
String path = listOfVideo.get(0).get("data");
File inFile = new File(listOfVideo.get(0).get("data"));
File outFile = new File(path.substring(0, path.lastIndexOf("/"))+"/enc_video.swf");
File outFile_dec = new File(path.substring(0, path.lastIndexOf("/"))+"/dec_video.mp4");
try {
SecretKey key = KeyGenerator.getInstance(ALGO_SECRET_KEY_GENERATOR).generateKey();
byte[] keyData = key.getEncoded();
SecretKey key2 = new SecretKeySpec(keyData, 0, keyData.length, ALGO_SECRET_KEY_GENERATOR);
byte[] iv = new byte[IV_LENGTH];
SecureRandom.getInstance(ALGO_RANDOM_NUM_GENERATOR).nextBytes(iv);
AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);
Encrypter.encrypt(key, paramSpec,
new FileInputStream(inFile), new FileOutputStream(outFile));
Encrypter.decrypt(key2, paramSpec,
new FileInputStream(outFile), new FileOutputStream(outFile_dec));
} catch (Exception e) {
e.printStackTrace();
}
}
}
Here is static methods for encryption and decryption with AES hope this will help. 这是使用AES进行加密和解密的静态方法,希望对您有所帮助。
public static void encrypt (final byte[] key,
final String filename,
final String newFilename,
final Context context,
final EncryptionActionListener listener) {
final Handler uiHandler = new Handler();
final ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setMessage(context.getString(R.string.encrypt_progress_message));
progressDialog.setCancelable(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);
progressDialog.setProgress(0);
progressDialog.show();
Thread task = new Thread("Encrypt thread") {
public void run() {
boolean deleteSuccess = true;
boolean outOfMem = false;
boolean exception = false;
try {
File file = new File(filename);
int length = (int)file.length();
byte fileBytes[] = new byte[1024*100];
if (!createLeadingFolders(newFilename)) {
throw new IOException("Could not create folders in path " + newFilename);
}
InputStream is = new FileInputStream(filename);
OutputStream os = new FileOutputStream(newFilename);
AESOutputStream aos = new AESOutputStream(os, key, length);
int totalRead = 0;
int partialRead = 0;
while (true) {
partialRead = is.read(fileBytes);
if (partialRead == -1) {
break;
} else {
totalRead += partialRead;
aos.write(fileBytes, 0, partialRead);
final int percentage = (totalRead * 100) / length;
uiHandler.post(new Runnable() {
public void run() {
progressDialog.setProgress(percentage);
}
});
}
}
is.close();
aos.close();
os.close();
deleteSuccess = file.delete();
AESImageAdapter.delete(context, filename);
if (listener != null)
listener.onActionComplete();
Intent i = new Intent(ACTION_ENCRYPTED_FILES_CHANGED);
context.sendBroadcast(i);
} catch (OutOfMemoryError e) {
e.printStackTrace();
outOfMem = true;
} catch (Exception e) {
e.printStackTrace();
exception = true;
} finally {
progressDialog.dismiss();
if (exception) {
errorDialog(uiHandler, context.getString(R.string.encrypt_error), context);
} else if (outOfMem) {
errorDialog(uiHandler, context.getString(R.string.memory_error), context);
} else if (!deleteSuccess) {
errorDialog(uiHandler, context.getString(R.string.encrypt_delete_error), context);
}
}
}
};
task.start();
}
/**
* Asynchronously decrypt the chosen file.
* @param keyString Key to decrypt with
* @param filename Name of file to decrypt
* @param newFilename Name to save newly decrypted file
* @param dialog An optional progress dialog to update with progress
* @param adapter An optional adapter to notify when the encryption is finished
* @param context Must supply context
* @return
*/
public static void decrypt (final byte[] key,
final String filename,
final String newFilename,
final Context context,
final EncryptionActionListener listener) {
final Handler uiHandler = new Handler();
final ProgressDialog progressDialog = new ProgressDialog(context);
progressDialog.setMessage(context.getString(R.string.decrypt_progress_message));
progressDialog.setCancelable(false);
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setMax(100);
progressDialog.setProgress(0);
progressDialog.show();
Thread task = new Thread("Decrypt thread") {
public void run() {
boolean deleteSuccess = true;
boolean outOfMem = false;
boolean exception = false;
try {
File file = new File(filename);
int length = (int)file.length();
byte fileBytes[] = new byte[1024*100];
if (!createLeadingFolders(newFilename)) {
throw new IOException("Could not create folders in path " + newFilename);
}
InputStream is = new FileInputStream(filename);
OutputStream os = new FileOutputStream(newFilename);
AESInputStream ais = new AESInputStream(is, key);
int totalRead = 0;
int partialRead = 0;
while (true) {
partialRead = ais.read(fileBytes);
if (partialRead == -1) {
break;
} else {
totalRead += partialRead;
os.write(fileBytes, 0, partialRead);
final int percentage = (totalRead * 100) / length;
uiHandler.post(new Runnable() {
public void run() {
progressDialog.setProgress(percentage);
}
});
}
}
ais.close();
is.close();
os.close();
deleteSuccess = file.delete();
// Run the media scanner to discover the decrypted file exists
MediaScannerConnection.scanFile(context,
new String[] { newFilename },
null,
null);
if (listener != null)
listener.onActionComplete();
Intent i = new Intent(ACTION_ENCRYPTED_FILES_CHANGED);
context.sendBroadcast(i);
} catch (OutOfMemoryError e) {
e.printStackTrace();
outOfMem = true;
} catch (Exception e) {
e.printStackTrace();
exception = true;
} finally {
progressDialog.dismiss();
if (exception) {
errorDialog(uiHandler, context.getString(R.string.decrypt_error), context);
} else if (outOfMem) {
errorDialog(uiHandler, context.getString(R.string.memory_error), context);
} else if (!deleteSuccess) {
errorDialog(uiHandler, context.getString(R.string.decrypt_delete_error), context);
}
}
}
};
task.start();
}
for more detailed example of encrypt or decrypt image file with AES you can follow this link https://github.com/charlesconnell/ImageHider/tree/master/src/com/connell/imagehider 有关使用AES加密或解密图像文件的更详细的示例,您可以点击以下链接https://github.com/charlesconnell/ImageHider/tree/master/src/com/connell/imagehider
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.