Gibt es eine Möglichkeit, ein Bytearray zu verschlüsseln, ohne einen Stream zu verwenden?.NET Encrypt Bytearray
Antwort
Wenn Sie Bedenken hinsichtlich der Festplatten-E/A haben, können Sie einen MemoryStream verwenden.
Die RSACryptoServiceProvider-Klasse wird jedoch auf Bytearrays ausgeführt. Diese Klasse führt eine asymmetrische Verschlüsselung und Entschlüsselung unter Verwendung einer Implementierung des RSA-Algorithmus durch.
Die Beispiele here zeigen, wie Sie diese
Nun, man könnte Ihre eigenen Verschlüsselungsalgorithmen schreiben - aber es ist viel einfacher zu bedienen nur die integrierte Streaming-API Schreiben in ein MemoryStream
, die Sie dann in einem Byte-Array konvertieren ToArray
verwenden.
Verwenden Sie einen Block Chiffre mit Byte-Arrays tun können, und es selbst implementieren.
Aber das ist fast sicher sinnlos, da die Verwendung eines MemoryStream auf dem Byte-Array gut funktionieren sollte und eine gut getestete Implementierung verwenden wird.
Etwas selbst implementieren, wenn Sie über Crypto sprechen ist normalerweise eine schlechte Idee.
Mit der Cryptography Application Block von Microsofts Enterprise Library können Sie dies tun, aber ich stimme den anderen zu, dass Sie wirklich keinen Nutzen davon haben, keinen Stream zu verwenden.
In der Tat brauchen Sie nicht überhaupt keine Ströme zu verwenden, mit Bytes zu betreiben. Das einzige, was Sie brauchen, ist Transform() -Methode von ICryptoTransform zu nennen, die Verschlüssler oder Entschlüsselungsvorrichtung eines Algorithmus aus SymmetricAlgorithm Klasse abgeleitet werden kann
public class CryptoProvider
{
private SymmetricAlgorithm _algorithm = new RijndaelManaged();
public byte[] EncryptData(byte[] data, string password)
{
GetKey(password);
ICryptoTransform encryptor = _algorithm.CreateEncryptor();
byte[] cryptoData = encryptor.TransformFinalBlock(data, 0, data.Length);
return cryptoData;
}
public byte[] DecryptData(byte[] cryptoData, string password)
{
GetKey(password);
ICryptoTransform decryptor = _algorithm.CreateDecryptor();
byte[] data = decryptor.TransformFinalBlock(cryptoData, 0, cryptoData.Length);
return data;
}
private void GetKey(string password)
{
byte[] salt = new byte[8];
byte[] passwordBytes = Encoding.ASCII.GetBytes(password);
int length = Math.Min(passwordBytes.Length, salt.Length);
for (int i = 0; i < length; i++)
salt[i] = passwordBytes[i];
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(password, salt);
_algorithm.Key = key.GetBytes(_algorithm.KeySize/8);
_algorithm.IV = key.GetBytes(_algorithm.BlockSize/8);
}
}