字典键查找的问题。应该有

时间:2015-06-23 00:27:15

标签: c# dictionary encryption hashtable des

我试图在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

0 个答案:

没有答案