【问题标题】:Android encryption: Encrypted file size is less than original fileAndroid加密:加密文件大小小于原始文件
【发布时间】:2016-03-15 17:44:38
【问题描述】:

视频文件加密后,加密后的文件大小小于原始文件(通常为原始文件大小的一半)。所以我无法解密它。 我的加密代码是..

public static void encryptMe(String  vidName)
{
    try {
        File rawData = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS), "HSDownloads");
        File fiss = new File(rawData, vidName);
        Log.d(TAG,"input file  "+fiss.toString());
        FileInputStream in = new FileInputStream(fiss);

        File encreptedFileDirectory = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS), "HSEncript");

        if(encreptedFileDirectory.exists())
        {

        }
        else
        {
            encreptedFileDirectory.mkdirs();
        }
        File outfile = new File(encreptedFileDirectory,vidName);
        OutputStream out= new FileOutputStream(outfile);

        byte[] skey = AppUtiles.generateKey("qwertyuiopasdfgh");
        SecretKeySpec key = new SecretKeySpec(skey, "AES");


        Cipher c = Cipher.getInstance("AES");
        c.init(Cipher.ENCRYPT_MODE, key);

        out = new CipherOutputStream(out, c);
        int count = 0;
        byte[] buffer = new byte[128*1024];
        while ((count = in.read(buffer)) >= 0)
        {
            out.write(buffer, 0, count);
            Log.d(TAG,"inside while loop encryptMe()"+(count = in.read(buffer)));
        }
       out.close();
    }
    catch(Exception e)
    {
        Log.d(TAG,"exception encryption >"+Log.getStackTraceString(e));
    }
    finally 
    {
        Log.d(TAG,"Inside finally   ");
    }
}

对于解密和流式视频, 我正在使用 libmedia jar。

public void playENCVideo(String path) {
    try {
        Cipher decipher = null;

        KeyGenerator kgen = KeyGenerator.getInstance("AES");


        byte[] key = AppUtiles.generateKey("qwertyuiopasdfgh");
        SecretKeySpec skey = new SecretKeySpec(key, "AES");

        decipher = Cipher.getInstance("AES");

        decipher.init(Cipher.DECRYPT_MODE, skey);

        mServer = new LocalSingleHttpServer();

        mServer.setCipher(decipher);
        mServer.start();

        path = mServer.getURL(path);

        vvPlayer.setVideoPath(path);
        vvPlayer.start();
    } catch (InvalidKeyException e) {
        Log.d(TAG, "InvalidKeyException  ");
    } catch (NoSuchAlgorithmException e) {
        Log.d(TAG, "NoSuchAlgorithmException  ");

    } catch (NoSuchPaddingException e) {
        Log.d(TAG, "NoSuchPaddingException  ");

    } catch (IOException e) {
        Log.d(TAG, "IOEXCEPTION   ");

    }
    catch (Exception e) {
            Log.d(TAG,"Genral exceptin");
    }
}

【问题讨论】:

    标签: android encryption


    【解决方案1】:

    您在日志语句中从输入文件中读取的数据:

    Log.d(TAG,"inside while loop encryptMe()"+(count = in.read(buffer)));
    

    从不加密。只有while循环中读取的数据写入out

    编辑: 不要读2:

                       read 1
                       VVVV
    while ((count = in.read(buffer)) >= 0) {
        out.write(buffer, 0, count);          
        Log.d(TAG,"inside while loop encryptMe()"+(count = in.read(buffer)));
    }                                                         ^^^^
                                                              read 2
    

    【讨论】:

    • out.write(buffer, 0, count);正在写入数据,在 while 循环中,您上面的行突出显示。
    • 您进行了两次读取(一次在 while 循环中,一次在 log 语句中)..但您只写了其中一次..您每读取一次就会泄漏,因此最终得到一个文件一半大小..
    • 谢谢,我的问题解决了。我也在尝试在我的应用程序中下载和播放视频。为了播放视频,只有在我的应用程序中加密它。但是代码正在使用花费大量时间。如何减少上述代码的加密时间。
    猜你喜欢
    • 2014-05-26
    • 1970-01-01
    • 2017-12-14
    • 2014-02-21
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    相关资源
    最近更新 更多