Rápido a cifra assimétrica para aplicação C++
-
20-09-2019 - |
Pergunta
Eu estou olhando para um rápido assimétrica cypher algoritmo para ser utilizado no programa C++.Nosso aplicativo acessa somente leitura de dados armazenados em arquivo (formato personalizado, um pouco semelhante ao alcatrão), e eu gostaria de evitar quaisquer modificações do arquivo de forma assimétrica a criptografia de arquivo de índice (estou ciente de que esta não é uma solução perfeita e dados ainda podem ser extraídos e reembalados usando certas técnicas).
Alguns arquivos individuais dentro do arquivo são criptografados com a cifra simétrica e criptografia de chaves, para eles, são armazenados dentro de um arquivo de índice(cabeçalho).É por isso que eu quero para criptografar o arquivo de cabeçalho de forma assimétrica.
Cypher requisitos:
1) implementação do Algoritmo deve ser independente de plataforma.
2) o Algoritmo deve ser fácil de implementar a mim ou a ele deve estar disponível na biblioteca (com código fonte) que permite estática a vinculação com aplicação proprietária, o que significa que o GPL/LGPL/viral licenças não podem ser usados.MIT/BSD-código licenciado, ou código de domínio público, o que é aceitável.
3) Se a cifra está disponível na biblioteca, idealmente, deveria ter pequeno espaço de memória, e a execução deve ser compacto.Eu prefiro usar C/C++ biblioteca que implementa apenas uma cifra em vez de full-blown para todos os fins de codificação coleção.
Originalmente eu queria usar o RSA, mas parece que ela é simplesmente muito lento para ser útil, e não há muitas alternativas.
Portanto, qualquer orientação sobre o que posso usar?
Solução
Ok, eu encontrei o que eu tenho procurado, e eu acho que é melhor do que o OpenSSL (para os meus propósitos, pelo menos).
Existem duas bibliotecas:
libtomcrypt ao, que implementa várias cifras fracas (incluindo RSA), e libtommath, que implementa grande nī umero de aritmética.Ambas as bibliotecas estão em domínio público, fácil de hackear/modificar e ter mais simples interface de programação de que o OpenSSL, e (muito) melhor documentação de OpenSSL.
Ao contrário do mais velho domínio público rsa código que eu encontrei antes, libtomcrypt ao pode gerar novas chaves muito rapidamente, pode importar OpenSSL-chaves geradas, e suporta preenchimento.Outra coisa boa sobre a libtomcrypt ao é que ele não tem dependências extra (OpenSSL para o windows quer gdi32, por exemplo) e é menor do que o OpenSSL.
Eu decidi usar o RSA para criptografia, depois de tudo, porque (me parece) não há verdadeiramente assimétrica alternativas.Parece que a maioria das outras codificações (elgamal, elliptic curves) são mais adequados para a criptografia simétrica onde a chave de sessão está a ser criptografada assimetricamente.O que não é adequado para mim.Tais cifras são adequados para a rede de comunicações/chaves de sessão, mas não seria bom usá estático e imutável de dados no disco.
Como para "RSA ser lenta", eu mudei o formato de arquivo um pouco, então, agora, só um pequeno pedaço de dados é criptografada assimetricamente.Falha ao descriptografar este bloco vai se tornar a leitura de arquivo de índice completamente muito difícil, se não impossível.Além disso, devo admitir que a lentidão da RSA foi parcialmente uma impressão errada dada por código antigo Eu tentei usar antes.
O que significa, questão resolvida.Solução RSA + libtomcrypt ao.RSA - porque não há muitas alternativas ao RSA, e libtomcrypt ao - porque ela é pequena e em domínio público.
Outras dicas
OpenSSL deve fazer o trabalho para você. É de código aberto (Licença Apache, atenda aos seus requisitos de licença).
É amplamente utilizado e bem testado.
Use um RSA personalizado para assinar o arquivo. Armazene a chave pública no aplicativo e mantenha a chave privada em casa. Agora, qualquer um poderia modificar o arquivo único de leitura, mas seu aplicativo se recusaria a carregar o arquivo modificado.
Confira a Curve25519, que é a CrytPography da curva elípica implementada com eficiência e em torno de problemas de patentes.
Atende a todos os seus requisitos. Veja aqui.
Você pode usá -lo para criptografar ou simplesmente assinar.
Como uma nota rodapé:
Para verificação de integridade, um Mac deve ser suficiente, a menos que você realmente precise de criptografia assimétrica.
Que tal MD5?
Sim, estou ciente de que o MD5 foi quebrado; - Mas a maioria das aplicações práticas isso é irrelevante.
Especialmente se os dados modificados também teriam que ser válidos no formato de dados específicos, bem como o MD5 correto
EDITAR:
O MD5 é apropriado se você deseja apenas garantir que os dados armazenados não possam ser alterados (ou pelo menos você pode detectá -los), mas não oculta os dados. Observe que, se você precisar ter a chave em seu aplicativo, juntamente com os dados, ele sempre poderá ser extraído. Existem técnicas para ocultar a chave - uma popular é simplesmente colocá -la dentro de um recurso estático, como um ícone que pode ser vinculado facilmente.