ruby-on-rails - AES-256-GCM Python 密码学与 Rails OpenSSL

标签 ruby-on-rails python-3.x cryptography aes-gcm

我正在更新 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 如何区别定义 dataauth_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/

相关文章:

ruby-on-rails - Rails 使用 curl 设计登录

python-3.x - 在 Python 3 中将文件路径分配给变量

python - nonlocals() 在哪里?

algorithm - 密文窃取算法 - 哪一种是正确的?

java - 使用 ECDH 公钥封装 key ?

ruby-on-rails - Rails 上的电子邮件通知

ruby-on-rails - 在 Rails 中使用多选列表

Python 正则表达式删除空格 b/w 括号和数字

c++ - openssl RAND_add() 文档引用 RFC1750。 RFC1750 对此事保持沉默

ruby-on-rails - rails 4 : how to implement a column with multiple elements