请教下 OpenSSL 如何加密出原始版本的 AES(FIPS 197),或者是换种问法, OpenSSL 如何加密出 Go 标准库 [crypto/aes] 一样的算法,需要互操作(互认) - V2EX
xiaoyanbot
V2EX    SSL

请教下 OpenSSL 如何加密出原始版本的 AES(FIPS 197),或者是换种问法, OpenSSL 如何加密出 Go 标准库 [crypto/aes] 一样的算法,需要互操作(互认)

  •  
  •   xiaoyanbot 2022-05-28 19:23:51 +08:00 2081 次点击
    这是一个创建于 1232 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原始版本的 AES ( FIPS 197 ): https://csrc.nist.gov/publications/detail/fips/197/final

    然后 Go 语言的标准库 crypto/aes 这个类,实现的是这个 197 文档描述的 AES: https://pkg.go.dev/crypto/aes

    请教下 OpenSSL 如何加密出如上一致的密文,以便进行互操作。



    试了 OpenSSL 的 AES-128-ECB 模式,也不是这个原始版本的 AES 模式。
    第 1 条附言    2022-05-29 08:35:25 +08:00
    补充上下面的 AES-128 , 应该是 AES-256 模式
    第 2 条附言    2022-05-29 10:54:03 +08:00
    go 标准库 aes 类库使用加密方法,文档: https://pkg.go.dev/crypto/aes 样例程序: https://www.developer.com/languages/cryptography-in-go/
    15 条回复    2022-05-29 16:21:57 +08:00
    haah
        1
    haah  
       2022-05-28 19:40:55 +08:00
    什么叫做原始版本的 AES ?
    xiaoyanbot
        2
    xiaoyanbot  
    OP
       2022-05-28 19:57:49 +08:00
    @haah 就是 go 标准库 aes 类库使用加密方法,文档: https://pkg.go.dev/crypto/aes 样例程序: https://www.developer.com/languages/cryptography-in-go/
    xiaoyanbot
        3
    xiaoyanbot  
    OP
       2022-05-28 19:59:47 +08:00
    上面样例程序连接:Go Cryptography Code Examples 小标题部分,为使用 crypto/aes 的样例。
    unixeno
        4
    unixeno  
       2022-05-28 20:33:48 +08:00 via Android
    @xiaoyanbot 你这个代码里用的是 32byte 的 key ,对应 go 文档里写的就是用的 aes-256
    你用 aes-128 当然不行
    boboliu
        5
    boboliu  
       2022-05-28 23:56:34 +08:00
    openssl enc -e -aes256

    多学习,请
    xiaoyanbot
        6
    xiaoyanbot  
    OP
       2022-05-29 08:29:29 +08:00
    @unixeno 使用 OpenSSL 的 AES-256-ECB 模式,试了,也是对不上

    这是 OpenSSL 加密出来的
    ~~~
    MZ1PplXtVDtKoNHv3DYZ2MuvVv6qt2Dsi0GY+VDa6VU=

    This is a secret
    ~~~
    xiaoyanbot
        7
    xiaoyanbot  
    OP
       2022-05-29 08:34:42 +08:00
    @boboliu

    输入 [openssl enc -e -aes256]

    提示是这样子的:

    enter aes-256-cbc encryption password:

    也就是加密使用的 cbc 模式, 但 aes-256-cbc 模式加密出来的是:

    ~~~

    MZ1PplXtVDtKoNHv3DYZ2K94NCKc0oz8Otbb8hQlvbI=

    This is a secret

    ~~~

    还是和 go 加密出来的不一样

    这是 go 加密出来的: 代码来自上面的样例程序 Go Cryptography Code Examples 小标题部分
    ~~~

    Encrypted Message: 319d4fa655ed543b4aa0d1efdc3619d8
    Decrypted Message: This is a secret

    ~~~
    huangya
        8
    huangya  
       2022-05-29 10:06:29 +08:00
    @xiaoyanbot 看得我有点迷糊,你举例应该要带密钥吧,没有密钥怎么举例?不同的密钥得出的密文不一样吧
    xiaoyanbot
        9
    xiaoyanbot  
    OP
       2022-05-29 10:57:30 +08:00
    @huangya 在这里哈:

    crypto/aes
    样例程序:www.developer.com/languages/cryptography-in-go/ [Go Cryptography Code Examples] 小标题。

    加密的信息是:This is a secret
    使用的 key 是:this_must_be_of_32_byte_length!!

    感谢一块分析
    GeruzoniAnsasu
        10
    GeruzoniAnsasu  
       2022-05-29 11:57:02 +08:00



    虽然但是你给的两个结果不就是一样的吗
    GuuJiang
        11
    GuuJiang  
       2022-05-29 11:59:42 +08:00 via iPhone
    不要自己发明概念,就是标准的无填充 aes-256-ecb 而已
    echo -n "This is a secret" | openssl enc -aes-256-ecb -nopad -K 746869735f6d7573745f62655f6f665f33325f627974655f6c656e6774682121 | xxd -p
    GuuJiang
        12
    GuuJiang  
       2022-05-29 12:02:34 +08:00 via iPhone
    顺便附上解密
    echo -n 319d4fa655ed543b4aa0d1efdc3619d8 | xxd -r -p | openssl enc -aes-256-ecb -d -nopad -K 746869735f6d7573745f62655f6f665f33325f627974655f6c656e6774682121
    xiaoyanbot
        13
    xiaoyanbot  
    OP
       2022-05-29 14:42:37 +08:00
    @GeruzoniAnsasu
    @GuuJiang


    感谢两位大神,破案了
    xiaoyanbot
        14
    xiaoyanbot  
    OP
       2022-05-29 15:03:34 +08:00
    我再试试:

    明文:This_is_a_secret
    key:password_16_byte
    [key 字符串转 hex:70617373776f72645f31365f62797465]

    echo -n "This_is_a_secret" | openssl enc -aes-128-ecb -nopad -K 70617373776f72645f31365f62797465 | xxd -p

    输出:27ec7ec439fb0be1fa6ac4e6c06cf048

    echo -n "This_is_a_secret" | openssl enc -aes-128-ecb -K 70617373776f72645f31365f62797465 | xxd -p

    输出:27ec7ec439fb0be1fa6ac4e6c06cf04899c3268c435d6a1ba2b69d2b4fec
    e22a

    请教下这个 -nopad 填充参数 ,具体是用的什么方法填充? 谢谢

    @GuuJiang
    @GeruzoniAnsasu
    GuuJiang
        15
    GuuJiang  
       2022-05-29 16:21:57 +08:00 via iPhone
    @xiaoyanbot 故名思义就是不填充,但是有个限制就是数据必须正好要是 16 的整数倍,所以通常都不会使用这个模式的,而是使用 pkcs5 填充,因为你要求得到和你给的 go 示例里完全一致的结果,所以在这个例子里只有 nopad 才能满足,但是真正用于通用场景的话还是应该使用 pkcs5 填充
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     893 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 19:46 PVG 03:46 LAX 12:46 JFK 15:46
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86