Partilhar via


Chaves criptográficas

Este artigo mostra como usar funções padrão de derivação de chaves para obter chaves e como encriptar conteúdos usando chaves simétricas e assimétricas.

Chaves simétricas

A encriptação de chave simétrica, também chamada de encriptação de chave secreta, exige que a chave usada para encriptação também seja usada para desencriptação. Pode usar uma classe SymmetricKeyAlgorithmProvider para especificar um algoritmo simétrico e criar ou importar uma chave. Pode usar métodos estáticos na classe CryptographicEngine para encriptar e desencriptar dados usando o algoritmo e a chave.

A encriptação de chaves simétricas utiliza tipicamente cifras por blocos e modos de cifra por blocos. Uma cifra de blocos é uma função de encriptação simétrica que opera em blocos de tamanho fixo. Se a mensagem que pretende encriptar for maior do que o comprimento do bloco, deve usar um modo de cifra por blocos. Um modo de cifra por blocos é uma função de encriptação simétrica construída utilizando uma cifra por blocos. Encripta o texto simples como uma série de blocos de tamanho fixo. Os seguintes modos são suportados para aplicações:

  • O modo ECB (livro de códigos eletrónico) encripta cada bloco da mensagem separadamente. Isto não é considerado um modo de encriptação seguro.
  • O modo CBC (encadeamento de blocos cifrados) utiliza o bloco de texto cifrado anterior para ofuscar o bloco atual. Deve determinar que valor usar para o primeiro bloco. Este valor é chamado de vetor de inicialização (IV).
  • O modo CCM (contador com CBC-MAC) combina o modo de cifra por blocos CBC com um código de autenticação de mensagens (MAC).
  • O modo GCM (modo contador de Galois) combina o modo de encriptação de contador com o modo de autenticação de Galois.

Alguns modos, como o CBC, exigem que utilize um vetor de inicialização (IV) para o primeiro bloco de texto cifrado. Os seguintes são vetores de inicialização comuns. Especifica o IV ao chamar o CryptographicEngine.Encrypt. Na maioria dos casos, é importante que o IV nunca seja reutilizado com a mesma chave.

  • O Fixed usa o mesmo IV para todas as mensagens a encriptar. Isto divulga informações e o seu uso não é recomendado.
  • O contador incrementa o IV para cada bloco.
  • Random cria um IV pseudoaleatório. Podes usar o CryptographicBuffer.GenerateRandom para criar o IV.
  • Nonce-Generated utiliza um número único para cada mensagem a encriptar. Normalmente, o nonce é um identificador de mensagem ou transação modificado. O nonce não tem de ser mantido em segredo, mas nunca deve ser reutilizado sob a mesma chave.

A maioria dos modos exige que o comprimento do texto simples seja um múltiplo exato do tamanho do bloco. Isto normalmente requer que preencha o texto simples para obter o comprimento adequado.

Enquanto as cifras de bloco encriptam blocos de dados de tamanho fixo, as cifras de fluxo são funções de encriptação simétricas que combinam bits de texto simples com um fluxo de bits pseudoaleatório (chamado fluxo de chaves) para gerar o texto cifrado. Alguns modos de cifra por blocos, como o modo de retroalimentação de saída (OTF) e o modo contador (CTR), transformam efetivamente uma cifra de bloco numa cifra de fluxo. Cifras de fluxo reais, como o RC4, normalmente operam a velocidades superiores às que os modos de cifra por blocos conseguem alcançar.

O exemplo seguinte mostra como usar a classe SymmetricKeyAlgorithmProvider para criar uma chave simétrica e usá-la para encriptar e desencriptar dados.

Chaves assimétricas

A criptografia de chave assimétrica, também chamada de criptografia de chave pública, utiliza uma chave pública e uma chave privada para realizar encriptação e desencriptação. As chaves são diferentes, mas matematicamente relacionadas. Normalmente, a chave privada é mantida em segredo e usada para desencriptar dados enquanto a chave pública é distribuída para as partes interessadas e é usada para encriptar dados. A criptografia assimétrica também é útil para assinar dados.

Como a criptografia assimétrica é muito mais lenta do que a criptografia simétrica, raramente é usada para encriptar grandes quantidades de dados diretamente. Em vez disso, é normalmente usado da seguinte forma para encriptar chaves.

  • Alice exige que Bob lhe envie apenas mensagens encriptadas.
  • A Alice cria um par de chaves privadas/públicas, mantém a sua chave privada em segredo e publica a sua chave pública.
  • O Bob tem uma mensagem que quer enviar à Alice.
  • Bob cria uma chave simétrica.
  • O Bob usa a sua nova chave simétrica para encriptar a mensagem para a Alice.
  • Bob usa a chave pública de Alice para encriptar a sua chave simétrica.
  • Bob envia a mensagem encriptada e a chave simétrica encriptada para Alice (envolvida).
  • A Alice usa a sua chave privada (do par privado/público) para desencriptar a chave simétrica do Bob.
  • A Alice usa a chave simétrica do Bob para desencriptar a mensagem.

Pode usar um objeto AsymmetricKeyAlgorithmProvider para especificar um algoritmo assimétrico ou um algoritmo de assinatura, para criar ou importar um par de chaves efémeras, ou para importar a parte de chave pública de um par de chaves.

Derivação de chaves

É frequentemente necessário obter chaves adicionais a partir de um segredo partilhado. Pode usar a classe KeyDerivationAlgorithmProvider e um dos seguintes métodos especializados na classe KeyDerivationParameters para derivar chaves.

Objeto Descrição
BuildForPbkdf2 Cria um objeto KeyDerivationParameters para uso na função de derivação de chaves baseada em palavra-passe 2 (PBKDF2).
BuildForSP800108 Cria um objeto KeyDerivationParameters para uso numa função de derivação de chaves em modo de contador, baseada em hash, utilizando o código de autenticação de mensagens (HMAC).
BuildForSP80056a Cria um objeto KeyDerivationParameters para utilização na função de derivação de chaves SP800-56A.