2016-11-03 47 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必须从某处学习。乐于帮助。 –

相关问题