我正在尝试解密一些使用客户端加密的S3文件(不是我)。我已经获得了公钥和私钥,并告诉RSA被使用......但我正在努力弄清楚如何解密这个文件。
我的理解是这是一个两步过程:
下载包含metadata['x-amz-key']
的文件的元数据 - 这是第一个需要使用我的私钥解密的密钥。
解密后会生成一个新密钥,可用于解密实际文件吗?
我不确定该怎么做。到目前为止,我已经尝试了这个(我认为这涵盖了第1步)。
会喜欢这方面的帮助 - 非常困惑。
import base64
from Crypto.PublicKey import RSA
key = "-----BEGIN PRIVATE KEY-----\nMAHJKxxxxxxxx\n-----END PRIVATE KEY-----"
rsa_Key =RSA.importKey(key)
raw_cipher_data = envelope_key
second_key = rsa_Key.decrypt(raw_cipher_data)
然后产生如下所示的内容:
b"\x15\\xc0\\s'
即使这是正确的......我怀疑它不是。那么我将如何继续解密实际的S3文件?
再次感谢。
下一步
据我所知,这似乎是一种合理的方法,经过大量阅读后我更有信心(这篇文章也有很多帮助(How To Decrypt AWS Ruby Client-side Encryption in Python)。
然而,仍然无法让这个工作......
from Crypto.Cipher import AES
object_info = s3.head_object(Bucket="xxxx", Key="Secret.txt")
metadata = object_info['Metadata']
envelope_key = base64.b64decode(metadata['x-amz-key'])
envelope_iv = base64.b64decode(metadata['x-amz-iv'])
ENV_KEY_LENGTH = 32
ENCRYPTION_KEY = base64.b64decode(KEY)
key = "-----BEGIN PRIVATE KEY-----\nXXXX\n-----END PRIVATE KEY-----"
rsa_Key =RSA.importKey(key)
envelope_key = rsa_Key.decrypt(envelope_key)[:ENV_KEY_LENGTH]
envelope_iv = rsa_Key.decrypt(envelope_iv)[:ENV_KEY_LENGTH]
decryptor = AES.new(envelope_key, AES.MODE_CBC, envelope_iv)
with open('Desktop/test.txt', 'r') as f:
f.read()
secret_de = decryptor.decrypt(f)
print(secret_de)
答案 0 :(得分:0)
根据您对元数据字段的引用,我怀疑您所看到的是使用S3加密客户端[1]加密的对象。虽然这确实意味着它是以一致的方式加密和存储的,但遗憾的是我们目前没有这种格式和方法记录很好,而且我们目前没有Python的客户端。这些都是我们未来希望改进的东西,但这对你现在并没有什么帮助。
尽管我不想让某人远离Python,但在这种情况下,我的第一个建议是使用提供此功能的现有支持客户端之一。根据您的描述,您需要一个支持RSA密钥包装,因此从功能矩阵[2]中,您需要Java或Ruby客户端。
[1] https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingClientSideEncryption.html
[2] https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html