2010-11-08 83 views
13

Tôi đang tìm hai hàm khái niệm tương tự như thế này:C/C++ mã hóa/giải mã với khóa công khai

// returns the encrypted text 
string encrypt(string public_key, string pass_phrase, string text); 
// returns the original text 
string decrypt(string private_key, string pass_phrase, string encrypted_text); 

nơi string có thể là một char*, một cái gì đó std::string hoặc dễ dàng chuyển đổi thành hai. Và trong đó, public_keyprivate_key về cơ bản có thể là bất cứ điều gì, từ các phím được tạo bằng một số lệnh (công cụ gpg/ssl hoặc bất kỳ thứ gì), cho các phím được tạo bằng các hàm đơn giản khác.

Tôi đã xem xét một vài thư viện mã hóa (libgcrypt, libgpgme, openssl ...), nhưng không dễ dàng để thực hiện các chức năng như vậy với các thư viện đó: chúng yêu cầu kiến ​​thức không hời hợt về bất đối xứng mã hóa và rất nhiều mã.

Dù sao tác vụ này có vẻ không phổ biến. Làm cách nào để triển khai hai chức năng trên?

+2

Bạn đã xem Keyczar chưa? http://code.google.com/p/keyczar/ –

+0

encrypted_text có lẽ là dữ liệu nhị phân. Bạn cần phải xem ra cho số không được nhúng. Tôi muốn bao gồm độ dài trong các nguyên mẫu ... – pmg

+0

@pmg: Tôi nhận ra có một [c] -tag, nhưng tôi cho rằng peoro đang nghĩ đến 'std :: string' của C++, đó là 8-bit sạch sẽ và bao gồm một chiều dài , tách biệt với nội dung của chuỗi. –

Trả lời

6

Thật không may, mã hóa luôn luôn yêu cầu kiến ​​thức không hời hợt về các thuật toán có liên quan. Thật khó để có được quyền. "Sổ tay của Mật mã ứng dụng" là một hướng dẫn tương đối dễ đọc cho các thuật toán khác nhau có sẵn để nó có thể đáng xem.

Bạn cũng có thể thử cryptlib. Nó dường như có một thiết kế tốt lớp mang đến cho bạn mặc định hợp lý cho rất nhiều tham số để bạn có thể hy vọng bắt đầu mà không cần phải lo lắng quá nhiều về các chi tiết.

+2

Vâng, tôi không đồng ý nhiều. Hai chức năng mà tôi đã cho chữ ký (cộng với một chức năng khác để tạo thành cặp khóa công khai/riêng) nên đủ để chơi với mã hóa. Tất nhiên họ không phải là rất tùy biến, vì vậy họ sẽ không được an toàn, đủ để được sử dụng với một cái gì đó nghiêm trọng, nhưng tôi đoán họ đang OK cho 99% các trường hợp ... – peoro

+0

Tôi sẽ cung cấp cho một cái nhìn để cryptlib, anyway , Cảm ơn đã chỉ ra điều đó! – peoro

+2

Tôi khuyên bạn cũng nên thay đổi chữ ký chức năng của bạn để hoạt động theo byte, không phải chuỗi. Crypto thường hoạt động trên mảng byte mờ và thêm ngữ nghĩa chuỗi sẽ chỉ làm cho mọi việc trở nên khó khăn hơn. Ở lớp này, một khóa chỉ là một tập hợp các byte, một cụm từ mật khẩu là một tập hợp các byte và văn bản rõ ràng/mật mã là cả hai bộ byte. Họ * có thể * đại diện cho chuỗi với một số loại mã hóa ký tự (ASCII, UTF-8 hoặc bất kỳ điều gì), nhưng lớp mã hóa không quan tâm đến điều đó. –

0

Giả sử bạn không cần nền tảng bất khả tri, Cryptography Next Generation (CNG) là một API mã hóa tương đối mới trên Windows và trực quan đáng kinh ngạc và dễ sử dụng. Tôi đã viết một bài báo bao gồm các ví dụ về tất cả các hoạt động mã hóa chính mà bạn có thể cần trong các ứng dụng điển hình. Mã mẫu cho bài viết cũng cung cấp một ví dụ làm việc hoàn chỉnh cho các hoạt động này bằng cách sử dụng trình biên dịch Visual C++.

http://msdn.microsoft.com/en-us/magazine/cc163389.aspx

Để điều trị khóa công khai và tư nhân như dây bạn chỉ có thể sử dụng Base64 hoặc mã hóa tương tự.

+0

Thực ra tôi đang làm việc trên Linux. Dù sao cũng cảm ơn bạn! – peoro

5

Khi ai đó yêu cầu mã hóa dễ dàng, tôi chỉ có thể đề xuất KeyCzar.

Nó không chỉ cung cấp giao diện rõ ràng bằng nhiều ngôn ngữ (có thể sử dụng cùng một khóa) mà còn là cơ chế xử lý xoay vòng chính và tương tự.

Và tất nhiên, mặc định an toàn cho các thuật toán được triển khai để bạn không phải lo lắng về chi tiết kỹ thuật.

Thực sự, kết hợp an toàn & dễ dàng hơn tôi đã thấy cho đến thời điểm này.

+0

không phải là keyczar chỉ là một wrapper xung quanh openssl vv? – BjornW

+1

@BjornWesen: vâng, đúng vậy. Từ liên kết * Keyczar được thiết kế để mở, mở rộng và tương thích với nhiều nền tảng. Nó không có ý định thay thế các thư viện mã hóa hiện có như OpenSSL, PyCrypto, hay Java JCE, và ** trên thực tế được xây dựng trên các thư viện này **. * (Nhấn mạnh của tôi) Lợi ích của KeyCzar là nó chọn mặc định an toàn cho bạn vì vậy bạn không tự bắn mình vào chân. –

+0

yeah, và đó là tất nhiên một mục tiêu rất đánh giá cao :) Tôi đã chỉ tìm thấy bản thân mình trong tình trạng tương tự cần một thư viện nhẹ làm một số khóa công khai/xác minh mặc dù, và ý nghĩ phải liên quan openssl "chỉ" để làm điều đó là nặng .. tôi đã tìm thấy libtom sau đó có lẽ là ok cho nhiều thứ. – BjornW

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