2014-02-20 45 views
0

因此,我使用矩陣構建了自己的(玩具)加密算法。程序應該用密鑰加密明文,然後問你密鑰並打印出解密後的明文。一切都很好,直到C#程序從密鑰中生成「密鑰矩陣」來解密密碼。請注意,它第一次從鍵中生成「鍵矩陣」,但它第二次凍結是可以的。這是代碼。我的C#程序試圖解密我自己的密碼時會凍結

using System; 

namespace MatrixEncryption 
{ 
    class MainClass 
    { 
     public static void Main (string[] args) 
     { 
      Console.WriteLine("Enter a relatively short piece of text:"); 
      string txt = Console.ReadLine(); 
      txt += "L"; 
      Console.WriteLine("Enter an encryption key:"); 
      string ekey = Console.ReadLine(); 
      int times = 0; 
      while(true) 
      { 
       if(txt.Length + 1 < (Math.Pow((double)ekey.Length,(double)times))) break; 
       times++; 
      } 
      times++; 
      Console.WriteLine(times); 
      Matrix keym = new Matrix(ekey.Length^times, ekey.Length^times); 
      string res = ekey; 
      for(int i = 0; i<times - 1; i++) 
      { 
       res = GetCharRep(GenMatrix(res)); 
      } 
      keym = GenMatrix(res); 
      Console.WriteLine(keym.cols + ":" + keym.rows); 
      Matrix passm = new Matrix(keym.rows, keym.cols); 
      int unicnt = 0; 
      Random a = new Random(); 
      for(int i = 0; i<(keym.rows); i++) 
      { 
       for(int j = 0; j<(keym.cols); j++) 
       { 
        if(unicnt == 0) 
        { 
         passm[i, j] = (byte)txt.Length; 
         unicnt++; 
         continue; 
        } 
        if(unicnt < txt.Length) 
        { 
         passm[i, j] = (byte)txt[unicnt - 1]; 
        } 
        else 
        { 
         int aa = a.Next(); 
         passm[i, j] = (byte)(aa % byte.MaxValue); 
        } 
        unicnt++; 
       } 
      } 
      Matrix cipherm = new Matrix(keym.rows, keym.cols); 
      Matrix TwoMatrix = new Matrix(cipherm.rows, cipherm.cols); 
      for(int i = 0; i<TwoMatrix.rows; i++) 
      { 
       for(int j = 0; j<TwoMatrix.cols; j++) 
       { 
        TwoMatrix[i, j] = 2; 
       } 
      } 
      cipherm = NotMul(passm + TwoMatrix, keym + TwoMatrix); 
      Console.WriteLine("Enciphered text : " + GetCharRep(cipherm)); 
      Console.WriteLine("Enter key now to check if decryptable cipher : "); 
      string keyy = Console.ReadLine(); 
      int timesx = cipherm.cols; 
      double aaa = (double)timesx; 
      double bbb = (double)keyy.Length; 
      timesx = (int)Math.Log(aaa, bbb); 
      Matrix keymx = new Matrix(timesx, timesx); 
      string resss = keyy; 
      for(int i = 0; i<timesx; i++) 
      { 
       resss = GetCharRep(GenMatrix(resss)); 
      } 
      keymx = GenMatrix(resss); 
      if(keymx != keym) 
      { 
       Console.WriteLine("STUPID COMPUTER xD"); 
       Console.WriteLine(cipherm.cols.ToString() + ":" + cipherm.rows.ToString()); 
      } 
      Matrix ress = new Matrix(keymx.rows, keymx.cols); 
      keymx = keymx + TwoMatrix; 
      ress = NotDiv(cipherm, keymx); 
      ress = ress - TwoMatrix; 
      Console.WriteLine(GetCharRep(ress).Substring(0, (int)(ress[0, 0]))); 
     } 
     public static Matrix NotMul(Matrix m1, Matrix m2) 
     { 
      Matrix result = Matrix.ZeroMatrix(m1.cols, m1.rows); 
      for(int i = 0; i<m1.rows; i++) 
      { 
       for(int j = 0; j<m2.cols; j++) 
       { 
        result[i, j] = (m1[i, j] * m2[i, j]); 
       } 
      } 
      return result; 
     } 
     public static Matrix NotDiv(Matrix m1, Matrix m2) 
     { 
         Matrix result = Matrix.ZeroMatrix(m1.cols, m1.rows); 
      for(int i = 0; i<m1.rows; i++) 
      { 
       for(int j = 0; j<m2.cols; j++) 
       { 
        result[i, j] = m1[i, j] * (1/m2[i, j]); 
       } 
      } 
      return result; 
     } 
     public static Matrix GenMatrix(string key) 
     { 
      Matrix ret = new Matrix(key.Length, key.Length); 
      for(int i = 0; i<key.Length; i++) 
      { 
       for(int j = 0; j<key.Length; j++) 
       { 
        ret[i, j] = (byte)(Math.Pow((double)key[i], (double)key[j]) % byte.MaxValue); 
       } 
      } 
      return ret; 
     } 
     public static string GetCharRep(Matrix INM) 
     { 
      string ret = ""; 
      for(int i = 0; i<INM.rows; i++) 
      { 
       for(int j = 0; j<INM.cols; j++) 
       { 
        ret += (char)((byte)INM[i, j] % byte.MaxValue); 
       } 
      } 
      return ret; 
     } 
    } 
} 

,爲了說明一點: 1.基類是從互聯網上挖洞,是太大而不能放在這裏。 2.解釋加密算法:

不久就會發生的是,代碼會生成兩個矩陣,一個來自明文,另一個來自密鑰(您可以猜測代碼是如何產生的)。 然後它將密鑰和明文的每個元素相乘(NOT MATRIX MULITIPLICATION JUST EACH ELEMENT)算法也涉及隨機數字e.t.c.但我在這裏相信的問題是,把鑰匙變成'鑰匙矩陣'的過程不會在第二次正確地重複。無論如何,我不知道一個好的解決方案,所以請幫助。

+0

只是一個評論 - 它有效之前我調整了算法一點點 –

+2

如果你有一個非常相似的版本工作,那麼最簡單的故障排除方法可能是比較工作版本與新的「調整」版本。例如,您可以一次添加一個「調整」,直到它中斷,然後進入該代碼的那一部分。保存當前代碼的單獨副本,然後使用CTRL-Z返回之前進行比較的工作。您在這裏提供的信息不足以讓我們推測答案。 –

+0

我擔心如果我把所有的信息都放在這裏,可能需要太多的時間來適應xD。 –

回答

0

好了,我解決了第一部分,它不是凍結更多的我只是改變了

for(int i = 0; i<times - 1; i++) 
    { 
     res = GetCharRep(GenMatrix(res)); 
    } 

for(int i = 0; i<times - 2; i++) 
    { 
     res = GetCharRep(GenMatrix(res)); 
    } 

但此時ress矩陣和尺寸TwoMatrix矩陣不匹配。

+1

有時候比問一下更好:您是否瞭解斷點,調試模式以及在Visual Studio中逐行執行代碼?如果不是這樣,那麼在Google中快速搜索這些術語應該會找到詳細的說明或教程。 –

+0

好吧,我解決了它我只需要更正時間x –

+0

我的問題似乎總是得不到答案D:幾乎從來沒有人真的看過他們。 D:D:D:D:D:) - : –

相關問題