我试图在Double DES上模拟一次遇见中间攻击,其工作原理如下:
所以我首先通过加密已知的明文m和所有可能的k1值来执行MitM攻击,然后我用一个可能的k2值解密已知的密文c。然后应该有一个匹配,给我k1和k2。我使用20位的缩减密钥而不是56位(或64位,这是DES实现实际上想要的输入)。我只是在20位后用零填充。
我已经实施了我认为正确的解决方案但没有获得任何匹配。
我的两个哈希表:
Dictionary<string, string> hashTable = new Dictionary<string, string>();
Dictionary<string, string> matches = new Dictionary<string, string>();
加密:
由于我使用的是减少的20位密钥,因此可以有2个 20 不同的20位组合。因此,对于每次迭代,我取计数器i
,将其转换为二进制字符串表示,然后填充0,直到它产生64位二进制值。然后我将此字符串转换为字节数组并使用密钥加密明文。我将key
中的hashTable
和用于获取该密码的实际密钥存储为value
。
//First generate all possible intermediary values
for(int i=0; i< Math.Pow(2,20); i++)
{
string key1 = ToBin(i, 20);
string paddedKey1 = ToBin(i, 20).PadRight(64, '0');
//First encryption of plaintext1 using key1
string intermediaryCipher =
DESWrapper.DES_Encrypt(plaintext1, ConvertBinaryStringToByteArray(paddedKey1));
hashTable.Add(intermediaryCipher, key1);
//Show the current iteration in binary
Console.WriteLine(ToBin(i, 20));
}
DESWrapper.DES_Encrypt方法:
public static string DES_Encrypt(string input, byte[] key)
{
DESCryptoServiceProvider desCryptoService = new DESCryptoServiceProvider();
//Reflection necessary otherwise it complains about a weak key, so bypassing that check
MethodInfo mi = desCryptoService.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
object[] Par = { key, desCryptoService.Mode, key, desCryptoService.FeedbackSize, 0 };
ICryptoTransform trans = mi.Invoke(desCryptoService, Par) as ICryptoTransform;
byte[] resultArray = trans.TransformFinalBlock(Encoding.Default.GetBytes(input), 0, Encoding.Default.GetBytes(input).Length);
desCryptoService.Clear();
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
加密后,我有一个hastable,有2个 20 条目。我接下来要做的就是解密:
解密:
当我使用当前的填充密钥解密ciphertext1
时,结果(如果是正确的密钥)将是hashTable
中已存在的中间密码{{1} 1}}。所以我执行此查找。如果存在,我将两个密钥保存到另一个哈希表Key
。如果它不存在,我继续前进。
matches
DESWrapper.DES_Decrypt:
for (int i = 0; i < Math.Pow(2, 20); i++)
{
string key2 = ToBin(i, 20);
string paddedKey2 = ToBin(i, 20).PadRight(64, '0');
//Decrypting ciphertext1 with key2 (64bit padded)
string intermediaryCipher =
DESWrapper.DES_Decrypt(ciphertext1, ConvertBinaryStringToByteArray(paddedKey2));
var temp = hashTable.FirstOrDefault(x => x.Key == intermediaryCipher);
if(temp.Key != null)
{
matches.Add(temp.Value, key2);
Console.WriteLine("Found match!");
Console.ReadKey();
}
//Show the current iteration in binary
Console.WriteLine(ToBin(i, 20));
}
问题:
我永远不会得到匹配,因此哈希表查找总是返回一个空的键值对。我不明白为什么。最终它应该匹配,但它没有。
问题可能与我试图查找public static string DES_Decrypt(string input, byte[] key)
{
DESCryptoServiceProvider desCryptoService = new DESCryptoServiceProvider();
//Again have to use reflection..
MethodInfo mi = desCryptoService.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
object[] Par = { key, desCryptoService.Mode, key, desCryptoService.FeedbackSize, 0 };
ICryptoTransform trans = mi.Invoke(desCryptoService, Par) as ICryptoTransform;
byte[] resultArray = trans.TransformFinalBlock(Encoding.Default.GetBytes(input), 0, Encoding.Default.GetBytes(input).Length);
desCryptoService.Clear();
return Convert.ToBase64String(resultArray);
}
中的值有关吗?
其他信息:
要加密初始明文和密文,我使用一个伪装的密钥,第17位设置为1,所有其他63位设置为0.这对两个密钥都有效。
通过这种方式,当我进行解密时,我应该很快得到匹配,但我不确定问题是否在这里。无论如何包括代码:
hashTable