2017-11-07 17 views
6

Dữ liệu nhập: email được ký và mã hóa nhiều phần lớn (~ 10MB) được thực hiện với openssl.Hiệu suất kém M2Crypto để giải mã và xác minh email lớn

Giải mã tệp có vẻ đủ nhanh.

Nhận thông tin được giải mã để xác minh chúng là THÊM dài hơn. Dường như có một số vấn đề trong thư viện M2Crypto. Nếu bạn thay thế các cuộc gọi smime_load_pkcs7_bio bởi một tập tin viết p7s + đọc nó với smime_load_pkcs7 gọi nó là MUCH nhanh hơn. Nhưng tôi muốn tránh viết/đọc trên đĩa (vì bây giờ là nút cổ chai của tôi).

Câu hỏi: Có ai có giải pháp hoặc giải pháp cho vấn đề hiệu suất này không?

Các python 2,7 mã:

from M2Crypto import SMIME, X509, BIO, m2 

# read signed and encrypted file 
with open("toto.p7m", "r") as p7mFile: 
    p7mBio = BIO.File(p7mFile) 
    p7m = SMIME.PKCS7(m2.pkcs7_read_bio_der(p7mBio._ptr()), 1) 

s = SMIME.SMIME() 
# Decrypt 
s.load_key('cnt.key', 'cnt.crt', callback = lambda x : 'cnt_password.info') 
p7s = s.decrypt(p7m) 
print("Decryption ok (and fast).") 
# Verify 
p7s_bio = BIO.MemoryBuffer(p7s) 
p7, data = SMIME.smime_load_pkcs7_bio(p7s_bio) 
# MUCH FASTER !!! 
#p7, data = SMIME.smime_load_pkcs7('toto.p7s') 
print("Wow this long to load something that is in memory!") 
sk = p7.get0_signers(X509.X509_Stack()) 
if 0 == len(sk) : 
    print("ERROR : No signers.") 

s.set_x509_stack(sk) 

st = X509.X509_Store() 
st.load_info('ca.crt') 
s.set_x509_store(st) 

v = s.verify(p7, data) 
if v: 
    print("Client signature verified.") 
else: 
    print("ERROR : Signature verification FAILED.") 

Tạo phím/certs

# generate control authority (key+cert) 
openssl genrsa -out ca.key 2048 -passout file:ca_password.info 
openssl req -x509 -new -nodes -key ca.key -passin file:ca_password.info -days 7300 -sha256 -extensions v3_ca -out ca.crt -subj "/C=XX/ST=Xxxxxx/L=XXXX/O=XXXXX/OU=XXXX/CN=XXX Xxxx XX" 
openssl x509 -noout -text -in ca.crt 

# generate client key + cert for CNT 
openssl genrsa -out cnt.key 2048 -passout file:cnt_password.info 
openssl req -new -key cnt.key -out cnt.csr -subj "/C=XX/ST=Xxxxxx/L=XXXX/O=XXXXX/OU=XXXX/CN=CNT xxxx" 

echo "authorityKeyIdentifier = keyid,issuer" > cnt.ext 
echo "basicConstraints = CA:FALSE" >> cnt.ext 
echo "keyUsage = digitalSignature, keyEncipherment" >> cnt.ext 
echo "subjectKeyIdentifier = hash" >> cnt.ext 

openssl x509 -req -in cnt.csr -passin file:cnt_password.info -CA ca.crt -CAkey ca.key -CAcreateserial -out cnt.crt -days 1024 -extfile cnt.ext 
openssl x509 -noout -text -in cnt.crt 


# generate client key + cert for ET 
openssl genrsa -out et.key 2048 -passout file:et_password.info 
openssl req -new -key et.key -out et.csr -subj "/C=XX/ST=Xxxxxx/L=XXXX/O=XXXXX/OU=XXXX/CN=ET xxxx" 

echo "authorityKeyIdentifier = keyid,issuer" > et.ext 
echo "basicConstraints = CA:FALSE" >> et.ext 
echo "keyUsage = digitalSignature, keyEncipherment" >> et.ext 
echo "subjectKeyIdentifier = hash" >> et.ext 

openssl x509 -req -in et.csr -passin file:et_password.info -CA ca.crt -CAkey ca.key -CAcreateserial -out et.crt -days 1024 -extfile et.ext 
openssl x509 -noout -text -in et.crt 

Tạo dữ liệu thử nghiệm để đi vào email

dd if=/dev/urandom of=sample1.jpg bs=1K count=743 
dd if=/dev/urandom of=sample2.jpg bs=1K count=3009 
dd if=/dev/urandom of=sample3.xml bs=1K count=5 
dd if=/dev/urandom of=sample4.mp4 bs=1K count=2864 

Tạo email

Email được tạo bởi một số mã PHP với thư viện Mail/mime.php.

<?php 
date_default_timezone_set('Europe/Paris'); 
require_once 'Mail/mime.php'; 

function add_fichier_2_mail(&$mime, $filename) { 
    $finfo = finfo_open(FILEINFO_MIME_TYPE); 
    $mime_type=finfo_file($finfo,$filename); 
    finfo_close($finfo); 
    $mime->addAttachment($filename, $mime_type); 
} 
$crlf = "\n"; 
$mime_mif = new Mail_mime($crlf); 
add_fichier_2_mail($mime_mif, "sample1.jpg"); 
add_fichier_2_mail($mime_mif, "sample2.jpg"); 
add_fichier_2_mail($mime_mif, "sample3.xml"); 
add_fichier_2_mail($mime_mif, "sample4.mp4"); 
$body = $mime_mif->get(); 
$hdrs=array(); 
$entete = $mime_mif->headers($hdrs); 
unset($mime_mif); 
$msg=''; 
foreach ($entete as $key=>$value) { 
    $msg.=$key.': '.$value.$crlf; 
} 
$msg.=$crlf.$crlf.$body; 
file_put_contents("email_clear.eml",$msg); 
?> 

Đăng/Mã hóa email

Email được ký bởi khóa bí mật ET và sau đó mã hóa bằng giấy chứng nhận công CNT. Lệnh này cung cấp các lệnh sau:

openssl smime -sign -binary -nodetach -certfile et.crt -signer et.crt -inkey et.key -in email_clear.eml -out email_signed.p7s 
openssl smime -encrypt -outform DER -binary -des3 -in email_signed.p7s -out email_crypted_signed.p7m cnt.crt 
+1

bạn có thể cung cấp mẫu .key/.crt và email giả mạo mà sự cố sao chép không? + thư viện/python/os phiên bản – ffeast

+0

Đây là một hack cực kỳ ngớ ngẩn, nhưng những gì về việc tạo một ramdisk và viết cho rằng với 'smime_load_pkcs7'? –

+0

Tại sao không. Nó không phải là giải pháp được ưa thích nhưng nó thực hiện công việc. Bạn có thể chi tiết nó trong một câu trả lời hoàn chỉnh? – TrapII

Trả lời

1

Tôi có thể xác nhận điều này trên máy của mình, nhưng không thể tìm ra lý do tại sao nó xảy ra. Vấn đề dường như nằm trong lớp học BIO.MemoryBuffer ...

Như tôi đã nhận xét, giải pháp thay thế ngay lập tức nhảy ra phía tôi là tạo đĩa RAM và sử dụng smime_load_pkcs7 để chống lại điều đó.

Creating a ram disk on Linux

mkdir -p /mnt/tmpfs 
mount -o size=16G -t tmpfs none /mnt/tmpfs 

này có hai lợi ích: (1) bạn tránh mã bị lỗi trong M2Crypto và (2), bạn có thể tránh được việc phải viết hoặc đọc từ đĩa.

Các vấn đề liên quan