1

我正在开发一种将 AES-128 加密应用于 HLS 流的工具。到目前为止,这是我的 Ruby 代码:

aes = OpenSSL::Cipher::AES.new(128, :CBC)
aes.encrypt
aes_key = aes.random_key
aes_iv = aes.random_iv

现在,当我输出 aes_iv 时,它给了我很明显只是我的 shell 环境难以转换为文本的二进制数据。那讲得通。我需要将其转换为十六进制表示。

IV 必须在 HLS 清单文件中指明,如下所示:

#EXT-X-KEY:METHOD=AES-128,URI="crypt0.key",IV=0xdc03cfac7ea13f69dd49c1411c14c264

该行的 IV 属性描述如下:

“该值是一个十六进制整数,它指定要与密钥一起使用的初始化向量。IV 属性出现在协议版本 2 中。”

我有两个问题:

  1. 如何确定 random_iv 设置的 IV 与 HLS 规范兼容?
  2. 如何将二进制 IV 输出从 random_iv 转换为所需的十六进制值?

我试过这样做:

aes_iv.unpack("H*")aes_iv.unpack("h*"),它返回类似“4b56da546d807eb0870170b4e03d77dd”的东西,这似乎是正确的。但是,当我将其指定为 IV 时,无法播放视频。

我已将问题隔离到 IV,就好像我没有调用 random_iv 并指定“000000000000000000000000000000000”的 IV,它可以工作。

4

1 回答 1

0

好的,看起来我可以使用 aes_iv.unpack("H*") 让它工作。我想我正在查看早期失败试验的一些较旧的视频文件。

我对为什么 H* 有效而 h* 无效一无所知。我看到这里有一个描述:http: //apidock.com/ruby/String/unpack,它解释了低半字节与高半字节的区别,但不确定这里有什么区别。

于 2013-04-17T20:09:02.950 回答