【问题标题】:Skipping / seeking to position with RC4 encryption使用 RC4 加密跳过/寻找定位
【发布时间】:2012-03-06 05:27:01
【问题描述】:

当我想在流式传输加密视频时“跳”到某个位置时遇到这个问题

所以我拥有的是:

http 流媒体服务器(本地,在 Android 设备上运行) 原生安卓媒体播放器 RC4 加密实用程序

基本上,我将加密视频存储在 sdcard 中,我想使用我的 http 流服务器将其流式传输到媒体播放器。服务器已经通过使用 RC4 加密实用程序在将字节写出到 OutputStream 之前转换字节来进行实时加密,这实际上是有效的。

加密文件没有问题 - 只需针对加密实用程序的生成位运行整个文件 - 我只是在尝试播放视频时重新执行此操作。问题是当我想“寻找”视频中的一个位置时,例如我想观看一部 2 小时电影的中间部分。我目前正在做的工作,虽然速度很慢,但它是重置 RC4 加密实用程序,将其输入的数量等于我在视频中跳转到的持续时间。

如果我在这里的解释听起来不是很清楚,请原谅我,但如果你真的使用 RC4 加密和流媒体,你应该遇到同样的问题。

所以问题是,有没有可能,如果有,我怎样才能“寻找”我的 RC4 位生成器中的一个位置,而不通过我刚刚跳过的所有不必要的字节?

每个视频的大小约为 500mb 左右,因此,如果我搜索到视频接近尾声,大约需要进行 500,000,000 次无用的比特迭代,然后才能流式传输正确的数据。

【问题讨论】:

    标签: java android video encryption rc4-cipher


    【解决方案1】:

    不,RC4 algorithm 不可搜索。密钥流生成的每次迭代都涉及使用两个元素的状态交换来置换依赖于密钥的 S 置换,这种方式在不实际执行所有中间交换的情况下很难重现。

    如果您使用了例如CTR mode 中的 AES,因为 CTR 模式被设计为完全可搜索。

    编辑: 但是,如果内存不稀缺,您可以做的一件事是使用您自己的 RC4 实现(参见链接,这很容易做到),并定期缓存内部状态(每个位置总共 258 个字节)。如果用户来回跳动很多,这会有所帮助,但是当用户第一次向前跳动时,必须将完整的 RC4 密钥流生成到该位置。

    【讨论】:

    • 我也是这么想的。但是,如果“很难复制”,那可能意味着这并非不可能。 +1,如果 2 天内没有人有更好的东西,那就是你的了。 :)
    • OTOH,你可以定期兑现内部状态。
    • 另一个想法是为每个 10meg 的数据块使用不同的键 - 也应该有效。
    • 我最终为每个块使用了不同的密钥。密钥将由派生函数提供,所以我实际上事先知道密钥。我认为这是一个比状态记忆更好的解决方案,因为当用户刚开始播放视频并想立即寻找最后 5 分钟的内容时,该解决方案仍然会严重失败。
    • 以这种方式使用 RC4 时,重要的是您使用 KDF,而不仅仅是将密钥和 salt/chunk id 的串联直接传递给 RC4 密钥调度。针对后者使用 RC4 的已知只有密文的攻击。
    猜你喜欢
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-09
    • 2021-12-27
    相关资源
    最近更新 更多