我有一个现有的zip文件,我想使用AESManaged类加密它,但我找不到我可以在该类中设置zip文件的密码。经过研究,我发现一些像'DotNetZip'这样的图书馆可以完成任务。但我的文件已经是.zip了,我不需要再次压缩,我只想加密它。任何人都可以帮助我使用AESManaged类达到目的吗?
由于
答案 0 :(得分:4)
我不知道这是否是您正在寻找的,但我创建了一个加密任何文件的代码。
以下是加密器的代码:
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);
}
密钥的字节长度在我的情况下是128位(!)= 16字节(128/8),但您可以使用Rijndael支持的任何其他长度(密钥:128,192,256位= 16,24, 32个字节)。 IV总是16个字节!
答案 1 :(得分:1)
如上所述,您可以使用DotNetZip (Ionic zip),它支持设置密码,提供零级压缩:
using (ZipFile zip = new ZipFile())
{
zip.CompressionLevel = Ionic.Zlib.CompressionLevel.None;
zip.AddFile(@"MyMusic\Messiah-01.mp3");
zip.Save(ZipFileToCreate);
}
因此,您只需设置密码就没有开销(压缩已经压缩的文件)。
答案 2 :(得分:1)
如果要在解压缩时在原始zip文件中使用密码,则需要重新压缩文件并在执行此操作时添加密码。
来自dotnetzip库文档的This link显示了使用该库进行密码加密压缩的简便方法。
关于安全性的补充说明:
如果您完全关心加密安全性,请不要使用zip 2.0加密方法,因为它存在很大缺陷。而是使用AES 256位加密。
以下是一些示例代码(直接从上面的链接中提取),显示了使用带有默认级别压缩的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:添加代码