【问题标题】:Padding is invalid and cannot be removed in C# licensing method填充无效且无法在 C# 许可方法中删除
【发布时间】:2013-10-03 09:55:14
【问题描述】:

在我的项目中,我正在使用一种许可方法,在用户输入许可密钥后,他的产品将被激活。我使用下面的代码,但我得到一个抛出异常 说“填充无效,无法删除”。以下是我的代码

public void ValidateProductKey()
        {
        RSACryptoServiceProvider _cryptoService = new RSACryptoServiceProvider();
        string productKey = "G7MA4Z5VR5R3LG001AS1N5HA3YHX05";
            byte[] keyBytes = Base32Converter.FromBase32String(productKey); //Base32Converter is my customized method which returns byte of values;

            byte[] signBytes = new byte[2];
            byte[] hiddenBytes = new byte[16];
            using (MemoryStream stream = new MemoryStream(keyBytes))
            {
                stream.Read(hiddenBytes, 0, 8);
                stream.Read(signBytes, 0, 2);
                stream.Read(hiddenBytes, 8, hiddenBytes.Length - 8);
                keyBytes = stream.ToArray();
            }

            byte[] sign = _cryptoService.SignData(signBytes, new SHA1CryptoServiceProvider());
            byte[] rkey = new byte[32];
            byte[] rjiv = new byte[16];
            Array.Copy(sign, rkey, 32);
            Array.Copy(sign, 32, rjiv, 0, 16);

            SymmetricAlgorithm algorithm = new RijndaelManaged();

            try
            {
                hiddenData = algorithm.CreateDecryptor(rkey, rjiv).TransformFinalBlock(hiddenBytes,0,hiddenBytes.Length);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }


        }

当到达“hiddenData”变量时,我得到一个异常,因为“填充无效并且无法删除”。任何帮助将不胜感激。

【问题讨论】:

    标签: c# cryptography licensing rsa


    【解决方案1】:

    您希望通过使用 SHA1/RSA 对您的 signBytes 数组进行签名来生成 Rijndael 解密的密钥和 IV,但是根据您提供的代码,您没有初始化签名中使用的 RSACryptoServiceProvider使用密钥对的过程,因此它将具有随机生成的密钥,因此每次签名过程的结果都会不同。因此,在 Rijndael 解密中使用的密钥/IV 与创建许可证密钥时用于加密 hiddenData 的密钥/IV 不同。

    您使用的方法本身还有许多其他问题,但这超出了您的问题范围。

    【讨论】:

    • 你能告诉我这个方法有什么问题吗?这样我就可以纠正它们。另外,如果您可以指导我使用任何其他方法来验证许可证密钥。
    • 忽略没有完美的许可机制这一事实,那么我们不得不问,是什么提供了您方法的安全性?这里的问题是基本上没有没有安全性。当然,您使用的是 RSA、Rijndael/AES - 在它们各自的类中相当不错的算法,但您使用它们的方式基本上会破坏它们的安全性,因为最终用户(/攻击者)拥有 一切 i> 如果他们知道方法,他们需要创建自己的许可证密钥(使用 Reflector/dotPeek 等可以轻松恢复 .NET,即使您决定对其进行混淆)。
    • 之前我决定获取电脑的硬件签名。但这似乎是一个全新的领域,而且我选择这个选项的时间越少。但是由于我对所有这些密码学都不熟悉,所以我仍然停留在这个过程中并且无法进一步前进。
    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 2016-07-18
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    相关资源
    最近更新 更多