首页 > 解决方案 > (AESMode.ctr)模式下的文件解密显示异常无法使用飞镖中的编码“utf-8”解码数据?

问题描述

使用模式解码视频文件aes-ctr时出现如下错误,

Unhandled Exception: FileSystemException: Failed to decode data using encoding 'utf-8'

使用 ffmpeg 加密文件:

ffmpeg -i samplevideo.mp4 -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr -encryption_key 76a6c65c5ea762046bd749a2e632ccbb -encryption_kid a7e61c373e219033c21091fa607bf3b8 enc_v1_file.mp4

使用 Dart 解码视频文件:

Future<String> decryptFile(filePath) async {
    // filePath - Local encrypted file path
    var encodedKey = 'NzZhNmM2NWM1ZWE3NjIwNDZiZDc0OWEyZTYzMmNjYmI=';
    var encodedIv = 'YTdlNjFjMzczZTIxOTAzM2MyMTA5MWZhNjA3YmYzYjg=';
    var encryptedBase64EncodedString = new File(filePath).readAsStringSync();
    var decoded = base64.decode(encryptedBase64EncodedString); // Error in this line
    final key1 = enc.Key.fromBase64(encodedKey);
    final iv = enc.IV.fromBase64(encodedIv);
    final encrypter = enc.Encrypter(enc.AES(key1, mode: enc.AESMode.ctr));
    final decrypted = encrypter.decryptBytes(enc.Encrypted(decoded), iv: iv);
    final filename = '${p.basenameWithoutExtension(filePath)}.mp4';
    final directoryName = p.dirname(filePath);
    final newFilePath = p.join(directoryName, filename);
    var newFile = new File(newFilePath);
    await newFile.writeAsBytes(decrypted);
    return newFilePath;
}

标签: flutterdartffmpegaes

解决方案


推荐阅读