【问题标题】:Hybrid cryptography. Length of the data to decrypt is invalid混合密码学。要解密的数据长度无效
【发布时间】:2017-02-08 10:12:38
【问题描述】:

我在混合加密实施过程中遇到上述错误。

根据https://en.wikipedia.org/wiki/Hybrid_cryptosystem

我只是卡在最后一步

我的代码是

 private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                CspParameters cspParams = new CspParameters { ProviderType = 1 };
                RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(2048, cspParams);
                string publicKey =lblPublicKey.Text = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
                string privateKey = lblPrivateKey.Text= Convert.ToBase64String(rsaProvider.ExportCspBlob(true));
                string symmericKey = txtBoxSymmetricKey.Text = "Kamran12";
                txtEncryptedData.Text = EncryptData(txtInputData.Text, symmericKey);
                txtBoxEncryptedSymmetricKey.Text = RSA_Encrypt(symmericKey, publicKey);



                txtBoxDescryptedSymmetricKey.Text = RSA_Decrypt(txtBoxEncryptedSymmetricKey.Text, privateKey);
                txtDecryptedData.Text = DecryptData(txtEncryptedData.Text, txtBoxDescryptedSymmetricKey.Text); //getting error length of the data to decrypt is invalid
            }
            catch (Exception exc)
            {

            }

        }

        public static string RSA_Decrypt(string encryptedText, string privateKey)
        {
            CspParameters cspParams = new CspParameters { ProviderType = 1 };
            RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams);
            rsaProvider.ImportCspBlob(Convert.FromBase64String(privateKey));
            var buffer = Convert.FromBase64String(encryptedText);
            byte[] plainBytes = rsaProvider.Decrypt(buffer, false);
            string plainText = Encoding.UTF8.GetString(plainBytes, 0, plainBytes.Length);
            return plainText;
        }

        public static string RSA_Encrypt(string data, string publicKey)
        {
            CspParameters cspParams = new CspParameters { ProviderType = 1 };
            RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams);
            rsaProvider.ImportCspBlob(Convert.FromBase64String(publicKey));
            byte[] plainBytes = Encoding.UTF8.GetBytes(data);
            byte[] encryptedBytes = rsaProvider.Encrypt(plainBytes, false);
            return Convert.ToBase64String(encryptedBytes);
        }



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

        public string DecryptData(string data, string key)
        {

            byte[] encryptedMessageBytes = Encoding.UTF8.GetBytes(data);
            string decryptedData = null;
            DESCryptoServiceProvider desCryptSrvckey = new DESCryptoServiceProvider
            {
                Key = new UTF8Encoding().GetBytes(key)
            };
            desCryptSrvckey.IV = desCryptSrvckey.Key;
            using (MemoryStream encryptedStream = new MemoryStream(encryptedMessageBytes))
            {
                using (
                    CryptoStream cs = new CryptoStream(encryptedStream, desCryptSrvckey.CreateDecryptor(),
                        CryptoStreamMode.Read))
                {
                    using (StreamReader sr = new StreamReader(cs))
                    {
                        decryptedData = sr.ReadToEnd();
                    }
                }
            }
            return decryptedData;
        }

【问题讨论】:

  • 我猜你将空字符串传递给解密
  • 不,它不是空的。你可以试试代码
  • 新工作不要使用DES,它不再安全,使用AES(高级加密标准),不再难用。 IV不要使用密钥,而是使用随机IV,只需在加密数据前加上IV用于解密即可,不需要不保密。
  • 除非您有一个令人信服的理由来使用公钥/私钥对,否则请使用对称密钥加密,例如 AES。
  • 是的,我有一些理由。查看我的两个帖子 stackoverflow.com/questions/42060925/…stackoverflow.com/questions/42087158/… 了解详细信息,因为我需要按照很多人的建议实现混合密码逻辑

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


【解决方案1】:

您将encryptedData 声明为字符串。这是不正确的。您的加密数据是字节,而不是字符串。尝试将原始字节转换为 UTF-8 文本,如 encryptedData = Encoding.UTF8.GetString(stmCipherText.ToArray()); 将不会产生 UTF-8 文本,但会产生垃圾并可能丢失数据。

如果您希望加密输出为文本,则获取密文字节并使用Convert.ToBase64String() 将它们转换为文本字符串。

解密时,将Base64字符串转回字节并解密。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2011-12-05
    相关资源
    最近更新 更多