【问题标题】:Hybrid cryptosystem implementation in .net. Error Specified key is not a valid size for this algorithm.net 中的混合密码系统实现。错误 指定的密钥不是此算法的有效大小
【发布时间】:2017-06-24 12:55:14
【问题描述】:

我正在尝试实现https://en.wikipedia.org/wiki/Hybrid_cryptosystem中提到的混合密码系统

目前我已经实现了以下算法

private void button1_Click(object sender, EventArgs e)
        {
            CspParameters cspParams = new CspParameters { ProviderType = 1 };
            RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(1024, cspParams);
            string publicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
            string privateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));
            string symmericKey = "Kamran12";
            txtEncryptedData.Text = EncryptData(txtInputData.Text, symmericKey);
            string encryptedsymmetrickey = EncryptData(symmericKey, publicKey); //error line
            //string decryptsymmetrickey = encryptedsymmetrickey + privateKey;

            //string decrypteddata = encryptedData + decryptsymmetrickey;

        }

        public string EncryptData(string data, string key)
        {
            string encryptedData = null;

            byte[] buffer = Encoding.UTF8.GetBytes(data);

            DESCryptoServiceProvider desCryptSrvckey = new DESCryptoServiceProvider
            {
                Key = new UTF8Encoding().GetBytes(key)
            };
            desCryptSrvckey.IV = desCryptSrvckey.Key;

            using (MemoryStream stmCipherText = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(stmCipherText, desCryptSrvckey.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(buffer, 0, buffer.Length);
                    cs.FlushFinalBlock();


                    encryptedData = Encoding.UTF8.GetString(stmCipherText.ToArray());
                }
            }
            return encryptedData;
        }

但收到错误指定的密钥不是该算法的有效大小。在加密对称密钥时

【问题讨论】:

  • 您的publicKey 大于此加密方法所允许的 64 位。这就是你得到异常的原因。它是 200 字节,即 1600 位。
  • 确实如此,但使用错误的算法/密钥组合使用 RSA“包装”DES 密钥这一事实是潜在的错误。
  • 回滚到上一个版本。这是一个问答网站,不是调试网站。不要使用(部分)解决方案更新您的代码。

标签: c# cryptography encryption-symmetric hybrid encryption-asymmetric


【解决方案1】:

您正在尝试使用带有 RSA 公钥的(不安全的)DES 算法进行加密。那总是会失败,DESCryptoServiceProvider 不接受 RSA 密钥。你需要一个RSACryptoServiceProvider

您可能需要考虑使用已经实现混合加密(PGP、CMS 或专有协议之一)的特定库。您的解决方案最终可能会运行,但它是安全的。

【讨论】:

  • DES 作为密码。啧啧。
  • 您能否建议在当前实施中进行更正。在 github e.t.c 上找不到任何关于混合密码学的东西
  • 我认为这很明显,但我已经调整了答案。除非严格要求,否则不要对字节进行字符串化。字符串非常适合人类可读的文本;无需一直将所有内容都转换为字符串并返回。 DES 密钥应编码为字节。
  • 请注意,对于加密世界来说,有一件事是不同的:目标是让它安全而不是让它工作。你可以有一个像魅力一样“工作”的实现(大多数时候,如果你不走运的话)并且不安全。你需要知道你在做什么来开发加密货币。
  • 请发布一个包含代码的新问题。不要更新这个。请至少接受和/或支持这个答案。
猜你喜欢
  • 1970-01-01
  • 2010-12-22
  • 2011-02-24
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多