Voici l'échantillon qui fonctionne pour moi. Je l'ai simplifié en utilisant copier-coller mais ne devrait pas importer. J'utilise le mot de passe de texte en raison de la compatibilité avec la bibliothèque JS, mais SSL ouvert lui-même prend en charge l'utilisation directe de byte [] Key et IV donc c'est à vous de décider quoi utiliser.
Pour passer des données binaires dans la chaîne utilisent juste
Encoding.UTF8.GetBytes() and Encoding.UTF8.GetString()
pour convertir en arrière.
public Byte[] Encrypt(Byte[] data, String password)
{
//Just random 8 bytes for salt
var salt = new Byte[] {1, 2, 3, 4, 5, 6, 7, 8};
using (var cc = new CipherContext(Cipher.AES_256_CBC))
{
//Constructing key and init vector from string password
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
byte[] iv;
byte[] key = cc.BytesToKey(MessageDigest.MD5, salt, passwordBytes, 1, out iv);
var memoryStream = new MemoryStream();
//Performing encryption thru unmanaged wrapper
var aesData = cc.Crypt(data, key, iv, true);
//Append salt so final data will look Salted___SALT|RESTOFTHEDATA
memoryStream.Write(Encoding.UTF8.GetBytes("Salted__"), 0, 8);
memoryStream.Write(salt, 0, 8);
memoryStream.Write(aesData, 0, aesData.Length);
return memoryStream.ToArray();
}
}
public Byte[] Decrypt(String password, Byte[] encryptedData)
{
byte[] salt = null;
//extracting salt if presented
if (encryptedData.Length > 16)
{
if (Encoding.UTF8.GetString(encryptedData).StartsWith("Salted__"))
{
salt = new Byte[8];
Buffer.BlockCopy(encryptedData, 8, salt, 0, 8);
}
}
//Removing salt from the original array
int aesDataLength = encryptedData.Length - 16;
byte[] aesData = new byte[aesDataLength];
Buffer.BlockCopy(encryptedData, 16, aesData, 0, aesDataLength);
using (var cc = new CipherContext(Cipher.AES_256_CBC))
{
//Constructing key and init vector from string password and salt
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
byte[] iv;
byte[] key = cc.BytesToKey(MessageDigest.MD5, salt, passwordBytes, 1, out iv);
//Decrypting
return cc.Decrypt(aesData, key, iv, 0);
}
}
Ce sont là quelques huit octets très aléatoire pour le sel;) – Nate
Eh bien, assez aléatoire pour répondre à la question, car cela est en effet pas un code en direct :) –
Ma mise en œuvre est basé sur cet exemple. J'utilise le contexte Cipher.AES_256_CBC mais si mon mot de passe est <16 octets lorsque cc.Crypt est appelé, il déclenche une exception. Parce qu'il essaie d'écrire les données cryptées de 16 octets dans le tampon de 8 octets qu'il crée. Avez-vous rencontré cela? J'utilise OpenSSL.Net 0.4.4 et j'utilise un résumé de message SHA1. – Jeff