我无法理解我在互联网上找到的以下加密代码。任何人都可以帮助我理解每个代码行中发生的事情,以便清楚地了解这段代码的实际工作方式吗?
private static void Encrypt(string inputPath, string outputPath) {
string EncryptionKey = "Key";
using (Aes encryptor = Aes.Create()) {
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (FileStream fsOutput = new FileStream(outputfilePath, FileMode.Create)) {
using (CryptoStream cs = new CryptoStream(fsOutput, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) {
using (FileStream fsInput = new FileStream(inputPath, FileMode.Open)) {
int data;
while ((data = fsInput.ReadByte()) != -1) {
cs.WriteByte((byte)data);
}
}
}
}
}
}
谢谢。
发布于 2018-09-10 10:44:23
Rfc2898DeriveBytes用于将密码转换为加密密钥,然后加密密钥可用于使用您最喜欢的对称加密算法加密数据(请使用AES,而不是不安全的DES)。
你发现这个代码做错了,并且有很多问题。但在我列举问题之前,要明白什么是正确的做事方式。密码是人类使用的密钥,密钥是密码学所需要的。密码是低熵,密钥应该是高熵以防止暴力。我们无法将低熵事物转化为高熵事物,但我们能做的是减慢对低熵事物的强力搜索。这就是Rfc2898DeriveBytes的全部目的:要慢,所以密码不能强行强制。
安全使用此功能还有另一个要求:如果两次使用相同的密码,则不应该两次获得相同的加密密钥。为了满足这一要求,使用盐。硬编码盐会破坏目的:它意味着相同的密码将始终产生相同的加密密钥。
所以这段代码的问题包括:
EncryptionKey
)。实际上,EncryptionKey
即使将密码命名为加密密钥,也是密码。0x49, 0x76, ...
)。顺便说一句,盐是某人名字的ascii值:“Ivan Medvedev”。好,这个可怕的代码的作者将他的名字永久地烧成了它!请参阅Top 10 Developer Crypto Mistakes中的第 1,2,4和6点。
https://stackoverflow.com/questions/-100002588
复制相似问题