【问题标题】:How to encrypt video from url and save encrypted video to device's SD Card如何从 url 加密视频并将加密的视频保存到设备的 SD 卡
【发布时间】:2011-08-10 06:59:21
【问题描述】:

在我的应用程序中,我必须使用许多视频文件。所有视频的总大小约为 500 MB。因此,我必须在第一次安装和运行应用程序时决定我在后台下载视频,并在加密该视频后将其保存到设备的 SD 卡中。每当使用视频时,我都会解密该视频并使用它。

我决定这样做是因为所有视频文件都非常重要,所以该文件的安全性非常重要..

我非常努力地寻找如何加密视频并将其保存到 SD 卡...

最后我发现我在下面放了一件事,但在此代码中发生了 PERMISSION DENIED 错误。

代码:

public class VideoActivity extends Activity 
{
    VideoView video_view;
    MediaController m_controller;
    MediaPlayer mplayer;
    String[] a = {"1","2","3","4","5","6"};

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        try {
            main(a);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }

        public void writeToFile(String filename, Object object) throws Exception 
        {
            FileOutputStream fos = null;
            ObjectOutputStream oos = null;

            try 
            {
                fos = new FileOutputStream(new File(Environment.getExternalStorageDirectory()+"/corebird1.mp4"));
                oos = new ObjectOutputStream(fos);
                oos.writeObject(object);
                oos.flush();
            }
            catch (Exception e) 
            {
                e.printStackTrace();
            }
            finally 
            {
                if (oos != null) 
                {
                    oos.close();
                }
                if (fos != null) 
                {
                    fos.close();
                }
            }
        }

        public void main(String[] args) throws Exception 
        {
            //
            // Generating a temporary key and stire it in a file.
            //
            SecretKey key = KeyGenerator.getInstance("DES").generateKey();
            writeToFile("secretkey.dat", key);
            Log.d("#######key", String.valueOf(key));

            //
            // Preparing Cipher object for encryption.
            //
            Cipher cipher = Cipher.getInstance("DES");
            cipher.init(Cipher.ENCRYPT_MODE, key);

            //
            // Here we seal (encrypt) a simple string message (a string object).
            //
            SealedObject sealedObject = new SealedObject("THIS IS A SECRET MESSAGE!", cipher);

            //
            // Write the object out as a binary file.
            //
            writeToFile("sealed.dat", sealedObject);
        } 
}

LogCat:

08-10 12:22:32.430: WARN/System.err(338): java.io.FileNotFoundException: /mnt/sdcard/corebird1.mp4 (Permission denied)
08-10 12:22:32.430: WARN/System.err(338):     at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
08-10 12:22:32.459: WARN/System.err(338):     at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
08-10 12:22:32.459: WARN/System.err(338):     at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
08-10 12:22:32.459: WARN/System.err(338):     at java.io.FileOutputStream.<init>(FileOutputStream.java:69)
08-10 12:22:32.459: WARN/System.err(338):     at com.technosoft.video.VideoActivity.writeToFile(VideoActivity.java:71)
08-10 12:22:32.459: WARN/System.err(338):     at com.technosoft.video.VideoActivity.main(VideoActivity.java:99)
08-10 12:22:32.459: WARN/System.err(338):     at com.technosoft.video.VideoActivity.onCreate(VideoActivity.java:54)
08-10 12:22:32.459: WARN/System.err(338):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-10 12:22:32.459: WARN/System.err(338):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-10 12:22:32.459: WARN/System.err(338):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-10 12:22:32.470: WARN/System.err(338):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-10 12:22:32.470: WARN/System.err(338):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-10 12:22:32.470: WARN/System.err(338):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-10 12:22:32.470: WARN/System.err(338):     at android.os.Looper.loop(Looper.java:123)
08-10 12:22:32.470: WARN/System.err(338):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-10 12:22:32.470: WARN/System.err(338):     at java.lang.reflect.Method.invokeNative(Native Method)
08-10 12:22:32.470: WARN/System.err(338):     at java.lang.reflect.Method.invoke(Method.java:521)
08-10 12:22:32.480: WARN/System.err(338):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-10 12:22:32.480: WARN/System.err(338):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-10 12:22:32.480: WARN/System.err(338):     at dalvik.system.NativeStart.main(Native Method)
08-10 12:22:32.480: DEBUG/#######key(338): javax.crypto.spec.SecretKeySpec@69
08-10 12:22:32.510: WARN/System.err(338): java.io.FileNotFoundException: /mnt/sdcard/corebird1.mp4 (Permission denied)
08-10 12:22:32.510: WARN/System.err(338):     at org.apache.harmony.luni.platform.OSFileSystem.openImpl(Native Method)
08-10 12:22:32.520: WARN/System.err(338):     at org.apache.harmony.luni.platform.OSFileSystem.open(OSFileSystem.java:152)
08-10 12:22:32.520: WARN/System.err(338):     at java.io.FileOutputStream.<init>(FileOutputStream.java:97)
08-10 12:22:32.520: WARN/System.err(338):     at java.io.FileOutputStream.<init>(FileOutputStream.java:69)
08-10 12:22:32.520: WARN/System.err(338):     at com.technosoft.video.VideoActivity.writeToFile(VideoActivity.java:71)
08-10 12:22:32.520: WARN/System.err(338):     at com.technosoft.video.VideoActivity.main(VideoActivity.java:116)
08-10 12:22:32.520: WARN/System.err(338):     at com.technosoft.video.VideoActivity.onCreate(VideoActivity.java:54)
08-10 12:22:32.520: WARN/System.err(338):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-10 12:22:32.520: WARN/System.err(338):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-10 12:22:32.520: WARN/System.err(338):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-10 12:22:32.520: WARN/System.err(338):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-10 12:22:32.520: WARN/System.err(338):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-10 12:22:32.520: WARN/System.err(338):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-10 12:22:32.520: WARN/System.err(338):     at android.os.Looper.loop(Looper.java:123)
08-10 12:22:32.520: WARN/System.err(338):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-10 12:22:32.520: WARN/System.err(338):     at java.lang.reflect.Method.invokeNative(Native Method)
08-10 12:22:32.520: WARN/System.err(338):     at java.lang.reflect.Method.invoke(Method.java:521)
08-10 12:22:32.530: WARN/System.err(338):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-10 12:22:32.530: WARN/System.err(338):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-10 12:22:32.530: WARN/System.err(338):     at dalvik.system.NativeStart.main(Native Method)

任何机构都有解决此错误的方法,请帮助我...

或者如果您有任何其他解决方案或建议,那么您也可以提供帮助......我很感激......

我还想要解密编码视频并播放该 android 的方法。

任何身体都有任何其他

【问题讨论】:

    标签: java android video encryption


    【解决方案1】:

    您看到的错误与加密无关,而与文件权限有关。您的应用是否请求使用 SD 卡的权限?

    其次,为什么要使用 DES? DES 在现代硬件上通常比 AES 慢得多,并且密钥对于现代使用来说太短了。此外,请确保您使用的是 GCM、CTR 或 CBC 操作模式 - 简单的 ECB 没有良好的安全属性。

    请意识到您正在实施经典的 DRM 方案:任何有权访问设备和应用程序私有目录的人都可以找到密钥文件并解密视频,或者在传输过程中窃取视频。

    【讨论】:

    • 是的,我在 AndroidManifest 文件中添加了 sd 卡使用权限。
    • 我对加密和解密一无所知...请给我建议更适合我的问题的方法??
    • @Mohit - 如果您想了解有关加密的信息,请查看 crypto.stackexchange.com 或 security.stackexchange.com
    猜你喜欢
    • 2016-11-28
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多