我是新来的android,现在我正在构建一个android应用程序来加密和隐藏数据,作为我的小型项目的一部分。请告诉我使用AES算法在android中加密和解密图像的代码。 ??如何在android中加密和解密图片?
回答
您可以使用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/
下面是用于加密和解密采用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
虽然这个链接可能回答这个问题,但最好在这里包含答案的基本部分,并提供参考链接。如果链接页面更改,则仅链接答案可能会失效。 – 2015-06-15 07:43:53
谢谢你我编辑我的答案谢谢你! @Hidden Hobbes – 2015-06-15 08:39:57
我试过了,但速度很慢 – HendraWD 2017-08-07 07:32:24
您可以使用下面的方法来加密或解密的媒体文件,如视频或图像 -
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();
}
}
}
在这里,我正在加密的videos.For例如下面是我的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();
}
}
}
- 1. 加密和解密图片.NET
- 2. 如何在android中加密和解密密码
- 3. 在android中加密解密
- 4. Android - 加密和解密
- 5. Android AES加密和解密
- 6. Android - 加密和解密
- 7. 如何在Java中加密并在Android和iOS中解密
- 8. 图像加密和解密
- 9. 加密python文件和解密在android
- 10. 如何在android中加密和解密视频文件
- 11. 如何在JAVA或Android中加密和解密UTF-8?
- 12. 如何完成在android中加密和解密字符串值?
- 13. 在iOS中加密和解密密码
- 14. 试图加密和解密vigenere密码
- 15. 如何在Perl CGI程序中加密和解密密码?
- 16. 如何?在ASP.NET中加密和解密用户成员密码
- 17. 如何在PHP中加密和解密密码?
- 18. 加密和解密在iphonesdk
- 19. 加密和解密在C#
- 20. PDF加密/解密在android中?
- 21. 如何在.net中加密文件并在android中解密
- 22. 加密和解密
- 23. 加密和解密
- 24. 加密和解密
- 25. 加密和解密
- 26. Android对图像的AES加密/解密
- 27. 加密和解密密码
- 28. 加密和解密的Android通话
- 29. VB2008和Android之间的加密/解密
- 30. 使用Android和PHP加密/解密
你有试过什么吗?也许尝试先加密/解密字符串,然后你会意识到它全部是关于字节'byte []':) – Yazan 2014-11-02 08:28:50
大量的例子 - 只是做一点搜索。 – Henry 2014-11-02 08:39:35
我有加密的字符串,直到现在...现在我需要加密图像和音频... – 2014-11-02 10:57:14