2010-11-08 4 views
13

Sto cercando due funzioni concettualmente simili a queste:C/C++ cifrare/decifrare con chiave pubblica

// 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); 

dove string potrebbe essere un char*, un std::string o qualcosa di facilmente convertibili a quei due. E dove public_key e private_key possono essere praticamente qualsiasi cosa, da tasti generati con alcuni comandi (roba gpg/ssl o qualsiasi altra cosa), a tasti generati con altre semplici funzioni.

Ho esaminato alcune librerie di crittografia (libgcrypt, libgpgme, openssl ...), ma non sembra affatto facile implementare tali funzioni con quelle librerie: richiedono una conoscenza non superficiale di asimmetrica crittografia e molto codice.

Ad ogni modo questo compito non sembra insolito. Come posso implementare le due funzioni sopra?

+2

Avete controllato Keyczar? http://code.google.com/p/keyczar/ –

+0

encrypted_text è probabilmente dati binari. Devi stare attento agli zeri incorporati. Includerei lunghezze nei prototipi ... – pmg

+0

@pmg: Mi rendo conto che esiste un [c] -tag, ma suppongo che peoro stia pensando a 'std :: string' del C++, che è pulito a 8 bit e include una lunghezza , separato dal contenuto della stringa. –

risposta

6

Sfortunatamente, la codifica sempre richiede una conoscenza non superficiale degli algoritmi coinvolti. È difficile avere ragione. Il "Manuale di crittografia applicata" è una guida relativamente leggibile ai vari algoritmi disponibili, quindi probabilmente vale la pena dare un'occhiata.

Si potrebbe anche provare cryptlib. Sembra avere un design a più livelli che ti dà impostazioni predefinite per molti parametri, quindi puoi sperare di iniziare senza doverti preoccupare troppo dei dettagli.

+2

Beh, non sono molto d'accordo. Le due funzioni di cui ho dato la firma (più un'altra per generare una coppia di chiavi pubblica/privata) dovrebbero essere sufficienti per giocare con la crittografia. Ovviamente non sono molto personalizzabili, quindi non saranno abbastanza sicuri per essere usati con qualcosa di serio, ma immagino che siano OK per il 99% dei casi ... – peoro

+0

Daremo un'occhiata a cryptlib, comunque , Grazie per segnalarlo! – peoro

+2

Ti suggerisco di cambiare anche le firme delle funzioni per lavorare in termini di byte, non di stringhe. Crypto funziona generalmente su array di byte opachi e l'aggiunta di semantica delle stringhe renderà le cose più difficili. A questo livello, una chiave è solo un insieme di byte, una passphrase è un insieme di byte e il testo chiaro/cifrato sono entrambi insiemi di byte. Essi * possono * rappresentare stringhe con qualche tipo di codifica dei caratteri (ASCII, UTF-8 o qualsiasi altra cosa), ma il livello crittografico non se ne preoccupa. –

0

Supponendo di non aver bisogno di una piattaforma agnostica, Cryptography Next Generation (CNG) è un'API di crittografia relativamente nuova su Windows ed è sorprendentemente intuitiva e facile da usare. Ho scritto un articolo che include esempi di tutte le principali operazioni di crittografia che sono probabilmente necessarie in applicazioni tipiche. Il codice di esempio per l'articolo fornisce anche un esempio operativo completo per queste operazioni utilizzando il compilatore Visual C++.

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

per il trattamento di chiavi pubbliche e private come stringhe si può semplicemente usare Base64 o una codifica simile.

+0

Attualmente sto lavorando su Linux. Grazie comunque! – peoro

5

Quando qualcuno chiede una crittografia facile, posso solo raccomandare KeyCzar.

Non solo fornisce un'interfaccia pulita in più lingue (che possono utilizzare gli stessi tasti) ma anche meccanismi per gestire rotazioni chiave e simili.

E, naturalmente, impostazioni predefinite sicure per gli algoritmi implementati in modo da non doversi preoccupare dei dettagli tecnici.

Davvero, la più facile combinazione di sicurezza & che ho visto finora.

+0

non è keyczar solo un wrapper attorno a openssl ecc.? – BjornW

+1

@BjornWesen: sì, lo è. Dal collegamento * Keyczar è progettato per essere aperto, estensibile e compatibile multipiattaforma. Non è destinato a sostituire librerie crittografiche esistenti come OpenSSL, PyCrypto o Java JCE, e ** in realtà è costruito su queste librerie **. * (Enfasi mia) L'unico vantaggio di KeyCzar è che sceglie le impostazioni predefinite sicure per te quindi non ti spari ai piedi. –

+0

sì, e questo è ovviamente un obiettivo molto apprezzato :) Mi sono appena trovato nella stessa situazione che necessitava di una libreria leggera che faceva qualche segno/verifica di chiave pubblica, e il pensiero di dover coinvolgere openssl "solo" per farlo è pesante .. ho trovato libtom in seguito che probabilmente è ok per molte cose. – BjornW