如何加密和解密android中的图像?

时间:2014-11-02 07:43:56

标签: android android-image

我是Android的新手,现在我正在构建一个加载和隐藏数据的Android应用程序,作为我的迷你项目的一部分。请你告诉我使用AES加密和解密android中的图像的代码算法..?

2 个答案:

答案 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