Domanda

Sto cercando un veloce algoritmo di cifra asimmetrica da utilizzare nel programma di C ++. La nostra applicazione accede ai dati memorizzati in archivio (formato personalizzato, in qualche modo simile al catrame) di sola lettura, e vorrei evitare che eventuali modifiche di tale archivio per la crittografia asimmetrica indice archivio (sono consapevole che questa non è una soluzione perfetta e dati può ancora essere estratto e reimballarla utilizzando alcune tecniche).

Alcuni i singoli file all'interno dell'archivio sono cifrati con simmetrici Cypher e chiavi di crittografia per loro sono memorizzati all'interno dell'indice di archivio (intestazione). Ed è per questo che voglio cifrare intestazione dell'archivio in modo asimmetrico.

requisiti Cypher:
1) implementazione algoritmo dovrebbe essere indipendente dalla piattaforma.
2) algoritmo dovrebbe essere sia facile da implementare me stesso o dovrebbe essere disponibile in biblioteca (con il codice sorgente) che consente di static che collega con l'applicazione proprietaria, il che significa che le licenze GPL / LGPL / virale non possono essere utilizzati. Codice MIT / BSD-licenza, o il codice di pubblico dominio è accettabile.
3) Se Cypher è disponibile in libreria, idealmente dovrebbe avere occupazione di memoria, e l'attuazione deve essere compatto. Io preferirei utilizzare una libreria C / C ++ che implementa una sola cifra, invece di vera collezione di cifratura per tutti gli usi.

In origine volevo usare RSA, ma sembra che è semplicemente troppo lento per essere utile, e non ci sono molte alternative.

Quindi, qualche consiglio su cosa posso usare?

È stato utile?

Soluzione

Va bene, ho trovato quello che stavo cercando, e penso che è meglio di OpenSSL (per i miei scopi, almeno).

Ci sono due librerie:
LibTomCrypt , che implementa diverse cifrari (tra cui RSA), e libtommath , che implementa aritmetica bignum. Entrambe le librerie sono in pubblico dominio, facile da hack / modificare e hanno semplice interfaccia di programmazione di OpenSSL, e la documentazione (molto) meglio di OpenSSL.
differenza vecchio codice rsa di dominio pubblico che ho trovato prima , LibTomCrypt può generare nuove chiavi molto rapidamente, Le chiavi possono importare OpenSSL-generato, e supporta imbottitura. Un altro aspetto positivo è che LibTomCrypt non ha dipendenze in più (OpenSSL per le finestre vuole gdi32, per esempio) ed è più piccolo di OpenSSL.

Ho deciso di utilizzare per la crittografia RSA, dopo tutto, perché (a me sembra) non ci sono alternative veramente asimmetrici. Sembra che la maggior parte degli altri cifrari (ElGamal, curve ellittiche) sono più adatti per la crittografia simmetrica in cui chiave di sessione viene cifrata in modo asimmetrico. Il che non è adatto per me. Tali cifre sono adatti per le chiavi di rete di comunicazione / di sessione, ma non sarebbe bene utilizzare che per i dati statici immutabili sul disco.

Per quanto riguarda la "RSA essere lento", ho cambiato formato di archivio un po ', così ora solo una piccola parte dei dati viene crittografato in modo asimmetrico. La mancata decifrare questo pezzo renderà indice archivio lettura completamente molto difficile se non impossibile. Inoltre, devo ammettere che la lentezza della RSA era parzialmente un'impressione sbagliata data dal vecchio codice ho cercato di usare prima.

Il che significa, questione risolta. La soluzione è RSA + LibTomCrypt. RSA - perché non ci sono molte alternative a RSA, e LibTomCrypt - perché è piccolo e nel dominio pubblico.

Altri suggerimenti

OpenSSL dovrebbe fare il lavoro per voi. E 'open-source (licenza Apache, quindi soddisfa le tue esigenze di licenza).

E 'ampiamente utilizzato e ben collaudato.

Utilizzare una consuetudine RSA per firmare l'archivio. Conservare la chiave pubblica nell'applicazione e tenere la chiave privata in casa. Ora chiunque potrebbe modificare l'unico archivio leggere, ma l'applicazione si rifiutano di caricare l'archivio modificato.

Scopri Curve25519, che è ellittica crytpography curva implementata in modo efficiente, e intorno a problemi di brevetto.

E 'soddisfa tutte le vostre esigenze. Vedi qui .

Si può usare per cifrare o firmare semplicemente.

Come nota a margine:

Per il controllo di integrità, un MAC dovrebbe essere sufficiente a meno che non si ha realmente bisogno la crittografia asimmetrica.

Come su MD5?

Sì, sono consapevole del fatto che MD5 è stato 'rotto; - ma le applicazioni più pratiche questo è irrilevante
. Soprattutto se i dati modificati dovranno inoltre essere valida nel particolare formato di dati così come hanno il corretto MD5

EDIT:
MD5 è appropriata se si vuole garantire solo che i dati memorizzati non possono essere modificati (o almeno si può rilevarlo), ma non nasconde i dati. Si noti che se si deve avere la chiave nella vostra applicazione a fianco dei dati che può sempre essere estratto. Ci sono tecniche per nascondere la chiave - una popolare è semplicemente quello di inserirlo all'interno di una risorsa statica, come un'icona che può essere collegato facilmente

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top