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

2022-05-28 19:23:51 +08:00
 xiaoyanbot
原始版本的 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 模式。
1491 次点击
所在节点    SSL
15 条回复
haah
2022-05-28 19:40:55 +08:00
什么叫做原始版本的 AES ?
xiaoyanbot
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
2022-05-28 19:59:47 +08:00
上面样例程序连接:Go Cryptography Code Examples 小标题部分,为使用 crypto/aes 的样例。
unixeno
2022-05-28 20:33:48 +08:00
@xiaoyanbot 你这个代码里用的是 32byte 的 key ,对应 go 文档里写的就是用的 aes-256
你用 aes-128 当然不行
boboliu
2022-05-28 23:56:34 +08:00
openssl enc -e -aes256

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

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

This is a secret
~~~
xiaoyanbot
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
2022-05-29 10:06:29 +08:00
@xiaoyanbot 看得我有点迷糊,你举例应该要带密钥吧,没有密钥怎么举例?不同的密钥得出的密文不一样吧
xiaoyanbot
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
2022-05-29 11:57:02 +08:00



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


感谢两位大神,破案了
xiaoyanbot
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
2022-05-29 16:21:57 +08:00
@xiaoyanbot 故名思义就是不填充,但是有个限制就是数据必须正好要是 16 的整数倍,所以通常都不会使用这个模式的,而是使用 pkcs5 填充,因为你要求得到和你给的 go 示例里完全一致的结果,所以在这个例子里只有 nopad 才能满足,但是真正用于通用场景的话还是应该使用 pkcs5 填充

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

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

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

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

© 2021 V2EX