首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
GeekHub
TaAmSf
V2EX  ›  问与答

视频 aes-128 加密

  •  
  •   TaAmSf · 150 天前 · 1674 次点击
    这是一个创建于 150 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    对比字节码

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

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

    p.s. 楼上说不用加密所有数据……嗯……看看快播的下场吧……
    imn1
        5
    imn1   150 天前   ❤️ 1
    @mengzhuo
    全部加密的话,一定有人邀你喝茶的,迟早的事
    TaAmSf
        6
    TaAmSf   150 天前
    @ryd994 使用的是 python 的 pycrypto 库。
    @mcfog 我尝试一下。
    TaAmSf
        7
    TaAmSf   150 天前
    @msg7086 #2 我对比二进制估计是每 16 个字节
    gamexg
        8
    gamexg   150 天前   ❤️ 1
    你这速度严重不对,
    即使没有 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
        9
    TaAmSf   150 天前
    @gamexg #8 我是每次读取 16 个字节, 你这应该是整个文件加密吧
    gamexg
        10
    gamexg   150 天前   ❤️ 1
    @TaAmSf #9 每次加密 1500 字节和直接加密整个文件都有,差距不是很大。
    lonewolfakela
        11
    lonewolfakela   150 天前   ❤️ 1
    如果可以的话发个代码让大家看看你是怎么写的呀,这么慢肯定是哪儿写的不对。
    TaAmSf
        12
    TaAmSf   149 天前
    @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
        13
    lonewolfakela   149 天前   ❤️ 2
    @TaAmSf 虽然我不太会 python,但是我感觉你这每 16 个字节就 new 一个新的 aes 对象是不是不太妙啊
    TaAmSf
        14
    TaAmSf   149 天前
    @lonewolfakela #13 我晚上去按楼上大佬的方法试一下。
    westoy
        15
    westoy   149 天前   ❤️ 1
    主要时间都花在 print 上了...
    allenforrest
        16
    allenforrest   149 天前   ❤️ 1
    @TaAmSf 太实诚了。虽然 AES-128 是一个 block 16byte,但实际加密时可以扔一个很大的 buffer 进去加密,只要 buffer 长度 16byte 对齐就行了,比如 1M 加密一次,当然还可以更大,看内存消耗了。
    16byte 加密一次效率太低了,函数调用开销、AES 对象创建开销、print 开销、write 开销等等。
    ZRS
        17
    ZRS   149 天前 via iPhone   ❤️ 1
    我猜你的开销在 IO 上
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4290 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 08:16 · PVG 16:16 · LAX 01:16 · JFK 04:16
    ♥ Do have faith in what you're doing.