既存のzipファイルがあり、AESManagedクラスを使用して暗号化したいのですが、そのクラスのzipファイルにパスワードを設定できる場所が見つかりません。調査したところ、「DotNetZip」などのライブラリがタスクを完了できることがわかりました。しかし、私のファイルはすでに.zipであり、再度圧縮する必要はありません。暗号化するだけです。誰でも私がAESManagedクラスを使用して目的を達成するのを手伝ってくれますか?
ありがとう
既存のzipファイルがあり、AESManagedクラスを使用して暗号化したいのですが、そのクラスのzipファイルにパスワードを設定できる場所が見つかりません。調査したところ、「DotNetZip」などのライブラリがタスクを完了できることがわかりました。しかし、私のファイルはすでに.zipであり、再度圧縮する必要はありません。暗号化するだけです。誰でも私がAESManagedクラスを使用して目的を達成するのを手伝ってくれますか?
ありがとう
これがあなたが探しているものかどうかはわかりませんが、ファイルを暗号化するコードを作成しました。
暗号化のコードは次のとおりです。
private void EncryptFile(string inputFile, string outputFile)
{
string password = @"yourPWhere";
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = CreateKey(password);
string cryptFile = outputFile;
FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create);
RijndaelManaged RMCrypto = new RijndaelManaged();
IV = CreateIV(password_mTxtBx.Text);
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateEncryptor(key,IV),
CryptoStreamMode.Write);
FileStream fsIn = new FileStream(inputFile, FileMode.Open);
int data;
while ((data = fsIn.ReadByte()) != -1)
cs.WriteByte((byte)data);
fsIn.Close();
cs.Close();
fsCrypt.Close();
}
復号化機能のコードは次のとおりです。
private void DecryptFile(string inputFile, string outputFile)
{
string password = @"yourPWhere";
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = CreateKey(password);
FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);
RijndaelManaged RMCrypto = new RijndaelManaged();
IV = CreateIV(password_mTxtBx.Text);
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateDecryptor(key, IV),
CryptoStreamMode.Read);
FileStream fsOut = new FileStream(outputFile.Remove(outputFile.Length - 4), FileMode.Create);
int data;
while ((data = cs.ReadByte()) != -1)
fsOut.WriteByte((byte)data);
fsOut.Close();
cs.Close();
fsCrypt.Close();
}
数ヶ月前にcodeprojectで同様のコードを見ました。ですから、それは直接私の仕事ではありません。クレジットは作者に渡されます。
パスワードベースの鍵導出(PBKDF2)で更新:
private static int saltLengthLimit = 32;
private static byte[] GetSalt(int maximumSaltLength)
{
var salt = new byte[maximumSaltLength];
using (var random = new RNGCryptoServiceProvider())
{
random.GetNonZeroBytes(salt);
}
return salt;
}
public static byte[] CreateKey(string password)
{
var salt = GetSalt(10);
int iterationCount = 20000; // Nowadays you should use at least 10.000 iterations
using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterationCount))
return rfc2898DeriveBytes.GetBytes(16);
}
IVの作成者(パスワードから作成):
public byte[] CreateIV(string password)
{
var salt = GetSalt(9);
const int Iterations = 325;
using (var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, Iterations))
return rfc2898DeriveBytes.GetBytes(16);
}
キーのバイト長は私の場合128bit(!)= 16バイト(128/8)ですが、Rijndaelでサポートされている他の長さを使用できます(キー:128、192、256ビット= 16、24、32バイト) 。IVは常に16バイトです!
解凍時に元のzipファイルでパスワードを使用する場合は、ファイルを再圧縮して、パスワードを追加する必要があります。
dotnetzipライブラリのドキュメントからのこのリンクは、そのライブラリを使用してパスワード暗号化で圧縮する簡単な方法を示しています。
セキュリティに関する追加の注意:
暗号化セキュリティにまったく欠陥がある場合は、zip2.0暗号化方式を使用しないでください。代わりに、AES256ビット暗号化を使用してください。
これは、デフォルトレベルの圧縮でdotnetzipライブラリを使用したAES 256ビット暗号化の実装を示すいくつかのサンプルコード(上記のリンクから直接取得)です。
using (ZipFile zip = new ZipFile())
{
zip.AddFile("ReadMe.txt"); // no password for this one
zip.Password= "Cool.Hand.Luke!";
zip.Encryption= EncryptionAlgorithm.WinZipAes256;
zip.AddFile("Rawdata-2008-12-18.csv");
zip.Save("Backup-AES-Encrypted.zip");
}
編集:元のzipファイルに関する説明を追加
編集2:コードを追加
前述のようにDotNetZip(Ionic zip)を使用できます。これは、パスワードの設定をサポートし、ゼロレベルの圧縮を提供します。
using (ZipFile zip = new ZipFile())
{
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.None;
zip.AddFile(@"MyMusic\Messiah-01.mp3");
zip.Save(ZipFileToCreate);
}
したがって、パスワードを設定するだけでオーバーヘッド(すでに圧縮されたファイルを圧縮する)はありません。