我正在更新 Python 脚本以使用密码学的 AESGCM primitive因此它可以与运行 OpenSSL AES-256-GCM implementation 的 Rails 服务器交互.
首先,我使用相同的消息/ key /随机数模拟加密,以查看两种实现是否产生相同的输出。
python 3
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
data = b"a secret message"
aad = None
key = b'7\x98\xc1\xdf\x7f}\xea5?\\6\x17\tlT\xed\xa2a\x0fn\x87.(\x0c\xe4;*4\xda\x8fY\xc8'
aesgcm = AESGCM(key)
nonce = b'\x8ch\xbe\xfcR\xeee\xc1g\xd6\x80\xda'
ct = aesgcm.encrypt(nonce, data, aad)
ct: b'\xa8\xda\xdd\xdc\xca\xe8X\x84\xdb\x85\xef\xa6\xa6\x95\x00PN\x1e\xe7\xb0\x88\xae\xddc0\x19_\xae\x7f\xfd\x0c.'
rails
cipher = OpenSSL::Cipher.new('aes-256-gcm').encrypt
data = "a secret message".encode('utf-8')
cipher.key = "7\x98\xc1\xdf\x7f}\xea5?\\6\x17\tlT\xed\xa2a\x0fn\x87.(\x0c\xe4;*4\xda\x8fY\xc8"
cipher.iv = "\x8ch\xbe\xfcR\xeee\xc1g\xd6\x80\xda"
encrypted = cipher.update(data) + cipher.final
encrypted: "\xA8\xDA\xDD\xDC\xCA\xE8X\x84\xDB\x85\xEF\xA6\xA6\x95\x00P"
tag = cipher.auth_tag
tag: "\xB7B\x84h\xDD\xB7y\xCE\x88\xFDI\x9F\xD3\x13\xC51"
来自上面的例子:
- Rails的
encrypted
与Python的ct
的第一部分相同。 - Rails 的
tag
与Python 的ct
的第二部分不一样。
我如何修改这些过程中的一个或两个以使它们产生相同的输出?
最佳答案
刚找到 - 答案在于 OpenSSL 如何区别定义 data
与 auth_data
。
OpenSSL 文档在 linked example 中有点困惑因为他们没有告诉我 data
指的是消息,而 auth_data
是额外的经过身份验证的数据。
在我的测试中,我错误地将 auth_data 和 data 设置为“ secret 消息”,这就是为什么 data
被一致加密但最后经过身份验证的数据位不同的原因。
TLDR:data
是您的消息; auth_data
未加密,如果为空,应设置为 ""
。
关于ruby-on-rails - AES-256-GCM Python 密码学与 Rails OpenSSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49969271/