2009-08-31 77 views
6

Có cách nào để sử dụng các khóa RSA mà tôi đã tạo bằng API Crypto ++ trong OpenSSL không? Những gì tôi đang tìm kiếm là một cách để lưu trữ các khóa theo một định dạng mà cả Crypto ++ và OpenSSL đều có thể dễ dàng mở chúng. Tôi đang viết sơ đồ cấp phép và muốn xác minh chữ ký và giải mã tệp bằng API Crypto ++, nhưng để tạo tệp giấy phép, tôi muốn sử dụng giao diện web (có thể sử dụng PHP, chỉ hỗ trợ OpenSSL) tạo và mã hóa/ký giấy phép.Sử dụng khóa RSA do Crypto ++ tạo trên OpenSSL

Tôi sẽ viết cả hai ứng dụng sử dụng Crypto ++ và gọi nó từ PHP, nhưng vì khóa riêng sẽ được lưu trữ dưới dạng mã hóa, mật khẩu phải được chuyển đến ứng dụng và chuyển nó lên dòng lệnh là một ý kiến ​​hay đối với tôi.

Trả lời

5

Cả Crypto ++ và OpenSSL đều có thể xử lý các khóa được mã hóa PKCS # 8. Trong crypto ++, bạn có thể tạo khóa và chuyển đổi sang bộ đệm PKCS # 8 như thế này,

AutoSeededRandomPool rng; 
RSAES_OAEP_SHA_Decryptor priv(rng, 2048); 
string der; 
StringSink der_sink(der); 
priv.DEREncode(der_sink); 
der_sink.MessageEnd(); 

// der.data() is the bytes you need 

Bây giờ bạn chỉ cần chuyển byte sang PHP. Bạn có thể lưu nó vào một tập tin, gửi tin nhắn.

Bí quyết duy nhất là giao diện OpenSSL của PHP chỉ chấp nhận PKCS # 8 được mã hóa PEM. Bạn có thể dễ dàng chuyển đổi bộ đệm được mã hóa DER thành PEM như thế này trong PHP,

<?php 
function pkcs8_to_pem($der) { 

    static $BEGIN_MARKER = "-----BEGIN PRIVATE KEY-----"; 
    static $END_MARKER = "-----END PRIVATE KEY-----"; 

    $value = base64_encode($der); 

    $pem = $BEGIN_MARKER . "\n"; 
    $pem .= chunk_split($value, 64, "\n"); 
    $pem .= $END_MARKER . "\n"; 

    return $pem; 
} 
?> 

Bạn cũng có thể chuyển đổi PKCS # 8 thành PEM trong C++ nếu bạn muốn. Thuật toán rất đơn giản như bạn có thể thấy từ mã PHP.

OpenSSL rất phổ biến hiện nay. Tôi không thấy lý do nào để sử dụng Crypto ++ cho các ứng dụng mã hóa thông dụng như thế này.

0

Hãy thử liên kết này: http://www.cryptopp.com/fom-serve/cache/62.html

Dường như bạn sẽ cần phải sử dụng PKCS # 8 và chuyển đổi từ DER sang định dạng PEM để có thể sử dụng các phím trong OpenSSL. Tôi không chắc liệu bạn có thể sử dụng một tệp duy nhất cho cả hai.

Tôi chỉ sử dụng OpenSSL vì vậy tôi không chắc chắn bạn có tùy chọn nào với Crypto ++. Tôi đã tìm thấy liên kết ở trên bằng cách tìm kiếm các thuật ngữ sau: Crypto ++ RSA OpenSSL.

DER là định dạng nhị phân OpenSSL cho khóa và chứng chỉ.

PEM là định dạng văn bản OpenSSL.

+0

Tôi đã nhìn thấy bài đăng này, nhưng tôi đã tìm kiếm một cách lập trình cho điều đó, có thể một số lớp Crypto ++ có thể chuyển đổi từ và từ PKCS8 DER sang mã hóa PEM được OpenSSL sử dụng. – Vargas

+0

Bạn đã đọc http://www.cryptopp.com/wiki/Key_Format chưa? –

1

Có cách nào để sử dụng khóa RSA mà tôi đã tạo bằng API Crypto ++ trong OpenSSL không? Những gì tôi đang tìm kiếm là một cách để lưu trữ các khóa theo một định dạng mà cả Crypto ++ và OpenSSL đều có thể dễ dàng mở chúng.

Có. Ngoài các phím mã hóa X.509 và PKCS # 8 (câu trả lời của ZZ Coder), bạn cũng có thể sử dụng các khóa mã hóa PEM bao gồm các khóa được mã hóa. Hỗ trợ cho các khóa mã hóa PEM đã được tặng cho dự án vào tháng 7 năm 2014 cho InterPSL interop.

Để sử dụng các khóa mã hóa PEM, bạn cần tìm nạp Crypto ++ PEM Pack và biên dịch lại thư viện. Gói PEM không thuộc thư viện Crypto ++ do Wei Dai cung cấp tại số Crypto++ website.

Khi bạn cài đặt và biên dịch lại, nó đơn giản như:

// Load a RSA public key 
FileSource fs1("rsa-pub.pem", true); 
RSA::PublicKey k1; 
PEM_Load(fs1, k1); 

// Load a encrypted RSA private key 
FileSource fs2("rsa-enc-priv.pem", true); 
RSA::PrivateKey k2; 
PEM_Load(fs2, k2, "test", 4); 

// Save an EC public key 
DL_PublicKey_EC<ECP> k16 = ...; 
FileSink fs16("ec-pub-xxx.pem", true); 
PEM_Save(fs16, k16); 

// Save an encrypted EC private key 
DL_PrivateKey_EC<ECP> k18 = ...; 
FileSink fs18("ec-enc-priv-xxx.pem", true); 
PEM_Save(fs18, k18, "AES-128-CBC", "test", 4); 

Các phím trông giống như vân vân đĩa:

$ cat rsa-pub.pem 
-----BEGIN PUBLIC KEY----- 
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCg7ovcljEjZCFOdLWENBKE6FSk 
Nke6OP79SMJABJw+JoEBpNddK6/v99IvA1qU76V0V4k8qLvhkVUtk9FArhhRsxeF 
1fd8UVqgsT8j0YCVFcJ/ZA372ogpXyvc5aK9mZEiKE5TIF8qnDFFZiMWPrad1buk 
hg+eFdo78QRLA5plEQIDAQAB 
-----END PUBLIC KEY----- 
$ 
$ cat rsa-enc-priv.pem 
-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: AES-128-CBC,E1A759E11CA515CE34B6E8CE5278C919 

slMx02TMblahTedEKsfS+qYYo4nZFaqI3PhCRYmE5zUa9clHm7yo36wIk3oo52OB 
f4AhOaJwiPQAbLe/kDHeP77iHd/4+hFNq/Haj6ahWRpXilLVOETLtefbzSGO8va3 
ORnwQpPThs2V0EetPU3LB3QcA/XRjWDzyNa7+LydOjKwbQdZnF/jND5NCkEkncNM 
iQJ1VWubN+Xs3Rx0CfLu5Chl1n7WnmCNMtLL/LtYeaR1SlRJa6BaF7hNHJJJ3+Jc 
8curCKlpobs+XnlDfjyqgTXolkiepn95TnT7KSqi3BqVEpq/5LKMnkDJg6nwUR7A 
w0jLNr1f8adWyBEj2Dp0D/jy8eDh65eHdJw4s8G5FZfBud1zWbvRQ3Ah70ISUKa3 
4q/6z2vervPgoc+rMVYDvRf/mqa4LMXYhuygsyx50OgPldCC2d0cVVFCg/ljdEzO 
UV5rSkK1Qczv8Nc1ZdY3fJA+qYIV8JqPPY+dJ2312R+myPi5Av0/69k8lZN5eIJk 
SkiiFQmabhc+o6z4RFA52a3lOud3eGM9L5nbFQGc5COzQVZ6y8t06tLIp9Y5zjA4 
KTgNncV5eq3Bau+cWXjP6pJRixFVfwIoy95mAur7B2P1iE4FXyZbvCovPL6vilT5 
kSqAo7Znu0RpTjE36tWY6tFt+GU7k8EBrjA3Qi+8xxqyYtr57Ns+H/j+hhJTN8L7 
IXoevwS81OPiB0Dmg6wLLXATG1+gCNXb8sd5U2eJhy4LOJA3y54CTgRnPXtM38CH 
K+JvnDstyUl9IGTsgUz51ZzyJNZGU9Ro3pt/a3Cs5IJumaygZ0LQ44WBw9m/vja9 
-----END RSA PRIVATE KEY----- 
$ 
$ cat ec-pub.pem 
-----BEGIN PUBLIC KEY----- 
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEVwXjdIb2yy25QbIO0XiIHpySXwSpIAcz 
v0Wdyq+fZ6BdJjs2jKvbs9pcRJn8yxlASWoz2R4NoHTZ2YokKsDfEg== 
-----END PUBLIC KEY----- 
$ 
$ cat ec-enc-priv.pem 
-----BEGIN EC PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: AES-128-CBC,F1DBC73E26DCD310888932C2762B3512 

nikex48SFvtNOIrOEDipwmxaghjn4jtrvwI3d1H/VNq9yp26WqFZxBJCUPFBFLjH 
auA+AHeUo3BVkNQPs0VO4FD5xR50mtc2tCJizzhyTTTypLc3lRkxmD1MpeZnWRy2 
70foVtNSvLL/QLJqNJGm/G9kl0xPN4zAfOq7Txoscnk= 
-----END EC PRIVATE KEY----- 

liên quan: cho Crypto ++ bản vá lỗi hữu ích khác, xem trang Category:Patch trên wiki Crypto ++.

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