Existem principalmente dois tipos de algoritmos que são utilizados para criptografia e descriptografia.
Criptografia simétrica
Neste tipo de criptografia, uma única chave é usada para criptografia e descriptografia. É mais rápido do que o outro, mas também tem alguns inconvenientes como chave única, que é usado para criptografia e descriptografia, então quando você criptografar os dados, você tem que fornecer a mesma chave para a descriptografia e se os dados são enviados através da rede, Então no final, onde decodificação aconteceu, também precisamos saber a mesma chave. Suponha que você tem um Serviço e está fazendo a criptografia / descriptografia da mensagem com uma chave e seus muitos clientes consomem esse Serviço, então você tem que fornecer a chave para o seu cliente também. Ele precisa de confiança de nível muito alto, como você está compartilhando sua chave, o que significa seu segredo.
Criptografia assimétrica
Vimos que a criptografia simétrica tem alguns problemas de segurança e confiança, então a criptografia assimétrica resolve esse problema. A criptografia assimétrica usa duas chaves para criptografia e descriptografia, onde uma chave é para criptografia e outra é para descriptografia. Criptografar mensagem por chave pública e descriptografar mensagem usando chave particular. A chave pública é usada somente para criptografia e não pode descriptografar a mensagem por chave pública, mas criptografia assimétrica é mais lenta do que outros. É muito lento, por isso não se encaixa bem para os grandes dados ainda mais do que 1kilobyte.
Principalmente dois algoritmos são usados para a criptografia assimétrica.
1- RSA foi descrito pela primeira vez em 1978 por Ron Rivest, Adi Shamir e Leonard Adleman e foi nomeado em seu nome RSA, que significa Ron Rivest, Adi Shamir e Leonard Adleman
2- DSA significa Digital Signature Algorithm.
Neste artigo, veremos criptografia simétrica com algoritmos DES, 3DES e AES. Existem muitos algoritmos, que estão disponíveis para criptografia. Vou explicar três, que são DES, 3DES, AES.
DES Data Encryption Standard
É uma maneira tradicional antiga , que é usada para criptografia e descriptografia. Não é confiável e pode se quebrar facilmente. O tamanho da chave no DES é muito curto. Não é muito bom quando nossos dados viajam por redes.
Código de criptografia
public string EncryptData(string strData, string strKey) { byte[] key = { }; //Chave de criptografia byte[] IV = { 10, 20, 30, 40, 50, 60, 70, 80 }; byte[] inputByteArray; try { key = Encoding.UTF8.GetBytes(strKey); // DESCryptoServiceProvider é a classe de criptografia em c#. DESCryptoServiceProvider ObjDES = new DESCryptoServiceProvider(); inputByteArray = Encoding.UTF8.GetBytes(strData); MemoryStream Objmst = new MemoryStream(); CryptoStream Objcs = new CryptoStream(Objmst, ObjDES.CreateEncryptor(key, IV), CryptoStreamMode.Write); Objcs.Write(inputByteArray, 0, inputByteArray.Length); Objcs.FlushFinalBlock(); return Convert.ToBase64String(Objmst.ToArray());// string final } catch (System.Exception ex) { throw ex; } }
Código de descriptografia
public string DecryptData(string strData, string strKey) { byte[] key = { };// chave byte[] IV = { 10, 20, 30, 40, 50, 60, 70, 80 }; byte[] inputByteArray = new byte[strData.Length]; try { key = Encoding.UTF8.GetBytes(strKey); DESCryptoServiceProvider ObjDES = new DESCryptoServiceProvider(); inputByteArray = Convert.FromBase64String(strData); MemoryStream Objmst = new MemoryStream(); CryptoStream Objcs = new CryptoStream(Objmst, ObjDES.CreateDecryptor(key, IV), CryptoStreamMode.Write); Objcs.Write(inputByteArray, 0, inputByteArray.Length); Objcs.FlushFinalBlock(); Encoding encoding = Encoding.UTF8; return encoding.GetString(Objmst.ToArray()); } catch (System.Exception ex) { throw ex; } }
3DES – chamado Triple DES
Como vimos, existem algumas questões relacionadas à segurança no algoritmo DES, então podemos dizer que, 3DES é uma versão atualizada do DES. No 3DES, eles também aumentam o tamanho da chave, que era muito curto em DES, porém cuido ao utilizá-lo quando seus dados trafegam via rede aberta.
Padrão Avançado de Criptografia AES
O Advanced Encryption Standard ou AES também é chamado de Rijndael cipher (meu favorito). AES suporta criptografia de 128, 192 e 256 bits, que pode ser determinada pelo tamanho da chave, o tamanho da chave de criptografia de 128 bits é de 16 bytes, a chave de criptografia de 192 bits é de 24 bytes eo tamanho da chave de criptografia de 256 bits é de 32 bytes. A AES Encryption oferece um bom desempenho e um bom nível de segurança. A criptografia AES é uma cifra simétrica e usa a mesma chave para criptografia e descriptografia.
Código de criptografia
string EncryptData(string textData, string Encryptionkey) { RijndaelManaged objrij = new RijndaelManaged(); //iniciar o modo de operação objrij.Mode = CipherMode.CBC; //setar o padding de operação da string objrij.Padding = PaddingMode.PKCS7; //setar o tamanho (em bits) da operação objrij.KeySize = 0x80; //setar o tamanho do bloco objrij.BlockSize = 0x80; //setar a chave de criptografia byte[] passBytes = Encoding.UTF8.GetBytes(Encryptionkey); //setar o vetor de bytes de inicialização para criptografia byte[] EncryptionkeyBytes = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; int len = passBytes.Length; if (len > EncryptionkeyBytes.Length) { len = EncryptionkeyBytes.Length; } Array.Copy(passBytes, EncryptionkeyBytes, len); objrij.Key = EncryptionkeyBytes; objrij.IV = EncryptionkeyBytes; //Cria uma chave simétrica ICryptoTransform objtransform = objrij.CreateEncryptor(); byte[] textDataByte = Encoding.UTF8.GetBytes(textData); //Converte para string e retorna return Convert.ToBase64String(objtransform.TransformFinalBlock(textDataByte, 0, textDataByte.Length)); }
Código de descriptografia
string DecryptData(string EncryptedText, string Encryptionkey) { RijndaelManaged objrij = new RijndaelManaged(); objrij.Mode = CipherMode.CBC; objrij.Padding = PaddingMode.PKCS7; objrij.KeySize = 0x80; objrij.BlockSize = 0x80; byte[] encryptedTextByte = Convert.FromBase64String(EncryptedText); byte[] passBytes = Encoding.UTF8.GetBytes(Encryptionkey); byte[] EncryptionkeyBytes = new byte[0x10]; int len = passBytes.Length; if (len > EncryptionkeyBytes.Length) { len = EncryptionkeyBytes.Length; } Array.Copy(passBytes, EncryptionkeyBytes, len); objrij.Key = EncryptionkeyBytes; objrij.IV = EncryptionkeyBytes; byte[] TextByte = objrij.CreateDecryptor().TransformFinalBlock(encryptedTextByte, 0, encryptedTextByte.Length); return Encoding.UTF8.GetString(TextByte); //irá retornar a string original descriptografada }
No próximos artigos irei explicar a criptografia assimétrica (RSA, DSA).
Um grande abraço a todos!