Exemplo de modo combinado

const string MESSAGE = "hello bob";
var alice = PublicKeyBox.GenerateKeyPair();
var bob = PublicKeyBox.GenerateKeyPair();

var nonce = PublicKeyBox.GenerateNonce();

//alice encrypts a message for bob
var encrypted = PublicKeyBox.Create(MESSAGE, nonce, alice.PrivateKey, bob.PublicKey);
//bob decrypt the message
var decrypted = PublicKeyBox.Open(encrypted, nonce, bob.PrivateKey, alice.PublicKey);

Propósito

Usando criptografia autenticada por chave pública, Bob pode criptografar uma mensagem confidencial especificamente para Alice, usando a chave pública de Alice.

Usando a chave pública de Bob, Alice pode verificar se a mensagem criptografada foi realmente criada por Bob e não foi adulterada, antes de eventualmente descriptografá-la.

Alice só precisa da chave pública de Bob, o nonce e o texto cifrado. Bob nunca deveria compartilhar sua chave secreta, mesmo com Alice.

E para enviar mensagens para Alice, Bob só precisa da chave pública de Alice. Alice também nunca deveria compartilhar sua chave secreta, mesmo com Bob.

Alice pode responder a Bob usando o mesmo sistema, sem ter que gerar um par de chaves distinto.

O nonce não precisa ser confidencial, mas deve ser usado com apenas uma invocação de um determinado par de chaves públicas e secretas.Open()

Uma maneira fácil de gerar um nonce é usar, considerando o tamanho dos nonces, o risco de colisões aleatórias é insignificante. Para alguns aplicativos, se você deseja usar nonces para detectar mensagens ausentes ou ignorar mensagens reproduzidas, também não há problema em usar um contador de incremento simples como um nonce.PublicKeyBox.GenerateNonce()

Ao fazer isso, você deve garantir que o mesmo valor nunca possa ser reutilizado (por exemplo, você pode ter vários threads ou até mesmo hosts gerando mensagens usando os mesmos pares de chaves).

Este sistema fornece autenticação mútua. No entanto, um caso de uso típico é proteger as comunicações entre um servidor, cuja chave pública é conhecida com antecedência, e os clientes que se conectam anonimamente.

Ajudantes aleatórios

public static KeyPair GenerateKeyPair()

Namespace: Sodium.PublicKeyBox

Usa para gerar um par de chaves com base em uma semente aleatória. Sodium.SodiumCore.GetRandomBytes()

public static KeyPair GenerateKeyPair(byte[] privateKey)

Namespace: Sodium.PublicKeyBox

Usa para gerar um par de chaves com base na chave privada fornecida. Sodium.SodiumCore.GetRandomBytes()

Theseed deve bebytes, caso contrário, a função lança a. privateKey32SeedOutOfRangeException libsodium-net KeyPair

public static byte[] GenerateNonce()

Namespace: Sodium.PublicKeyBox

Usas para gerar um nonce de 24 bytes. Sodium.SodiumCore.GetRandomBytes()

Modo combinado

No modo combinado, a tag de autenticação e a mensagem criptografada são armazenadas juntas. Isso geralmente é o que você quer, pois

Criptografar

public static byte[] Create(byte[] message, byte[] nonce, byte[] secretKey, byte[] publicKey)

//there exists an overloaded version:
public static byte[] Create(string message, byte[] nonce, byte[] secretKey, byte[] publicKey)

Este é o equivalente .NET docrypto_box_easy.

Namespace: Sodium.PublicKeyBox

A função criptografa a, com a de um destinatário, a de um remetente e a .Create() message publicKey secretKey nonce

Devem ser bytes, caso contrário, a função lança a .secretKey 32 KeyOutOfRangeException

Devem ser bytes, caso contrário, a função lança a .publicKey 32 KeyOutOfRangeException

Devem ser bytes, caso contrário, a função lança a .nonce 24 NonceOutOfRangeException

A função retorna uma matriz de bytes (mensagem criptografada) com êxito ou lança uma falha anon .CryptographicException()

Desencriptar

public static byte[] Open(byte[] cipherText, byte[] nonce, byte[] secretKey, byte[] publicKey)

Este é o equivalente .NET docrypto_box_open_easy.

Namespace: Sodium.PublicKeyBox

A função descriptografa uma mensagem, com a de um destinatário, a de um remetente e a .Open() cipherText secretKey publicKey nonce

Devem ser bytes, caso contrário, a função lança a .secretKey 32 KeyOutOfRangeException

Devem ser bytes, caso contrário, a função lança a .publicKey 32 KeyOutOfRangeException

Devem ser bytes, caso contrário, a função lança a .nonce 24 NonceOutOfRangeException

A função retorna uma matriz de bytes (mensagem não criptografada) com êxito ou lança uma falha anon.CryptographicException()

Modo desanexado

Alguns aplicativos podem precisar armazenar a marca de autenticação e a mensagem criptografada em locais diferentes.

Para este caso de uso específico, variantes “desanexadas” das funções acima estão disponíveis.

Nota: Porquenão trabalhar com ponteiros comonós fazemos uso de um objeto em vez disso: libsodium-netlibsodiumDetachedBox

/// <param name="cipherText">The cipher.</param>
/// <param name="mac">The 16 byte mac.</param>
public DetachedBox(byte[] cipherText, byte[] mac)
{
  CipherText = cipherText;
  Mac = mac;
}

Criptografar

public static DetachedBox CreateDetached(byte[] message, byte[] nonce, byte[] secretKey, byte[] publicKey)

//there exists an overloaded version:
public static DetachedBox CreateDetached(string message, byte[] nonce, byte[] secretKey, byte[] publicKey)

Este é o equivalente .NET docrypto_box_detached.

Namespace: Sodium.PublicKeyBox

A função criptografa a, com a de um destinatário, a de um remetente e a .CreateDetached() message publicKey secretKey nonce

Devem ser bytes, caso contrário, a função lança a .secretKey 32 KeyOutOfRangeException

Devem ser bytes, caso contrário, a função lança a .publicKey 32 KeyOutOfRangeException

Devem ser bytes, caso contrário, a função lança a .nonce 24 NonceOutOfRangeException

A função retorna aon success, ou lança anon failure .DetachedBoxCryptographicException()

Desencriptar

public static byte[] OpenDetached(byte[] cipherText, byte[] mac, byte[] nonce, byte[] secretKey, byte[] publicKey)

//there exists some overloaded versions:
public static byte[] OpenDetached(string cipherText, byte[] mac, byte[] nonce, byte[] secretKey, byte[] publicKey)
public static byte[] OpenDetached(DetachedBox detached, byte[] nonce, byte[] secretKey, byte[] publicKey)

Este é o equivalente .NET docrypto_box_open_detached.

Namespace: Sodium.PublicKeyBox

A função descriptografa uma mensagem, com a de um destinatário, um remetente, e a .OpenDetached()cipherTextsecretKeypublicKeymacnonce

Devem ser bytes, caso contrário, a função lança a.secretKey 32 KeyOutOfRangeException

Devem ser bytes, caso contrário, a função lança a.publicKey 32 KeyOutOfRangeException

Devem ser bytes, caso contrário, a função lança a.nonce 24 NonceOutOfRangeException

Devem ser bytes, caso contrário, o método lança a.mac 16 MacOutOfRangeException

As mesmas exceções serão lançadas na versão sobrecarregada que usou o objeto.detached

A função retorna uma matriz de bytes (mensagem não criptografada) com êxito ou lança uma falha anon.CryptographicException()

Detalhes do algoritmo

  • Key exchange: Curve25519
  • Encryption: XSalsa20 stream cipher
  • Authentication: Poly1305 MAC

Artigo Original