V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xiaoyanbot
V2EX  ›  SSL

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

  •  
  •   xiaoyanbot · 2022-05-28 19:23:51 +08:00 · 1663 次点击
    这是一个创建于 889 天前的主题,其中的信息可能已经有所发展或是发生改变。
    原始版本的 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   ·   实用小工具   ·   927 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:27 · PVG 05:27 · LAX 14:27 · JFK 17:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.