视频 aes-128 加密

2019-11-12 03:08:01 +08:00
 TaAmSf

想做一个视频加密的软件,视频每 16 个字节进行 aes-128 加密,十几兆就需要十几分钟,市面上的视频加密软件为什么可以一个 1G 的视频几分钟就完成了,对比他们的加密内容应该也是 16 位 加密呀,而且也没有另起线程。

3097 次点击
所在节点    问与答
17 条回复
ryd994
2019-11-12 05:20:06 +08:00
用的什么库?有没有用到 AES-NI 硬件加速?
msg7086
2019-11-12 07:23:58 +08:00
每 16 个字节?
mcfog
2019-11-12 07:42:11 +08:00
1、你代码可能没写对或者语言不对运行方式不对导致没有发挥出硬件性能(十几兆十几分钟不像是正常的现代 cpu 的 aes 性能)
2、没有硬件层面的优化的前提下 AES 就不是一个高性能的算法,可以试试 chacha
3、其他软件可能更快的另一个原因是没有加密所有字节(其实也不需要),拆包视频以后加密关键的元信息就行了
mengzhuo
2019-11-12 10:06:09 +08:00
肯定是没用到硬件
而且“一个 1G 的视频几分钟”……

这也太慢了,普通的 arm 芯片带硬加 /解的都能 600MB/s,跑满磁盘 IO 都不是梦
这还没上多线程呢……

p.s. 楼上说不用加密所有数据……嗯……看看快播的下场吧……
imn1
2019-11-12 11:20:34 +08:00
@mengzhuo
全部加密的话,一定有人邀你喝茶的,迟早的事
TaAmSf
2019-11-12 11:42:59 +08:00
@ryd994 使用的是 python 的 pycrypto 库。
@mcfog 我尝试一下。
TaAmSf
2019-11-12 11:44:18 +08:00
@msg7086 #2 我对比二进制估计是每 16 个字节
gamexg
2019-11-12 11:46:33 +08:00
你这速度严重不对,
即使没有 AES 指令集的超级古董 cpu 也能跑到 50M/s 以上。

以前做过的速度测试:



i7-8750H cpu

1500 大小:
aes-128:
加密 102.00119018554688M,耗时:226.0222ms,平均:451.28836983954176M/s
解密 102.00119018554688M,耗时:119.006ms,平均:857.109643089818M/s
aes-192:
加密 102.00119018554688M,耗时:137.9974ms,平均:739.1529853862962M/s
解密 102.00119018554688M,耗时:124.9997ms,平均:816.0114799119267M/s
aes-256:
加密 102.00119018554688M,耗时:154.9886ms,平均:658.1205984539952M/s
解密 102.00119018554688M,耗时:142.9699ms,平均:713.445208995368M/s
104329 大小:
aes-128:
加密 102.0827808380127M,耗时:120.047ms,平均:850.3567839097411M/s
解密 102.0827808380127M,耗时:108.9914ms,平均:936.6131716632018M/s
aes-192:
加密 102.0827808380127M,耗时:128.9597ms,平均:791.5866804746962M/s
解密 102.0827808380127M,耗时:115.0388ms,平均:887.3769618425496M/s
aes-256:
加密 102.0827808380127M,耗时:146.9602ms,平均:694.628755527093M/s
解密 102.0827808380127M,耗时:131.0421ms,平均:779.0075161952739M/s






A10 5800k cpu

1500 大小:
aes-128:
加密 102.00119018554688M,耗时:622.58ms,平均:163.8362783667109M/s
解密 102.00119018554688M,耗时:434.5538ms,平均:234.72626447069817M/s
aes-192:
加密 102.00119018554688M,耗时:518.566ms,平均:196.6985691031554M/s
解密 102.00119018554688M,耗时:476.5611ms,平均:214.03591309812504M/s
aes-256:
加密 102.00119018554688M,耗时:553.0698ms,平均:184.42733663191677M/s
解密 102.00119018554688M,耗时:500.065ms,平均:203.97586350883762M/s
104329 大小:
aes-128:
加密 102.0827808380127M,耗时:449.0572ms,平均:227.32689919683438M/s
解密 102.0827808380127M,耗时:427.0523ms,平均:239.04046609282446M/s
aes-192:
加密 102.0827808380127M,耗时:499.5638ms,平均:204.3438312343943M/s
解密 102.0827808380127M,耗时:475.0617ms,平均:214.8832053562994M/s
aes-256:
加密 102.0827808380127M,耗时:508.0647ms,平均:200.9247657591891M/s
解密 102.0827808380127M,耗时:488.0622ms,平均:209.1593670602081M/s


x5550

1500 大小:
aes-128:
加密 102.00119018554688M,耗时:1.4810847s,平均:68.86924845388442M/s
解密 102.00119018554688M,耗时:1.3200755s,平均:77.26920936381812M/s
aes-192:
加密 102.00119018554688M,耗时:1.4890852s,平均:68.49923039027377M/s
解密 102.00119018554688M,耗时:1.4410824s,平均:70.78095616568967M/s
aes-256:
加密 102.00119018554688M,耗时:1.7751016s,平均:57.462170157216285M/s
解密 102.00119018554688M,耗时:1.9871137s,平均:51.331330555240434M/s
104329 大小:
aes-128:
加密 102.0827808380127M,耗时:1.5420882s,平均:66.19775758482082M/s
解密 102.0827808380127M,耗时:1.3030745s,平均:78.33994206625384M/s
aes-192:
加密 102.0827808380127M,耗时:1.5370879s,平均:66.41310548213455M/s
解密 102.0827808380127M,耗时:1.7210985s,平均:59.31257324203855M/s
aes-256:
加密 102.0827808380127M,耗时:1.8261044s,平均:55.901941224177925M/s
解密 102.0827808380127M,耗时:1.5300875s,平均:66.71695627734537M/s
TaAmSf
2019-11-12 11:55:31 +08:00
@gamexg #8 我是每次读取 16 个字节, 你这应该是整个文件加密吧
gamexg
2019-11-12 12:01:02 +08:00
@TaAmSf #9 每次加密 1500 字节和直接加密整个文件都有,差距不是很大。
lonewolfakela
2019-11-12 16:03:13 +08:00
如果可以的话发个代码让大家看看你是怎么写的呀,这么慢肯定是哪儿写的不对。
TaAmSf
2019-11-12 17:17:31 +08:00
@lonewolfakela #11
from Crypto.Cipher import AES

KEY = '123123'

video_url = './video.flv'

in_f = open(video_url, 'rb')
out_f = open("out", 'wb+')


def encryption(s: bytes):
aes = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
ciphertext = aes.encrypt(s)
print(ciphertext)
return ciphertext


while True:
b = in_f.read(16)
if len(b) == 0:
break
out_f.write(encryption(b))

in_f.close()
out_f.close()
lonewolfakela
2019-11-12 17:39:44 +08:00
@TaAmSf 虽然我不太会 python,但是我感觉你这每 16 个字节就 new 一个新的 aes 对象是不是不太妙啊
TaAmSf
2019-11-12 17:56:33 +08:00
@lonewolfakela #13 我晚上去按楼上大佬的方法试一下。
westoy
2019-11-12 18:41:36 +08:00
主要时间都花在 print 上了...
allenforrest
2019-11-12 19:16:08 +08:00
@TaAmSf 太实诚了。虽然 AES-128 是一个 block 16byte,但实际加密时可以扔一个很大的 buffer 进去加密,只要 buffer 长度 16byte 对齐就行了,比如 1M 加密一次,当然还可以更大,看内存消耗了。
16byte 加密一次效率太低了,函数调用开销、AES 对象创建开销、print 开销、write 开销等等。
ZRS
2019-11-13 00:08:54 +08:00
我猜你的开销在 IO 上

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/618638

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX