【问题标题】:"Padding is invalid and cannot be removed" during decryption解密时出现“填充无效,无法移除”
【发布时间】:2016-11-04 06:57:38
【问题描述】:

首先,我意识到还有许多其他帖子可以回答这个问题,我已经阅读并尝试了所有帖子。我似乎仍然无法解决这个问题,所以我正在寻求比我更了解加密货币的人的帮助。

其次,我要分享的代码是遗留代码,因为我不是加密专家,所以仍然不是 100% 清楚一切的含义。可能部分或全部代码完全是垃圾,应该废弃;但是,有很多其他系统已经在使用它,并且已经存储了经过此代码的加密值。在这一点上,改变加密算法之类的东西并不完全是一种选择。话虽如此,私有方法是遗留代码以及测试值(即加密密钥)都是无法更改的东西。这两个公共静态方法是新的,可能会导致问题,但我似乎无法弄清楚。

开启代码......

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}");
    }
}

原来如此。基本上,我正在尝试使用“test”的测试字符串并使用 GUID 作为密钥对其进行加密。同样,我没有选择此密钥,并且已经使用 GUID 作为密钥的加密值,因此如果可能的话,我无法更改它。加密工作正常,但是当我去解密时,我得到了这个问题标题中提到的异常。

任何帮助将不胜感激。

【问题讨论】:

    标签: c# encryption


    【解决方案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);
    }
    

    【讨论】:

    • 是的。我完全承认我在这方面完全是新手。我继承了这段代码,而最初编写它的人已经不在了。非常感谢您的解释和帮助。现在完美运行。
    猜你喜欢
    • 2012-05-24
    • 2016-11-15
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多