Recentemente, fiz uma função de login pós-simulação, a senha de login é criptografada pelo CryptoJS aes, e então quero escrever o algoritmo correspondente em C# Introdução ao algoritmo de criptografia AES:
Padrão Avançado de Criptografia (abreviação: AES), também conhecido como criptografia de Rijndael em criptografia, é um padrão de criptografia em blocos adotado pelo governo federal dos EUA. Esse padrão é usado para substituir o DES original e tem sido analisado e amplamente utilizado ao redor do mundo. Após um processo de seleção de cinco anos, o Advanced Cryptographic Standard foi publicado pelo Instituto Nacional de Padrões e Tecnologia (NIST) no FIPS PUB 197 em 26 de novembro de 2001, tornando-se um padrão válido em 26 de maio de 2002. Em 2006, o Advanced Encryption Standard tornou-se um dos algoritmos mais populares para criptografia de chave simétrica. O algoritmo js é o seguinte:
Pesquisei sites online de criptografia AES na Internet, e os resultados são diferentes da minha própria criptografia, o AES parece ter muitos modos, e já vi apresentações de outras pessoas na Internet
Comece preparando um texto simples e uma chave: var plaintText = 'aa'; Texto simples var keyStr = 'bbbbbbbbbbbbbbbb'; Geralmente, a tonalidade é uma string De acordo com a documentação do site oficial, o método AES suporta AES-128, AES-192 e AES-256, e o método de criptografia usado no processo de criptografia depende do tipo de chave recebida, caso contrário será criptografado conforme o AES-256. O CryptoJS suporta AES-128, AES-192 e AES-256. Ele vai escolher a variante pelo tamanho da chave que você passa. Se você usar uma senha, ela gerará uma chave de 256 bits. Como o Java é dado de acordo com 128 bits, mas como é uma string, ele precisa ser convertido para 128 bits no frontend. No começo, achei que usar CryptoJS.enc.Hex.parse converteria corretamente para uma chave de 128 bits. Mas fora isso... Após várias tentativas, você precisa usar o método CryptoJS.enc.Utf8.parse para converter a chave para 128 bits. Bem, como dizem que são múltiplas tentativas, então a razão não é conhecida, e será estudada mais a fundo depois. Antes de usar a tonalidade do tipo de corda, você precisa analisar com o uft8 antes de poder usá-lo var key = CryptoJS.enc.Utf8.parse(keyStr); Como o backend usa PKCS5Padding, mas ao usar CryptoJS, foi constatado que não havia nenhum deslocamento. Criptografia var encryptedData = CryptoJS.AES.encrypt(plaintText, key, { modo: CryptoJS.mode.ECB, enchimento de conteúdo: CryptoJS.pad.Pkcs7 }); Como o texto cifrado gerado pelo CryptoJS é um objeto, se você convertê-lo diretamente para uma string codificada em Base64, o atributo em encryptedData. O texto cifrado é convertido para uma string que é o formato exigido pelo backend. var encryptedBase64Str = encryptedData.toString(); Output: 'RJcecVhTqCHHnlibzTypzuDvG8kjWC+ot8JuxWVdLgY=' console.log(encryptedBase64Str); Você precisa ler ciphertext.toString() no encryptedData para obter o mesmo texto cifrado do Java var encryptedStr = encryptedData.ciphertext.toString(); Saída: '44971e715853a821c79e589bcd3ca9cee0ef1bc923582fa8b7c26ec5655d2e06' console.log(Str criptografado); Como o texto cifrado criptografado é uma cadeia de 128 bits, ele precisa ser convertido para o formato codificado em Base64 ao ser descriptografado. Depois, você precisa usar o método CryptoJS.enc.Hex.parse para convertê-lo para hexadecimal, e então usar CryptoJS.enc.Base64.stringify para converter em uma string codificada em Base64, e então pode passar para o método CryptoJS.AES.decrypt para descriptografar. Para obter o texto cifrado do tipo de cadeia, você precisa analisá-lo primeiro com o método Hex var encryptedHexStr = CryptoJS.enc.Hex.parse(encryptedStr); Converter texto cifrado para strings Base64 Apenas texto cifrado do tipo Base64 pode descriptografá-lo var encryptedBase64Str = CryptoJS.enc.Base64.stringify(encryptedHexStr); A string convertida para codificação Base64 pode ser passada para o método CryptoJS.AES.decrypt para operação de descriptografia. Descriptografia var decryptedData = CryptoJS.AES.decrypt(encryptedBase64Str, key, { modo: CryptoJS.mode.ECB, enchimento de conteúdo: CryptoJS.pad.Pkcs7 }); Após a descriptografia do CryptoJS, ele ainda é um objeto, e transformá-lo em texto simples precisa ser convertido em uma string no formato Utf8. Após a descriptografia, a cadeia de texto simples precisa ser transposta da maneira do Utf8 var decryptedStr = decryptedData.toString(CryptoJS.enc.Utf8); console.log(Str decriptografado); 'a'
Aqui está o código-fonte da implementação do AES em .NET/C#:
|