van que para net módulo máximo los exceden este encriptar encriptación descifrar descifrado datos cifrar cifrado bytes archivos algoritmo c# .net security encryption

c# - que - ¿Cómo crear clave de encriptación para algoritmos de encriptación?



los datos que se van a descifrar exceden el máximo para este módulo de 128 bytes c# (6)

Genera un código aleatorio de letras / hex en una longitud específica.

Esta función (tomada de here ) devuelve una clave aleatoria en una longitud específica:

private static string CreateSalt(int size) { //Generate a cryptographic random number. RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider(); byte[] buff = new byte[size]; rng.GetBytes(buff); // Return a Base64 string representation of the random number. return Convert.ToBase64String(buff); }

Quiero utilizar el algoritmo de encriptación disponible en el espacio de nombres .Net Security, sin embargo, estoy tratando de entender cómo generar la clave, por ejemplo, el algoritmo AES necesita 256 bits, esa clave de 16 bytes y algún vector de inicialización, que también es de pocos bytes.

  1. ¿Puedo usar cualquier combinación de valores en mi Key y IV? por ejemplo, todos los ceros en Key y IV son válidos o no? Conozco los detalles del algoritmo que hace muchos xors, por lo que cero no sirve para nada, pero ¿hay alguna restricción por estos algoritmos?

  2. O ¿Tengo que generar la clave utilizando algún programa y guardarlo permanentemente en alguna parte?

Quiero almacenar datos en la base de datos después del cifrado, los datos del perfil seguro como nombre de usuario, contraseña, número de teléfono, etc., y la clave estará disponible para el usuario de la base de datos mencionado solo en la cadena de conexión y para el administrador.


Parece que necesitas leer en la clase Rfc2898DeriveBytes.

Rfc2898DeriveBytes.GetBytes();

Tiene un método (arriba) que le permite adaptar el tamaño de las matrices de bytes que se introducen en las propiedades .Key y .IV en un algoritmo de cifrado simétrico, simplemente al alimentar un valor int. El libro oficial MS 70-536 sugiere hacer esto de forma pro-gramatical dividiendo la propiedad KeySize / 8.

Es decir TripleDes o AESManaged. Sea lo que sea que uses, el algoritmo en sí tendrá algunos requisitos previos que necesitarán reunirse primero. Es decir, que satisface las condiciones de tamaño de clave. RunTime rellenará automáticamente las propiedades, los campos, etc., los mejores y más sólidos valores para usted. Pero el IV y Key deben venir de ti. Esta es la forma en que puede hacer lo siguiente:

RijndaelManaged myAlg = new RiRijndaelManaged(); byte[] salt = Encoding.ASCII.GetBytes("Some salt value"); Rfc2898DeriveBytes key = new Rfc2898DeriveBytes("some password", salt); myAlg.Key = key.GetBytes( myAlg.KeySize / 8); myAlg.IV = key.GetBytes( myAlg.BlockSize / 8); // myAld should now fully set-up.

Arriba puedes ver a qué me refiero al hacerlo de forma prográmatica, ya que debería hacer todo por ti, sin siquiera tener que detenerse para cumplir con sus requisitos previos.

El libro Microsoft 70-536 indica que las propiedades .Key esperan las matrices de bytes que les proporcionas en bytes y no en bits. La clase RFC funciona en bytes donde, como algoritmos, la propiedad KeySize funciona en bits. 1 byte = 8 bits. ¿Puedes ver a dónde va esto ...? ¡Esto debería darte una idea de por qué el fragmento de código de ejemplo anterior se hace de la forma en que está! ¡Lo estudié y me parece bastante sensato!

La respuesta anterior debería permitirle crear su objeto de algoritmo con la contraseña proporcionada y un valor de sal estático que puede ser un código difícil en ambos extremos. Lo único que debe hacer es preocuparse de cómo asegurarse de que las matrices de bytes almacenadas en .Key y .IV se transporten de forma segura a un destinatario para que pueda descifrar correctamente el mensaje cifrado. Al reconstruir de forma segura el mismo objeto de algoritmo.

OBTW:

AESManaged tiene un tamaño de teclado requerido: 128Bits = 16 Bytes !!! (8 * 8 = 64, 64 bits / 8 bits por byte = 8 bytes) Por lo tanto

64 * 2 = 128 bits, 8 * 2, ==> ¡Tamaño de la clave de 16 bytes!

256 bits = 32 bits!

De acuerdo con el libro del kit de entrenamiento oficial 70-536, Aes se limita a tener un tamaño de teclado de 128bits en tamaño. 256bits, 192 y 128 key size por ejemplo se pueden usar con la clase Rijndael.

Por otro lado, podría olvidarse por completo de toda esa porquería y simplemente usar los métodos .GenerateKey y GenerateIV en su lugar para ahorrarle toda la molestia de clasificar una contraseña previamente compartida y acordada, y los valores estáticos de sal. Su única preocupación es descubrir una forma de almacenar y recuperar la clave y las matrices de IV byte. Formateador binario? .


Realmente deberías hacer esto de la manera correcta :)

1) Use un IV aleatorio generado de forma segura
2) Use una clave aleatoria generada de forma segura
3) No use el modo ECB - SIEMPRE

AesManaged aes = new AesManaged(); aes.GenerateKey(); aes.GenerateIV();

El código anterior generará correctamente y de forma segura una IV aleatoria y una clave aleatoria para usted.


Realmente depende de lo que hay que hacer con la llave.

Si la clave debe ser generada por la computadora (y puede tener cualquier valor aleatorio) generalmente tomo un SHA256 de un par de GUID. Esto es casi tan aleatorio como lo que obtendrás sin un generador de números aleatorios de hardware.

Puede usar claves con todos los 0, pero obviamente no será muy seguro.


Si está utilizando el cifrado para intercambiar datos, necesitará un protocolo de intercambio de claves, pero no lo hace uno en su lugar, use uno comercial como TLS o SSL.

Si usa el cifrado para almacenar datos, genere el IV usando CryptGenRandom (o su .net equivalente RandomNumberGenerator.GetBytes ) y guárdelo a lo largo del documento (en claro, no es necesario proteger el IV). Nunca escribe la clave, la clave la proporciona el usuario. Usualmente deriva la clave de una frase de contraseña usando CryptDeriveKey , o su .Net equivalente PasswordDeriveKey.CryptDeriveKey .

Actualizar

Para almacenar un secreto en la base de datos que está disponible solo para el usuario y un administrador, debe usar 3 claves:

  • uno para encriptar los datos con (llámalo la clave DK)
  • una clave de usuario para cifrar la clave DK (llámese UK)
  • una clave de administrador para encriptar la clave DK (llámala AK)

En teoría, encriptas los datos con DK y luego encriptas el DK con el Reino Unido y lo guardas, y encriptas el DK con AK y lo guardas. De esta forma, el usuario puede volver a utilizar el Reino Unido para descifrar el DK y luego descifrar los datos, y el administrador puede usar el AK para descifrar el DK y luego descifrar los datos. El gran problema es el hecho de que el sistema siempre está automatizado, por lo que el sistema necesita acceso a la clave del administrador, lo que significa que no es realmente una clave personal del administrador, sino una clave del sistema (no puede usarse para fines de no repudio por ejemplo).

Como advertencia, el conocimiento de qué es IV o cómo usar AES de C # y cómo funciona el algoritmo de criptografía le proporcionará exactamente 0 (cero) tracción para resolver este tipo de problemas. El problema nunca es qué IV y qué clave usar, el problema siempre es el aprovisionamiento clave. Para operaciones criptográficas reales, solo use el soporte integrado de la base de datos, vea Criptografía en SQL Server . Puedo argumentar fácilmente que la única instalación que necesita es TDE ( Cifrado de datos transparente ) para proteger contra la pérdida accidental de medios.


Use System.Security.Cryptography.RandomNumberGenerator para generar bytes aleatorios:

var rnd = new System.Security.Cryptography.RandomNumberGenerator.Create(); var key = new byte[50]; rnd.GetBytes(key);