2015-04-21 3 views
1

AWS S3 SDK для Ruby позволяет шифровать файл на стороне клиента («конверт»). Это комбинация шифрования AES CBC/ECB для клиентского ключа, где ключ конверта и вектор инициализации хранятся в метаданных.Как расшифровать шифрование на стороне клиента AWS Ruby на Python

У меня есть разработчик Ruby, который зашифровал различные файлы в ведро S3, которое мне нужно получить и расшифровать с помощью Python. В Python S3 AWS SDK в настоящее время нет этой клиентской функции.

Предполагая, что файл был зашифрован с помощью параметра encryption_key из API рубин bucket.write S3:

#!/usr/bin/ruby 
# coding: utf-8 

require 'aws-sdk' 
require 'openssl' 

access_key = '<aws_access_key>' 
secret_access_key = '<secret_access_key>' 
encryption_key = "passwordpassword" 

s3 = AWS::S3.new 
storage_host = "our_bucket" 
storage_path = "prod/master_report/test.txt" 
bucket_obj = s3.buckets[storage_host].objects[storage_path] 
bucket_obj.write(file: 'test.txt', encryption_key: encryption_key) 

Есть ли способ, чтобы расшифровать файлы с Python вместо того, чтобы использовать Ruby, SDK?

ответ

4

Прошел немного трассировки через SDK Ruby S3, но клиентское шифрование на стороне клиента реализовано как «шифрование огибающей» с использованием алгоритма AES. Короче говоря, содержимое конверта зашифровывается с использованием AES-CBC с ключом и IV, хранящимся в метаданных файла (с кодировкой base64). Сам ключ CBC представляет собой AES-EBC, закодированный с помощью ключа ключа шифрования.

Рубиновый стороне клиента зашифрованный файл может быть расшифрован с этим Python:

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

from __future__ import print_function 
import boto 
import tempfile 
import base64 
from Crypto.Cipher import AES 

ENCRYPTION_KEY = b"passwordpassword" 
ENV_KEY_LENGTH = 32 

conn = boto.connect_s3() 
bucket = conn.get_bucket('our_bucket', validate=False) 
encrypted = bucket.get_key('prod/master_report/test.txt') 

# get envelop keys from file metadata 
metadata = encrypted.metadata 
envelope_key = base64.b64decode(metadata['x-amz-key']) 
envelope_iv = base64.b64decode(metadata['x-amz-iv']) 

# decrypt envelope key 
cipher = AES.new(ENCRYPTION_KEY, AES.MODE_ECB) 
envelope_key = cipher.decrypt(envelope_key)[:ENV_KEY_LENGTH] 

# write encrypted file 
tf = tempfile.TemporaryFile() 
encrypted.get_file(tf) 

cipher = AES.new(envelope_key, AES.MODE_CBC, envelope_iv) 

# read contents of file 
contents = "" 
with open('simple/decrypted.txt', 'w') as out: 
    tf.seek(0) 
    with tf: 
     for line in tf: 
      dec_line = cipher.decrypt(line) 
      contents += dec_line 
      print(dec_line, file=out) 

tf.close() 

print("Decrypted: %s" % (contents,)) 
Смежные вопросы