简体   繁体   English

如何在Android中加密和解密图像?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM