Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中音频文件的AES算法_Android_Cryptography_Aes - Fatal编程技术网

Android中音频文件的AES算法

Android中音频文件的AES算法,android,cryptography,aes,Android,Cryptography,Aes,嗨,我在我的项目中从事AES加密和解密 我有一个.mp4文件,它是使用AES/CBC/pkcs5p加密的 我有密钥和iv值,用于加密音频文件的前256个字节 我需要使用相同的算法、密钥和iv值解密文件的前256个字节 我已经跟随了一些链接 我得到了一个音频播放器演示,并试图实现我的partAES加密和解密作为演示 下面我解释了我所做的代码 此方法从res/raw文件夹下的加密文件中读取数据 private void readFile() throws IOException, InvalidKe

嗨,我在我的项目中从事AES加密和解密

我有一个.mp4文件,它是使用AES/CBC/pkcs5p加密的

我有密钥和iv值,用于加密音频文件的前256个字节

我需要使用相同的算法、密钥和iv值解密文件的前256个字节

我已经跟随了一些链接

我得到了一个音频播放器演示,并试图实现我的partAES加密和解密作为演示

下面我解释了我所做的代码

此方法从res/raw文件夹下的加密文件中读取数据

private void readFile() throws IOException, InvalidKeyException,
        NoSuchAlgorithmException, NoSuchPaddingException,
        InvalidAlgorithmParameterException, IllegalBlockSizeException,
        BadPaddingException {

    Context context = getApplicationContext();
    /*
     * InputStream is = getResources().openRawResource(
     * getResources().getIdentifier("raw/encrypted", "raw",
     * getPackageName())); String text = "";
     * 
     * int size = is.available(); byte[] buffer = new byte[size];
     * is.read(buffer);
     */

    InputStream inStream = context.getResources().openRawResource(
            R.raw.encrypted);

    // get string from file

    byte[] music = new byte[256];
    for (int i = 0; i <= inStream.available(); i = i + 255) {
        music = convertStreamToByteArray(inStream, i);
        byte[] bytesToWrite = new byte[256];

        bytesToWrite = music;
        if (i == 0) {
            bytesToWrite = AES256Cipher.decrypt(iv.getBytes("UTF-8"),
                    key.getBytes("UTF-8"), music);
            // writeFirstSetOfBytes("decrypted.mp4");
        }

        writeFirstSetOfBytes(bytesToWrite);

    }
}
此方法用于从输入流获取字节数组

public static byte[] convertStreamToByteArray(InputStream is, int size)
        throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buff = new byte[256];
    int i = Integer.MAX_VALUE;
    while ((i = is.read(buff, size, buff.length)) > 0) {
        baos.write(buff, 0, i);
    }

    return baos.toByteArray(); // be sure to close InputStream in calling
                                // function
}
此方法将接收到的字节数组写入目标filedecrypted.mp4

private void writeFirstSetOfBytes(byte[] byteToWrite) {

    File file = new File(
            Environment
                    .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS),
            "/decrypted.mp4");
    FileOutputStream stream = null;
    if (!file.exists()) {
        try {
            file.createNewFile();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    // writing data into file
    try {
        stream = new FileOutputStream(file);

        stream.write(byteToWrite);
        stream.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
我得到以下错误

javax.crypto.IllegalBlockSizeException: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length
我怎样才能达到我的要求

如何仅解密前256个字节的数据? 是否有任何代码行为错误? 有第三方图书馆吗?
如果需要更多的澄清,请告诉我。

根据维基百科,PKCS5是PKCS7的一个特殊变体,定义为64位块,而PKCS7适用于任何块大小,但AES仅使用128位块或更大的块,但这不包括在标准中,因此不匹配。尝试另一种填充方案。

只是旁注。解密例程期望iv和key作为原始字节,但您的readFile例程似乎将它们从某种文本表示形式转换过来。你确定你不是在传递一个十六进制字符串而不是原始字节吗?我真的不知道从哪里开始。您的流处理完全不正确-包括两个循环,您使用的是i=i+255,CBC模式可能不是一个好主意。呃,不。请参阅我的答案,包括Java的细节。@owlstead信不信由你,但您关于加密的答案正是我得出结论的来源之一。:-特别是“PKCS5填充不能用于AES”一行。库不应实际区分PKCS5和PKCS7的规则只是一项正式规定——除非明确验证,否则无法确定特定库的特定版本是否遵守此规则,而这正是我建议首先检查的内容,越是如此,此检查就越微不足道。无论如何,更正不正确的标识符是一个好主意。我当然很荣幸能够成为您答案的来源,但是一些加密库(如Java中的SUN provider)指出应该在PKCS5中使用PKCS7-PKSC5Padding应该是PKCS7Padding。这也是答案的一部分。换句话说,如果指定PKCS5,那么实际上使用的是PKCS7填充。
javax.crypto.IllegalBlockSizeException: error:0606506D:digital envelope routines:EVP_DecryptFinal_ex:wrong final block length