Python 加密模块,用于解密 s3 中的客户端加密数据



我有一个场景,其中 s3 中的数据使用对称密钥进行客户端加密,我想解密来自 Lambda 的数据。

我对客户端加密的理解是 s3 使用内容加密密钥 (cek( 来加密数据,并以加密形式 iv 将此 cek 添加到 s3 文件元数据中。在我的情况下,由Odin维护的客户密钥促进了这种cek加密。解密计划是从相应的文件元数据中解密 cek,然后使用它来解密文件的实际内容。

以下是关于相同的 aws s3 文档 - https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/package-summary.html

为了实现这一点,我正在使用python加密模块,我正在读取s3元数据以获取x-amz-key(cek(和x-amz-iv,解码它们(使用base64.b64解码(并使用密码解密器解密x-amz密钥密钥,然后我使用解密密钥解密实际身体。但是,当我这样做时,我的 lambda 会运行,但只提供我无法使用的垃圾数据。

代码片段 -

sym_key = 'ksjbfkjawdhgiua#151' #this is just a made-up symmetric key
print ('sym key ', type(sym_key), sym_key)
bucket_name = '<s3-bucket-name>'
prefix = '<encryted_file_key>'
s3_email = s3.Object(bucket_name, prefix)
meta = s3_email.get()['Metadata']
print ('meta ', type(meta), meta)
encrypted_data = s3_email.get()['Body'].read()
env_key = base64.b64decode(meta['x-amz-key'])
env_iv = base64.b64decode(meta['x-amz-iv'])
print ("Decrypting symmetric key..")
cipher = Cipher(algorithms.AES(sym_key), modes.CBC(env_iv), backend=default_backend())
decryptor = cipher.decryptor()
decrypt_key = decryptor.update(env_key) + decryptor.finalize()
#using below subsetting the decrypt_key to keep AES key to 256 length
decrypt_key = decrypt_key[len(env_iv):]
print ('decrypt_key ', type(decrypt_key), decrypt_key)
#start data decryption
data_cipher = Cipher(algorithms.AES(decrypt_key), modes.CBC(env_iv), default_backend())
data_decryptor = data_cipher.decryptor()
decrypt_txt = data_decryptor.update(encrypted_data) + data_decryptor.finalize()
#prints gives some garbage characters
print ('decrypt_txt ', type(decrypt_txt), decrypt_txt)

我相信这是解密数据的正确途径,但函数调用中的参数出错。请指教。

看起来我必须在创建第一个密码上下文对象时使用 ECB(( 模式来解密 x-amz 密钥

cipher = Cipher(algorithms.AES(sym_key), modes.ECB(), backend=default_backend())

这解决了问题

最新更新