2012-08-09 43 views
5

Tôi đang sử dụng khóa công khai/riêng tư trong dự án của mình để mã hóa/giải mã một số dữ liệu.Đọc khóa công khai/riêng tư từ bộ nhớ với OpenSSL

Tôi đang lưu trữ khóa công khai ("public.pem") trên máy chủ.

"public.pem" trông như thế này:

-----BEGIN PUBLIC KEY----- 
..... 
..... 
-----END PUBLIC KEY----- 

Tôi đã viết một phía khách hàng mà tải khóa công khai này và lưu nó vào đĩa và sau đó gọi PEM_read_RSA_PUBKEY OpenSSL của() với một bộ mô tả tập tin vào tập tin đó. Hoạt động này hoạt động tốt và kết quả là một đối tượng RSA đã sẵn sàng để mã hóa.

Tôi muốn tránh viết khóa công khai vào đĩa mỗi lần (vì tôi đã có bộ đệm trong bộ nhớ).

Tôi làm cách nào để thực hiện thao tác tương tự mà không lưu bộ đệm vào đĩa? Tôi nhận thấy một chức năng được gọi là: PEM_read_bio_RSAPublicKey() nhưng tôi không chắc chắn về việc sử dụng cấu trúc BIO của nó. Tôi đang đi đúng hướng chứ?

Vì vậy, câu hỏi thực sự là: Làm cách nào để đọc khóa công khai/riêng tư đối với đối tượng RSA trực tiếp từ bộ nhớ chứ không phải từ bộ mô tả tệp.

Trả lời

14

Bạn đang đi đúng hướng. Bạn phải bọc khóa PEM đã có trong bộ nhớ bằng bộ đệm BIO qua BIO_new_mem_buf(). Nói cách khác, một cái gì đó như:

BIO *bufio; 
RSA *rsa 

bufio = BIO_new_mem_buf((void*)pem_key_buffer, pem_key_buffer_len); 
PEM_read_bio_RSAPublicKey(bufio, &rsa, 0, NULL); 

Các phương pháp tương tự có giá trị trong một khóa bí mật RSA (thông qua PEM_read_bio_RSAPrivateKey), nhưng trong trường hợp đó bạn chắc chắn cần nhất để phục vụ cho các cụm từ vượt qua. Kiểm tra các chi tiết man page.

+1

Tôi đã thử tùy chọn đó ngay bây giờ. Mã hóa không sao, giải mã không hoạt động. Khóa công khai có cần phải như sau hoặc tôi có cần xóa "BEGIN PUBLIC KEY" khi tôi gửi cho khách hàng không? ----- BEGIN KHÓA CÔNG KHÓA ----- ..... ..... ----- KẾT NỐI CÔNG TÁC ----- – user1144031

+0

Liên kết trang người đàn ông bị hỏng :(. Bất kỳ ai cũng có liên kết được cập nhật? – digawp

2

SquareRootOfTwentyPhương pháp của Baree không hoạt động đối với tôi. Đây là giải pháp của tôi.

BIO* bio = BIO_new(BIO_s_mem()); 
int len = BIO_write(bio, pem_key_buffer, pem_key_buffer_len); 
EVP_PKEY* evp_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); 
RSA* rsa = EVP_PKEY_get1_RSA(evp_key); 
Các vấn đề liên quan