Android 加密图像后无法将图像从gallery移动到SD卡

Android 加密图像后无法将图像从gallery移动到SD卡,android,encryption,Android,Encryption,我正在尝试加密图库中的图像并将其存储在SD卡上 当我试图将图像从gallery移动到SD卡时,我收到一个“强制关闭”错误,logcat没有显示异常 我得到一个祝酒词说“图像成功加密”,但它不是移动图像从画廊到SD卡 我做错了什么 private void encript(byte[] data, byte[] clear) { byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0

我正在尝试加密图库中的图像并将其存储在SD卡上

当我试图将图像从gallery移动到SD卡时,我收到一个“强制关闭”错误,logcat没有显示异常

我得到一个祝酒词说“图像成功加密”,但它不是移动图像从画廊到SD卡

我做错了什么

        private void encript(byte[] data, byte[] clear) {

        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 };
        SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
        Cipher cipher = null;

        try {

        cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

        }    catch (NoSuchAlgorithmException e) {

        e.printStackTrace();
        }    catch (NoSuchProviderException e) {

        e.printStackTrace();

        } catch (NoSuchPaddingException e) {

        e.printStackTrace();
        }
        try {
        cipher.init(Cipher.ENCRYPT_MODE, key);

        } catch (InvalidKeyException e) {

        // TODO Auto-generated catch block
        e.printStackTrace();
        }

        byte[] cipherText = new byte[cipher.getOutputSize(data.length)];

       // int ctLength = cipher.update(data, 0, data.length, cipherText, 0);

        byte[] input = null;

        try { 
        input = cipher.doFinal(cipherText);
        } catch (IllegalBlockSizeException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        } catch (BadPaddingException e) {
        // TODO Auto-generated catch block


        e.printStackTrace();
        }
        try{
        if(input.length>0){
        Toast.makeText(getApplicationContext(), "Image successfully encripted", 3000).show();
        }
        ByteArrayInputStream bis = new ByteArrayInputStream(input);

        ObjectInputStream ois = new ObjectInputStream(bis);

     File encriptedfile = (File) ois.readObject();//This is the file which i want to Move to App folder

            bis.close();
        ois.close();
        } catch (StreamCorruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
       }
    return;
    }
     //Code for copy  image into app folder......
    File outputFolder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + ".map");
         try {
          FileUtils.copyFile (encriptedfile, outputFolder);
          } 
          catch (IOException e) {
          Log.e("photomover", e.toString());
          }
}

08-17 11:42:00.905:WARN/System.err(8453):java.io.StreamCorruptedException
08-17 11:42:00.905:WARN/System.err(8453):位于java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:2392)
08-17 11:42:00.905:WARN/System.err(8453):位于java.io.ObjectInputStream。(ObjectInputStream.java:445)
08-17 11:42:00.905:WARN/System.err(8453):位于com.cw.GalleryShareimage1Activity.enccript(GalleryShareimage1Activity.java:177)
08-17 11:42:00.905:WARN/System.err(8453):位于com.cw.GalleryShareimage1Activity.onCreate(GalleryShareimage1Activity.java:76)
08-17 11:42:00.915:WARN/System.err(8453):位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-17 11:42:00.915:WARN/System.err(8453):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2633)
08-17 11:42:00.915:WARN/System.err(8453):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685)
08-17 11:42:00.915:WARN/System.err(8453):在android.app.ActivityThread.access$2300(ActivityThread.java:126)
08-17 11:42:00.915:WARN/System.err(8453):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038)
08-17 11:42:00.915:WARN/System.err(8453):位于android.os.Handler.dispatchMessage(Handler.java:99)
08-17 11:42:00.915:WARN/System.err(8453):位于android.os.Looper.loop(Looper.java:123)
08-17 11:42:00.915:WARN/System.err(8453):位于android.app.ActivityThread.main(ActivityThread.java:4633)
08-17 11:42:00.915:WARN/System.err(8453):位于java.lang.reflect.Method.invokenactive(本机方法)
08-17 11:42:00.915:WARN/System.err(8453):位于java.lang.reflect.Method.invoke(Method.java:521)
08-17 11:42:00.915:WARN/System.err(8453):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
08-17 11:42:00.915:WARN/System.err(8453):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-17 11:42:00.915:WARN/System.err(8453):在dalvik.System.NativeStart.main(本机方法)
08-17 11:42:00.925:WARN/dalvikvm(8453):threadid=1:线程退出时出现未捕获异常(组=0x400207d8)
08-17 11:42:00.935:错误/AndroidRuntime(8453):致命异常:主
08-17 11:42:00.935:错误/AndroidRuntime(8453):java.lang.RuntimeException:无法启动活动组件信息{com.cw/com.cw.GalleryShareImage1AActivity}:java.lang.NullPointerException:源不能为空
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2669)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.ActivityThread.access$2300(ActivityThread.java:126)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.os.Handler.dispatchMessage(Handler.java:99)上
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.os.Looper.loop(Looper.java:123)上
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.ActivityThread.main(ActivityThread.java:4633)上
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于java.lang.reflect.Method.invokenactive(本机方法)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于java.lang.reflect.Method.invoke(Method.java:521)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在dalvik.system.NativeStart.main(本机方法)
08-17 11:42:00.935:错误/AndroidRuntime(8453):原因:java.lang.NullPointerException:源不能为null
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1068)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1038)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):位于com.cw.GalleryShareimage1Activity.onCreate(GalleryShareimage1Activity.java:96)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-17 11:42:00.935:ERROR/AndroidRuntime(8453):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2633)
08-17 11:42:00.935:错误/AndroidRuntime(8453):。。。还有11个

您的代码有几个缺陷:

首先,加密数据时,您没有正确处理要加密的数据。您应该这样尝试:

byte[] cipherText = cipher.doFinal(data);
其次,您使用的是
ObjectInputStream
,它是
readObject()
方法。ObjectInputStream仅对通过Java序列化创建的数据有用。您不能以这种方式处理图像。将其强制转换到
文件
也没有任何意义

由于您在RAM中执行所有操作(顺便说一句,由于android上的RAM限制,这对大文件不起作用),因此您只需将加密的内存数据保存到文件中。无需移动:

File outputFolder = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),".map");
File outputFile = new File(outputFolder, "outputfilename.bin");
FileOutputStream out = new FileOutputStream(outputFile);
out.write(cipherText);
out.close;

仔细检查代码,看看发生了什么。看看哪里失败了。张贴日志也会有帮助。(即使你说它没有显示异常)通过获取加密文件名,我可以将图像复制到应用程序文件夹中,但我无法
File outputFolder = new File(Environment.getExternalStorageDirectory().getAbsolutePath(),".map");
File outputFile = new File(outputFolder, "outputfilename.bin");
FileOutputStream out = new FileOutputStream(outputFile);
out.write(cipherText);
out.close;