草庐IT

FFmpeg Mp4加解密

音视频开发老马 2023-07-28 原文

基础知识

通过FFmpeg解封装或者封装Mp4容器时,可以进行解密或者加密,这是MP4容器提供的能力。

  • libavformat/movenc.c:提供了mov、3gp、mp4、psp、3g2、ipod、ismv和f4v的Muxer。
  • libavformat/mov.c:提供了mov、mp4、m4a、3gp、3g2和mj2的Demuxer。

针对加密,libavformat/movenc.c提供了三个参数:

{ "encryption_scheme",    "Configures the encryption scheme, allowed values are none, cenc-aes-ctr", offsetof(MOVMuxContext, encryption_scheme_str),   AV_OPT_TYPE_STRING, {.str = NULL}, .flags = AV_OPT_FLAG_ENCODING_PARAM },
{ "encryption_key", "The media encryption key (hex)", offsetof(MOVMuxContext, encryption_key), AV_OPT_TYPE_BINARY, .flags = AV_OPT_FLAG_ENCODING_PARAM },
{ "encryption_kid", "The media encryption key identifier (hex)", offsetof(MOVMuxContext, encryption_kid), AV_OPT_TYPE_BINARY, .flags = AV_OPT_FLAG_ENCODING_PARAM },

加密时,需要指定上面三个参数。

针对解密,libavformat/mov.c提供了一个参数:

{ "decryption_key", "The media decryption key (hex)", OFFSET(decryption_key), AV_OPT_TYPE_BINARY, .flags = AV_OPT_FLAG_DECODING_PARAM }

解密时,只要指定一个decryption_key就可以了。

命令行操作

加密一个文件:

ffmpeg -i decryption.mp4 -vcodec copy -acodec copy -encryption_scheme cenc-aes-ctr -encryption_key c7e16c4403654b85847037383f0c2db3 -encryption_kid a7e61c373e219033c21091fa607bf3b8 encryption.mp4

播放加密的mp4文件:

ffplay -i encryption.mp4 -decryption_key c7e16c4403654b85847037383f0c2db3

针对加密的mp4文件,解密出一个未加密文件:

ffmpeg -decryption_key c7e16c4403654b85847037383f0c2db3 -i encryption.mp4 decryption.mp4

代码实现

加密:

AVDictionary *opts = NULL;
// 指定加密参数
av_dict_set(&format_opts, "encryption_scheme", "cenc-aes-ctr", 0);
av_dict_set(&format_opts, "encryption_key", "c7e16c4403654b85847037383f0c2db3", 0);
av_dict_set(&format_opts, "encryption_kid", "a7e61c373e219033c21091fa607bf3b8", 0);
ret = avformat_write_header(AVFormatContext, &format_opts);

解密:

AVDictionary *format_opts = NULL;
// 指定解密key
av_dict_set(&format_opts, "decryption_key", "c7e16c4403654b85847037383f0c2db3", 0);
err = avformat_open_input(&AVFormatContext, "path", AVInputFormat, &format_opts);

Box差异

加密前的Mp4 Box:

加密后的Mp4 Box:

相比于原始文件,加密文件在stbl下新增加了3个box:

  1. senc:sample specific encryption data,特定加密数据样本。
  2. saio:sample auxiliary information offsets,样本辅助信息偏移量。
  3. saiz:sample auxiliary information sizes,样本辅助信息大小。

有关FFmpeg Mp4加解密的更多相关文章

  1. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  2. ruby - Ruby 中的单 block AES 解密 - 2

    我需要尝试一些AES片段。我有一些密文c和一个keyk。密文已使用AES-CBC加密,并在前面加上IV。不存在填充,纯文本的长度是16的倍数。所以我这样做:aes=OpenSSL::Cipher::Cipher.new("AES-128-CCB")aes.decryptaes.key=kaes.iv=c[0..15]aes.update(c[16..63])+aes.final它工作得很好。现在我需要手动执行CBC模式,所以我需要单个block的“普通”AES解密。我正在尝试这个:aes=OpenSSL::Cipher::Cipher.new("AES-128-ECB")aes.dec

  3. ruby-on-rails - 我如何比较 'Bcrypt' Gem解密的密码和加密的密码 - 2

    我正在尝试对某些帖子的评论使用简单的身份验证。用户使用即时ID和密码输入评论我使用“bcrypt”gem将密码存储在数据库中。在comments_controller.rb中像这样@comment=Comment.new(comment_params)bcrypted_pwd=BCrypt::Password.create(@comment.user_pwd)@comment.user_pwd=bcrypted_pwd当用户想要删除他们的评论时,我使用data-confirm-modalgem来确认数据在这部分,我必须解密用户输入的密码以与数据库中的加密密码进行比较我怎样才能解密密码,

  4. ruby - ruby 中的错误解密错误 - 2

    在执行cipher.final时,提示baddecrypt错误。我试图找出问题所在。但是,我找不到。你能告诉我我的代码有什么问题吗?这是我的代码:require'openssl'require'base64'require'hex_string'result_h="4fcd6b1ac843a2f8bf13f2e53dd5c1544fcd6b1ac843a2f8"key=result_h.to_byte_stringencrypt_str="79994A6EF73DA76C";cipher=OpenSSL::Cipher.new("DES-EDE3-CBC")cipher.decrypt

  5. ruby-on-rails - rails 加密/解密 - 2

    我需要在我的Rails应用程序中进行加密和解密。我正在尝试使用ezcrypto,但每当我进行解密时,我都会收到此错误。OpenSSL::Cipher::CipherErrorinProfilesController#showwrongfinalblocklength需要更改什么才能停止此错误。我尝试像这样使用openssl的另一个实现(从我的模型中调用的方法)defencrypt_attr(unencrypted)c=OpenSSL::Cipher.new("aes-256-cbc")c.encryptc.key=Digest::SHA1.hexdigest('pass')e=c.up

  6. ruby-on-rails - Rails 中的加密解密 - 2

    我正在使用require'digest/sha1'来加密我的密码并保存到数据库中。在登录期间,我通过匹配保存在数据库中的加密密码进行身份验证,并再次加密一次使用密码字段中的输入。截至目前一切正常,但现在我想执行“忘记密码”功能。为此,我需要解密保存在数据库中的密码以找到原始密码。如何使用digest/sha1解密?或者谁知道什么算法也支持加解密?我在Rails上使用ruby​​,所以我需要用Ruby的方式来完成它。 最佳答案 SHA1是一种单向函数,您无法将其反转。这可能与密码重置有关:http://www.binarylogic.

  7. ruby - 如何使用 Ruby gpgme 解密 PGP 加密文件 - 2

    我找不到有关如何执行此操作的单个示例。我有一个PGP加密的XLS文件和一个PGPkey。这是我返回空字符串的代码:require'rubygems'require'gpgme'defpassfunc(obj,uid_hint,passphrase_info,prev_was_bad,fd)io=IO.for_fd(fd,'w')io.puts"PASSPHRASE"io.flushendencrypted_data=GPGME::Data.new(File.open("file.xls.pgp"))key=GPGME::Data.new(File.open("key.txt"))ctx

  8. ruby - Ruby 中的 SJCL AES-128-CCM 解密 - 2

    我正在尝试在Ruby中实现aes-128-ccm加密字符串的SJCL解密。看完了similarquestion我看到这应该在较新版本的OpenSSL库中得到支持,所以我已经将开发版本从github安装到/opt执行此操作后,当我运行/opt/bin/opensslciphers时,我没有在列表中看到aes-128-ccm密码:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECD

  9. sql - Rails + PostgreSQL SSL 解密失败 - 2

    我的生产服务器上运行了一个应用程序,它使用pggem与Postgres数据库通信。Postgres在默认端口上运行,并且位于防火墙后面-因此只能从localhost访问它。我还没有配置Postgres来做任何与SSL相关的事情。我正在通过SSL访问Rails应用程序,并且证书是为另一个域签名的,所以当您第一次点击它时,会出现证书错误……但这是唯一与SSL相关的奇怪之处。然而,我在我的Rails日志中间歇性地看到这个(当它发生时浏览器会出现500错误):StartedGET"/admin/pages"forat2012-02-0201:52:03-0500ProcessingbyPage

  10. ruby - 如何在 Ruby 中解密 MD5? - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Isitpossibletodecryptmd5hashes?我在Ruby中这样做:Digest::MD5.hexdigest("Jose")并得到“70483b6e100c9cebbffcdc62dea07eda”但是,我如何将它解密回“Jose”?

随机推荐