我是Android的新手,现在我正在构建一个加载和隐藏数据的Android应用程序,作为我的迷你项目的一部分。请你告诉我使用AES加密和解密android中的图像的代码算法..?
答案 0 :(得分:1)
您可以使用java加密库。以下是您可以执行的操作的示例:
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();
在http://docs.oracle.com/javase/7/docs/technotes/guides/security/crypto/
了解详情答案 1 :(得分:0)
这是使用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();
}
有关使用AES加密或解密图像文件的更详细示例,您可以点击此链接https://github.com/charlesconnell/ImageHider/tree/master/src/com/connell/imagehider