从字符串加载字节数组无法正常工作?

Load byte array from string isn't working correctly?

本文关键字:常工作 工作 加载 字符串 字节 字节数 数组      更新时间:2023-10-16

我正在尝试加密一个字符串,将其保存在文件中,然后从文件中读取字符串并解密。但是当我运行代码时,我只是得到"要解密的数据长度无效"错误:/通过调试,我设法发现字节数组(array^ bytes)由于某种原因,当我尝试解密字符串时长度为 12,当我加密字符串时,它的长度为 8。

以下是加密字符串的代码:

String^ EncryptS(){
String^ DecryptedS;
MD5CryptoServiceProvider^ md5Crypt = gcnew MD5CryptoServiceProvider();
UTF8Encoding^ utf8Crypt = gcnew UTF8Encoding();
TripleDESCryptoServiceProvider^ crypt = gcnew TripleDESCryptoServiceProvider();
crypt->Key = md5Crypt->ComputeHash(utf8Crypt->GetBytes("123"));
crypt->Mode = CipherMode::ECB;
crypt->Padding = PaddingMode::PKCS7;
ICryptoTransform^ transCrypt = crypt->CreateEncryptor();    
DecryptedS = utf8Crypt->GetString(transCrypt->TransformFinalBlock(utf8Crypt->GetBytes(form1::passwordTextBox->Text), 0, utf8Crypt->GetBytes(form1::passwordTextBox->Text)->Length));
return DecryptedS; }

这是解密字符串的代码

String^ decryptS(String^ encryptedS){
String^ decryptedS;
array<Byte>^ bytes;
MD5CryptoServiceProvider^ md5Crypt = gcnew MD5CryptoServiceProvider();
UTF8Encoding^ utf8Crypt = gcnew UTF8Encoding();
UTF8Encoding^ utf8ToByte = gcnew UTF8Encoding();
TripleDESCryptoServiceProvider^ crypt = gcnew TripleDESCryptoServiceProvider();
crypt->Key = md5Crypt->ComputeHash(utf8Crypt->GetBytes("123"));
crypt->Mode = CipherMode::ECB;
crypt->Padding = PaddingMode::PKCS7;
ICryptoTransform^ transCrypt = crypt->CreateDecryptor();
bytes = utf8ToByte->GetBytes(encryptedS);
return decryptedS = utf8Crypt->GetString(transCrypt->TransformFinalBlock(bytes, 0, bytes->Length)); }

我一直在尝试在几个小时内解决此问题,但没有成功,将非常感谢帮助:)

对不起,我的英语不好。

您正在尝试使用 UTF-8 将任意字节数组转换为字符串。这就像尝试加载一些随机文本文件,就好像它是JPEG一样,并期望它是一个有效的图像。

仅当字节数组确实是使用该编码进行文本编码时,才应使用Encoding.GetString(byte[])

如果要表示"任意"二进制数据(通常是压缩或加密数据),则应使用 base64 或十六进制,具体取决于您的要求。(Convert.ToBase64StringConvert.FromBase64String是你的朋友。