Documentação das meias de sombra
Navegação
AEAD
AEAD significa Criptografia Autenticada com Dados Associados. As cifras AEAD fornecem simultaneamente confidencialidade, integridade e autenticidade. Eles têm excelente desempenho e eficiência de energia em hardware moderno. Os usuários devem usar cifras AEAD sempre que possível.
As seguintes cifras AEAD são recomendadas. As implementações de Shadowsocks em conformidade devem oferecer suporte a AEAD_CHACHA20_POLY1305. As implementações para dispositivos com aceleração AES de hardware também devem implementar AEAD_AES_128_GCM e AEAD_AES_256_GCM.
Nome | aliás | Tamanho da chave | Tamanho do Sal | Tamanho único | Tamanho de etiqueta |
AEAD_CHACHA20_POLY1305 | chacha20-ietf-poly1305 | 32 | 32 | 12 | 16 |
AEAD_AES_256_GCM | aes-256-gcm | 32 | 32 | 12 | 16 |
AEAD_AES_128_GCM | aes-128-gcm | 16 | 16 | 12 | 16 |
Por favor, consulte Registro IANA AEAD para esquema de nomenclatura e especificação.
Derivação de chave
A chave mestra pode ser inserida diretamente pelo usuário ou gerada a partir de uma senha.
HKDF_SHA1 é uma função que pega uma chave secreta, um sal não secreto, uma string de informações e produz uma subchave que é criptograficamente forte, mesmo que a chave secreta de entrada seja fraca.
HKDF_SHA1(chave, salt, info) => subchave
A cadeia de informações vincula a subchave gerada a um contexto de aplicativo específico. No nosso caso, deve ser a string “ss-subkey” sem aspas.
Derivamos uma subchave por sessão de uma chave mestra pré-compartilhada usando HKDF_SHA1. Salt deve ser exclusivo durante toda a vida útil da chave mestra pré-compartilhada.
Criptografia/Descriptografia Autenticada
AE_encrypt é uma função que pega uma chave secreta, um nonce não secreto, uma mensagem e produz texto cifrado e uma marca de autenticação. O nonce deve ser exclusivo para uma determinada chave em cada chamada.
AE_encrypt(chave, nonce, mensagem) => (texto cifrado, tag)
AE_decrypt é uma função que pega uma chave secreta, nonce não secreta, texto cifrado, uma marca de autenticação e produz uma mensagem original. Se alguma entrada for adulterada, a descriptografia falhará.
AE_decrypt(chave, nonce, texto cifrado, tag) => mensagem
TCP
Um fluxo TCP criptografado AEAD começa com um sal gerado aleatoriamente para derivar a subchave por sessão, seguido por qualquer número de blocos criptografados. Cada pedaço tem a seguinte estrutura:
[tamanho da carga criptografada][tag de comprimento][carga criptografada][tag da carga]
O comprimento da carga útil é um inteiro não assinado big-endian de 2 bytes limitado a 0x3FFF. Os dois bits mais altos são reservados e devem ser definidos como zero. A carga útil é, portanto, limitada a 16*1024 – 1 bytes.
A primeira operação de criptografia/descriptografia do AEAD usa um nonce de contagem começando em 0. Após cada operação de criptografia/descriptografia, o nonce é incrementado em um, como se fosse um inteiro little-endian sem sinal. Observe que cada fragmento TCP envolve duas operações de criptografia/descriptografia AEAD: uma para o comprimento da carga útil e outra para a carga útil. Portanto, cada pedaço aumenta o nonce duas vezes.
TCP
Um fluxo TCP criptografado AEAD começa com um sal gerado aleatoriamente para derivar a subchave por sessão, seguido por qualquer número de blocos criptografados. Cada pedaço tem a seguinte estrutura:
[tamanho da carga criptografada][tag de comprimento][carga criptografada][tag da carga]
O comprimento da carga útil é um inteiro não assinado big-endian de 2 bytes limitado a 0x3FFF. Os dois bits mais altos são reservados e devem ser definidos como zero. A carga útil é, portanto, limitada a 16*1024 – 1 bytes.
A primeira operação de criptografia/descriptografia do AEAD usa um nonce de contagem começando em 0. Após cada operação de criptografia/descriptografia, o nonce é incrementado em um, como se fosse um inteiro little-endian sem sinal. Observe que cada fragmento TCP envolve duas operações de criptografia/descriptografia AEAD: uma para o comprimento da carga útil e outra para a carga útil. Portanto, cada pedaço aumenta o nonce duas vezes.