Bueno, para empezar, las teclas no son cadenas, las teclas son blobs binarios. PlainText es lo mismo, en realidad no es texto, de nuevo es un blob binario.
Ahora, por supuesto, se puede convertir cadenas en matrices de bytes utilizando Encoding.UTF8.GetBytes(message)
, sin embargo, cuando la conversión de llaves de ida y vuelta que es un poco más complicado, que suelen utilizar Convert.ToBase64String
y Convert.FromBase64String
.
No olvide que las cifras de bloque también tienen una cosa más, el vector de inicialización, así que realmente sus firmas de método debe ser
byte[] Encrypt(byte[] plainText, byte[] key, byte[] iv)
byte[] Decrypt(byte[] cipherText, byte[] key, byte[] iv)
La clave y vías intravenosas debe ser números aleatorios criptográficamente seguros, don' Simplemente escríbalos y no use la función aleatoria de C#. El tamaño de la clave y el IV dependen del algoritmo de cifrado utilizado, y las propiedades de las clases pueden acceder a él.
Para generar un CSRPNG haces algo como
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
byte[] key = new byte[algorithm.KeySizeValue/8];
rng.GetBytes(key);
byte[] iv = new byte[algorithm.BlockSizeValue/8];
rng.GetBytes(iv);
También puede utilizar la clase Rfc2898DeriveBytes para derivar una clave y IV de una contraseña y una sal, pero de nuevo la sal debe ser un número aleatorio criptográficamente seguro . También debe tener en cuenta que cuando crea un algoritmo simétrico se genera una clave segura y IV para usted.
De esta manera, puede elegir la codificación correcta para su texto, ya sea UTF8, ASCII o lo que sea. Los enlaces tienen suficientes muestras para cortar y pegar aquí es bastante inútil.
¿Rijndael no es simétrico? –
Creo que es –
Yo recomendaría usar Rijndael, entonces :) –