2016-11-03 76 views
0

首先,我意識到有幾十個其他帖子可以解答這個問題,我已經閱讀並嘗試了所有這些帖子。我似乎仍然無法解決這個問題,所以我正在尋找一些對加密知識比我更瞭解的人的幫助。其次,我將要分享的代碼是遺留的,因爲我不是一個加密專家,它仍然不是百分之百地清楚一切意味着什麼。這可能是部分或全部代碼是完全垃圾,應該廢棄;然而,還有很多其他系統已經在使用它,並且存儲了經過此代碼的加密值。改變像加密算法這樣的東西在這一點上並不完全是一種選擇。這就是說,私有方法是遺留代碼以及測試值(即加密密鑰)都是不能改變的東西。這兩種公共靜態方法是新的,可能導致問題,但我似乎無法弄清楚。解密期間「填充無效且無法刪除」

在與代碼......

class Program 
{ 
    public static string Encrypt(string key, string toEncrypt) 
    { 
     var keyArray = Convert.FromBase64String(key); 
     var info = Encoding.ASCII.GetBytes(toEncrypt); 

     var encrypted = Encrypt(keyArray, info); 

     return Encoding.ASCII.GetString(encrypted); 
    } 

    public static string Decrypt(string key, string cipherString) 
    { 
     var keyArray = Convert.FromBase64String(key); 
     var cipherText = Encoding.ASCII.GetBytes(cipherString); 

     var decrypted = Decrypt(keyArray, cipherText); 

     return Encoding.ASCII.GetString(decrypted); 
    } 

    private static byte[] Encrypt(byte[] key, byte[] info) 
    { 
     using (var cipher = Aes.Create()) 
     { 
      cipher.Key = key; 
      cipher.Mode = CipherMode.CBC; 
      cipher.Padding = PaddingMode.ISO10126; 

      using (var ms = new MemoryStream()) 
      { 
       using (var cs = new CryptoStream(ms, cipher.CreateEncryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(info, 0, info.Length); 
       } 

       var ciphertext = ms.ToArray(); 

       var message = new byte[cipher.IV.Length + ciphertext.Length]; 
       cipher.IV.CopyTo(message, 0); 
       ciphertext.CopyTo(message, cipher.IV.Length); 
       return message; 
      } 
     } 
    } 

    private static byte[] Decrypt(byte[] key, byte[] ciphertext) 
    { 
     using (var cipher = Aes.Create()) 
     { 
      cipher.Key = key; 
      cipher.Mode = CipherMode.CBC; 
      cipher.Padding = PaddingMode.ISO10126; 

      var ivSize = cipher.IV.Length; 
      var iv = new byte[ivSize]; 
      Array.Copy(ciphertext, iv, ivSize); 
      cipher.IV = iv; 

      var data = new byte[ciphertext.Length - ivSize]; 
      Array.Copy(ciphertext, ivSize, data, 0, data.Length); 

      using (var ms = new MemoryStream()) 
      { 
       using (var cs = new CryptoStream(ms, cipher.CreateDecryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(data, 0, data.Length); 
       } 

       return ms.ToArray(); 
      } 
     } 
    } 

    static void Main(string[] args) 
    { 
     var newEncryptionKey = Guid.NewGuid().ToString().Replace("-", string.Empty); 

     var encryptedValue = Encrypt(newEncryptionKey, "test"); 

     Console.WriteLine($"New encrypted value: {encryptedValue}"); 

     var decryptedValue = Decrypt(newEncryptionKey, encryptedValue); 

     Console.WriteLine($"New decrypted value: {decryptedValue}"); 
    } 
} 

所以它就在那裏。基本上,我試圖使用「測試」的測試字符串並使用GUID作爲密鑰對其進行加密。再一次,我沒有選擇這個密鑰,並且已經使用GUID作爲密鑰的加密值,所以如果可能的話我不能改變它。加密工作正常,但是當我去做解密時,我會在這個問題的標題中看到例外。

任何幫助將非常感激。

回答

1

您不能只將密文的byte[]轉換爲ASCII。它不這樣工作。字符編碼是可怕的野獸,如果你不瞭解它們,就不應該混淆。我不認爲這是活着的一個真實的人,做;)

什麼你應該反而是回到你的結果爲base64,這仍然是ASCII字符集,但它們是安全,可以左右移動,一個字符串,並且不會導致任何字符的丟失。

見下面的修改後的代碼:

public static string Encrypt(string key, string toEncrypt) 
{ 
    var keyArray = Convert.FromBase64String(key); 
    var info = Encoding.ASCII.GetBytes(toEncrypt); 

    var encrypted = Encrypt(keyArray, info); 

    return Convert.ToBase64String(encrypted); 
} 

public static string Decrypt(string key, string cipherString) 
{ 
    var keyArray = Convert.FromBase64String(key); 
    var cipherText = Convert.FromBase64String(cipherString); 

    var decrypted = Decrypt(keyArray, cipherText); 

    return Encoding.ASCII.GetString(decrypted); 
} 
+0

燁。我完全承認我是一個完全新手。我繼承了這些代碼,原來寫這個代碼的人已經不在身邊了。非常感謝您的解釋和幫助。它現在完美。 – meyousikmann

+0

@meyousikmann必須從某處學習。樂於幫助。 –

相關問題