2012-04-28 21 views
16

Hi i đã cài đặt openssl trên máy linux của tôi và đi qua các tập tin header và tài liệu (mà là rất insufficint :().OpenSSL sử dụng EVP vs thuật toán API cho đối xứng crypto

tôi đang cố gắng xây dựng một dự án (trong 'c') sử dụng các thuật toán mật mã đối xứng (tôi đang tập trung vào aes256cbc) Vấn đề là tôi đang bối rối như thế nào trong việc sử dụng các hàm thư viện trong mã của tôi. sử dụng các hàm được xác định trong tệp tiêu đề 'aes.h' (xuất hiện với tôi ở vị trí đầu tiên)

Nhưng trên googling tôi đã đi qua một số hướng dẫn cho điều này mà đang sử dụng 'evp.h' chức năng để làm điều này http://saju.net.in/code/misc/openssl_aes.c.txt

Có một lý do cụ thể cho việc này hoặc trực tiếp truy cập vào các chức năng aes.h là tốt hơn.

Và cũng có thể nếu ai đó có thể chỉ cho tôi một tài liệu hướng dẫn/hướng dẫn tốt về bất kỳ loại nào khi sử dụng thư viện mã hóa của openssl sẽ được đánh giá cao.

cảm ơn nhiều

PS tha thứ cho tôi nếu tôi đang là ngây thơ

Trả lời

27

Sử dụng API EVP đã lợi thế mà bạn có thể sử dụng API tương tự cho tất cả các thuật toán mã hóa đối xứng mà OpenSSL hỗ trợ, theo một cách chung chung . Điều này làm cho nó dễ dàng hơn để thay thế các thuật toán được sử dụng, hoặc làm cho thuật toán người dùng cấu hình ở giai đoạn sau. Hầu hết mã bạn viết không cụ thể cho thuật toán mã hóa bạn đã chọn.

Dưới đây là một ví dụ đơn giản để mã hóa với AES-256 trong chế độ CBC:

#include <stdio.h> 
#include <openssl/evp.h> 

int main() 
{ 
    EVP_CIPHER_CTX ctx; 
    unsigned char key[32] = {0}; 
    unsigned char iv[16] = {0}; 
    unsigned char in[16] = {0}; 
    unsigned char out[32]; /* at least one block longer than in[] */ 
    int outlen1, outlen2; 

    EVP_EncryptInit(&ctx, EVP_aes_256_cbc(), key, iv); 
    EVP_EncryptUpdate(&ctx, out, &outlen1, in, sizeof(in)); 
    EVP_EncryptFinal(&ctx, out + outlen1, &outlen2); 

    printf("ciphertext length: %d\n", outlen1 + outlen2); 

    return 0; 
} 

Để đơn giản, tôi bỏ qua xử lý lỗi.

IMO một trong những phần tài liệu quan trọng nhất trên OpenSSL là Network Security with OpenSSL by Viega/Messier/Chandra. Đó là từ năm 2002 (0.9.7), do đó không bao gồm những thay đổi đối với OpenSSL trong 10 năm qua, nhưng IMO vẫn là một cách ít đau đớn hơn để tìm hiểu OpenSSL hơn là chỉ sử dụng các trang hướng dẫn sử dụng.

+0

cảm ơn rất nhiều vì lời giải thích rõ ràng và đề xuất sách. Tôi đã chán ngấy sau khi tìm kiếm một nguồn tài nguyên tốt trên mạng để giải thích cho api mã hóa. Một câu hỏi nữa, nơi tôi có thể tìm thấy thư viện mật mã nơi tôi có thể thấy việc thực hiện thực tế của tất cả các tệp evp.h và các tệp * .h khác. Tôi đã thử đọc các thư viện khác nhau được cài đặt với openssl trong thư mục lib nhưng chúng là mã đối tượng tôi đoán. Bất kỳ con trỏ nào theo hướng này .. Rất cám ơn – abhi

+1

Bạn có thể lấy tarball nguồn từ http://www.openssl.org/source/ khớp với phiên bản OpenSSL đã cài đặt của bạn. –

+1

Rất cám ơn nhiều vì đã đề cập đến cuốn sách nói trên .. nó đã giúp tôi một loy esp chương 6 xóa nhiều nghi ngờ tôi đã liên quan đến api EVP .. cảm ơn một lần nữa .. – abhi

1

Hiện nay OpenSSL wiki có tài liệu tốt về cách sử dụng gia đình EVP các chức năng: http://wiki.openssl.org/index.php/EVP

Ưu điểm khác của việc sử dụng các EVP trên thuật toán API là EVP sẽ tự động sử dụng tăng tốc phần cứng (như tập lệnh AES-NI) nếu có. Với API thuật toán, bạn cần phải bật nó theo cách thủ công.