Pergunta

Não sou especialista cripto, mas como eu o entendo, 3DES é um algoritmo de criptografia simétrica, o que significa isso não acontecer uso de chaves públicas / privadas.

No entanto, tenho sido encarregado de criptografia de dados usando uma chave pública, (especificamente, um arquivo .cer). Se você ignorar o todo simétrica / assimétrica thang, eu deveria apenas ser capaz de usar os dados da chave da chave pública como a chave TripleDES. No entanto, estou tendo dificuldade em extrair os bytes-chave do arquivo .cer. Este é o código como está ..

TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider();
X509Certificate2 cert = new X509Certificate2(@"c:\temp\whatever.cer");
cryptoProvider.Key = cert.PublicKey.Key.

O método mais simples que eu posso encontrar para extrair os bytes-chave brutos do certificado é ToXmlString (bool), e, em seguida, fazer alguma substringing hacky na corda retornado. No entanto, isso parece tão hackish sinto que devo estar faltando uma maneira mais simples, mais óbvio para fazê-lo.

Am I faltando uma maneira mais simples de usar um arquivo .cer para fornecer os dados-chave para a classe de criptografia C # 3DES, ou está cortando-o para fora da corda certificado xml realmente a melhor maneira de fazer isso?

Foi útil?

Solução

cryptoProvider.Key = cert.GetPublicKey ()?

Outras dicas

Não é uma boa idéia para utilizar as teclas geradas por criptografia assimétrica para criptografia simétrica. Não há nada impedindo-o de chegar a uma maneira de usar uma chave pública como uma chave de criptografia para 3DES, mas o resultado final será que qualquer pessoa ter acesso à chave pública (e isso significa todos!) Será capaz de descodificar o texto cifrado .

A criptografia grandes quantidades de dados com criptografia assimétrica não é o caminho a percorrer. Em vez disso, criptografar os dados com um algoritmo simétrico e criptografar a chave simétrica (e IV) com sua chave pública.

Esta página do MSDN realmente me ajudou a ir com .Net criptografia simétrica.

O verdadeiro problema aqui é que a chave pública é, bem, public . Significado livremente disponível, o que significa que está fornecendo zero, segurança de criptografia.

Heck, ninguém sobre este tópico tem todas as informações que eles precisam para decifrar tudo. Então faça Googlers.

Por favor, tente para incentivar seus usuários a não utilizar dados de chaves públicas como essa. Pelo menos, levá-los para dar uma senha ou algum outro pedaço ligeiramente mais segura você pode usar para gerar uma chave consistente.

Só mais uma coisa. chaves de certificados variam em tamanho. Ele provavelmente pode lidar jogando fora bytes extras na chave, mas você provavelmente vai obter uma matriz Index / Out Of Bounds exceção se a chave passa a ser mais curto do que as necessidades-chave 3DES. Duvido que vai acontecer, 3DES só precisa de 56bits, e as chaves de cert são quase sempre 256bits ou maior.

Eu acho que o que está faltando é converter os bytes da string que contém a chave-bytes.

Hope o método FromBase64String irá ajudá-lo:

byte[] keyBytes = Convert.FromBase64String(sourceString);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top