混合密码学。要解密的数据长度无效 [英] Hybrid cryptography. Length of the data to decrypt is invalid

查看:117
本文介绍了混合密码学。要解密的数据长度无效的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在混合加密实现中遇到上述错误。



按照 https://en.wikipedia.org/wiki/Hybrid_cryptosystem



我只是停留在最后一步

我的代码是

  private void button1_Click(对象发送者,EventArgs e) 
{
试试
{
CspParameters cspParams = new CspParameters {ProviderType = 1};
RSACryptoServiceProvider rsaProvider =新的RSACryptoServiceProvider(2048,cspParams);
字符串publicKey = lblPublicKey.Text = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
字符串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); //获取要解密的数据的错误长度无效
}
catch(异常排除)
{

}

}

公共静态字符串RSA_Decrypt(字符串cryptoText,字符串privateKey)
{
CspParameters cspParams = new CspParameters {ProviderType = 1};
RSACryptoServiceProvider rsaProvider =新的RSACryptoServiceProvider(cspParams);
rsaProvider.ImportCspBlob(Convert.FromBase64String(privateKey));
var缓冲区= Convert.FromBase64String(encryptedText);
byte [] plainBytes = rsaProvider.Decrypt(buffer,false);
string plainText = Encoding.UTF8.GetString(plainBytes,0,plainBytes.Length);
返回plainText;
}

公共静态字符串RSA_Encrypt(字符串数据,字符串publicKey)
{
CspParameters cspParams = new CspParameters {ProviderType = 1};
RSACryptoServiceProvider rsaProvider =新的RSACryptoServiceProvider(cspParams);
rsaProvider.ImportCspBlob(Convert.FromBase64String(publicKey));
byte [] plainBytes = Encoding.UTF8.GetBytes(data);
byte [] encryptionBytes = rsaProvider.Encrypt(plainBytes,false);
返回Convert.ToBase64String(encryptedBytes);
}



公用字符串EncryptData(字符串数据,字符串密钥)
{
string encryptionData = null;
byte [] buffer = Encoding.UTF8.GetBytes(data);
DESCryptoServiceProvider desCryptSrvckey =新的DESCryptoServiceProvider
{
键=新的UTF8Encoding()。GetBytes(key)
};
desCryptSrvckey.IV = desCryptSrvckey.Key;
使用(MemoryStream stmCipherText = new MemoryStream())
{
使用(CryptoStream cs = new CryptoStream(stmCipherText,desCryptSrvckey.CreateEncryptor(),CryptoStreamMode.Write))
{
cs.Write(buffer,0,buffer.Length);
cs.FlushFinalBlock();


加密数据= Encoding.UTF8.GetString(stmCipherText.ToArray());
}
}
返回encryptedData;
}

公共字符串DecryptData(字符串数据,字符串密钥)
{

byte [] encryptionMessageBytes = Encoding.UTF8.GetBytes(data);
字符串decryptedData = null;
DESCryptoServiceProvider desCryptSrvckey =新的DESCryptoServiceProvider
{
键=新的UTF8Encoding()。GetBytes(key)
};
desCryptSrvckey.IV = desCryptSrvckey.Key;
使用(MemoryStream encryptionStream = new MemoryStream(encryptedMessageBytes))
{
使用(
CryptoStream cs = new CryptoStream(encryptedStream,desCryptSrvckey.CreateDecryptor(),
CryptoStreamMode。读取))
{
使用(StreamReader sr = new StreamReader(cs))
{
unlockedData = sr.ReadToEnd();
}
}
}
返回解密数据;
}


解决方案

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



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



解密时,将Base64字符串转换回字节并解密字节。 / p>

I am getting above mentioned error during a hybrid cryptography implementation.

as per https://en.wikipedia.org/wiki/Hybrid_cryptosystem

I am just stucked at the last step

My code is

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

解决方案

You declare encryptedData as a string. This is incorrect. Your encrypted data is bytes, not a character string. Attempting to convert raw bytes to UTF-8 text, as in encryptedData = Encoding.UTF8.GetString(stmCipherText.ToArray()); will not result in UTF-8 text but give you garbage and possibly lose data.

If you want the output from your encryption to be as text, then take the cyphertext bytes and use Convert.ToBase64String() to turn them into a text string.

When decrypting, convert the Base64 string back into bytes and decrypt the bytes.

这篇关于混合密码学。要解密的数据长度无效的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆