混合密码学。要解密的数据长度无效 [英] Hybrid cryptography. Length of the data to decrypt is invalid
问题描述
我在混合加密实现中遇到上述错误。
按照 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屋!