2009-03-03 16 views

答えて

5

ディスクI/Oが懸念される場合は、MemoryStreamを使用できます。

ただし、RSACryptoServiceProviderクラスはバイト配列で動作します。このクラスは、RSAアルゴリズムの実装を使用して非対称暗号化と復号化を実行します。

hereあなたはバイト配列

2

さて、あなた独自の暗号化アルゴリズムを書くことができます - しかし、それだけで組み込みのストリーミングAPIあなたがToArrayを使用してバイト配列に変換MemoryStreamへの書き込みを使用する方がはるかに簡単です。

-1

ブロックサイファーを使用し、それを自分で実装すると、これを行うことができます方法を示しています。

バイト配列のMemoryStreamを使用するとうまく動作し、十分にテストされた実装が使用されるため、これはほとんど無意味です。

暗号化について話しているときに何かを実装すると、は通常という悪い考えです。

0

MicrosoftのエンタープライズライブラリのCryptography Application Blockを使用すると、これを行うことができますが、実際にはストリームを使用しないことによるメリットはありません。

14

は、実際には、あなたはバイトで動作するすべての任意のストリームを使用する必要はありません。あなたが必要 唯一のものは、SymmetricAlgorithmクラス

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); 

    } 
} 
由来の任意のアルゴリズムの暗号化や復号化することができICryptoTransformのTransformFinalBlock()メソッドを呼び出すことです
関連する問題