【发布时间】:2016-11-15 15:23:21
【问题描述】:
我还在学习密码学。我正在尝试在 C# 中创建一个简单的静态函数,将字符串加密为 DES(使用 Base64 输出)。我了解到 DES 使用 8 字节作为其密钥。我希望用户输入任意长度的字符串,将其作为密钥加密消息,然后将其转换为 Base64。示例在此site。
public static string EncryptDES(string phrase, string key)
{
string encrypted = "";
byte[] phraseBytes = System.Text.ASCIIEncoding.ASCII.GetBytes(phrase);
byte[] keyBytes = System.Text.Encoding.UTF8.GetBytes(key);
System.Security.Cryptography.MD5CryptoServiceProvider hashMD5Provider
= new System.Security.Cryptography.MD5CryptoServiceProvider();
System.Security.Cryptography.DESCryptoServiceProvider provider
= new System.Security.Cryptography.DESCryptoServiceProvider();
provider.Mode = System.Security.Cryptography.CipherMode.CBC;
System.Security.Cryptography.ICryptoTransform transform
= provider.CreateEncryptor(keyBytes, keyBytes);
System.Security.Cryptography.CryptoStreamMode mode
= System.Security.Cryptography.CryptoStreamMode.Write;
System.IO.MemoryStream memStream = new System.IO.MemoryStream();
System.Security.Cryptography.CryptoStream cryptoStream
= new System.Security.Cryptography.CryptoStream(memStream, transform, mode);
cryptoStream.Write(phraseBytes, 0, phraseBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] encryptedMessageBytes = new byte[memStream.Length];
memStream.Position = 0;
memStream.Read(encryptedMessageBytes, 0, encryptedMessageBytes.Length);
encrypted = System.Convert.ToBase64String(encryptedMessageBytes);
return (encrypted);
} // private static string EncryptDES(string phrase, string key) { }
然后在 Main 中这样调用它:
SimpleEncryption.EncryptDES("A message regarding some secure 512-bit encryption", "AnUltimatelyVeryVeryLongPassword");
当用户输入一个随机数的字符串长度(大于或小于 8 个字符)时,此行总是发生密码学异常:
System.Security.Cryptography.ICryptoTransform transform = provider.CreateEncryptor(keyBytes, keyBytes);
上面写着Specified key is not a valid size for this algorithm.
删除部分密钥以适应 8 个字符的长度(带或不带散列)似乎不是一个安全的解决方案(可能存在很高的冲突率)。
如何使用用户输入字符串实现 DES(不是 3DES)?
【问题讨论】:
-
你看过
LegalKeySizes属性吗? msdn.microsoft.com/en-us/library/… -
是的。我知道 DES 使用 64 位长密钥,但我们如何让用户输入的密码与用于加密字符串的密钥相匹配?
-
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); Console.WriteLine("DESCryptoServiceProvider"); ks = des.LegalKeySizes; foreach (KeySizes k in ks) { Console.WriteLine("\tLegal min key size = " + k.MinSize); Console.WriteLine("\tLegal 最大密钥大小 = " + k.MaxSize); }
-
其实我用的是CodeProject网站上的一个库。
标签: c# encryption des