c++ - 如何解密加密文本?

标签 c++ visual-studio-2010 c++-cli

我找到了允许我加密和解密文本的代码:

cipherData = textBox2->Text;
plainbytes = Encoding::ASCII->GetBytes(cipherData);

plainKey = Encoding::ASCII->GetBytes("0123456789abcdef");

desObj->Key = plainKey;

desObj->Mode = CipherMode::CBC;

desObj->Padding = PaddingMode::PKCS7;

MemoryStream^ ms = gcnew MemoryStream();
CryptoStream^ cs = gcnew CryptoStream(ms,desObj->CreateEncryptor(),CryptoStreamMode::Write);

cs->Write(plainbytes,0,plainbytes->Length);
cs->Close();

chipherbytes = ms->ToArray();
ms->Close();

textBox3->Text = Encoding::ASCII->GetString(chipherbytes);

//decripto
     
MemoryStream^ ms1 = gcnew MemoryStream(chipherbytes);
CryptoStream^ cs1 = gcnew CryptoStream(ms1,desObj->CreateDecryptor(),CryptoStreamMode::Read);

cs1->Read(chipherbytes,0,chipherbytes->Length);
plainbytes2 = ms1->ToArray();
cs1->Close();
ms1->Close();

textBox4->Text = Encoding::ASCII->GetString(plainbytes2);

它非常完美并且运行良好。问题是我希望从 ASCII 而不是从 MemoryStream 开始解密以前的加密文本。

我试过这样的代码:

cipherData = textBox2->Text;
plainbytes = Encoding::ASCII->GetBytes(cipherData);

plainKey = Encoding::ASCII->GetBytes("0123456789abcdef");

desObj->Key = plainKey;

desObj->Mode = CipherMode::CBC;

desObj->Padding = PaddingMode::PKCS7;

MemoryStream^ ms = gcnew MemoryStream();
CryptoStream^ cs = gcnew CryptoStream(ms,desObj->CreateEncryptor(),CryptoStreamMode::Write);

cs->Write(plainbytes,0,plainbytes->Length);
cs->Close();

chipherbytes = ms->ToArray();
ms->Close();

textBox3->Text = Encoding::ASCII->GetString(chipherbytes);

//DECRYPTION CODE
     

cipherData = textBox3->Text;
chipherbytes = Encoding::ASCII->GetBytes(cipherData);
     
MemoryStream^ ms1 = gcnew MemoryStream(chipherbytes);
CryptoStream^ cs1 = gcnew CryptoStream(ms1,desObj->CreateDecryptor(),CryptoStreamMode::Read);

cs1->Read(chipherbytes,0,chipherbytes->Length);
plainbytes2 = ms1->ToArray();
cs1->Close();
ms1->Close();

textBox4->Text = Encoding::ASCII->GetString(plainbytes2);

但是当我尝试代码时,我收到了这个错误:

An unhandled exception of type 'System.Security.Cryptography.CryptographicException' occurred in mscorlib.dll

Additional Information: The padding is invalid and can not be removed.

编辑 1:

我关闭了 wordwrap 属性,现在我收到一个新错误:

Eccezione non gestita di tipo 'System.Security.Cryptography.CryptographicException' in >mscorlib.dll Informazioni aggiuntive: Lunghezza dei dati da decrittografare non valida.

(An unhandled exception of type 'System.Security.Cryptography.CryptographicException' >occurred in mscorlib.dll Additional information: Length of the data to decrypt is invalid.)

最佳答案

已解决

我使用System::Convert::ToBase64String将密文正确写入文本框,避免数据丢失;然后我使用 System::Convert::FromBase64String 从文本框中加载文本

         //ENCRYPTION CODE

         cipherData = textBox2->Text;
         plainbytes = Encoding::Unicode->GetBytes(cipherData);

         plainKey = Encoding::Unicode->GetBytes("0123456789abcdef");

         desObj->Key = plainKey;

         desObj->Mode = CipherMode::CBC;

         desObj->Padding = PaddingMode::PKCS7;

         MemoryStream^ ms = gcnew MemoryStream();
         CryptoStream^ cs = gcnew CryptoStream(ms,desObj->CreateEncryptor(),CryptoStreamMode::Write);

         cs->Write(plainbytes,0,plainbytes->Length);
         cs->Close();

         chipherbytes = ms->ToArray();
         ms->Close();

         textBox3->Text = System::Convert::ToBase64String(chipherbytes);

         //DECRYPTION CODE


         chipherbytes = System::Convert::FromBase64String(textBox3->Text);

         MemoryStream^ ms1 = gcnew MemoryStream(chipherbytes);
         CryptoStream^ cs1 = gcnew CryptoStream(ms1,desObj->CreateDecryptor(),CryptoStreamMode::Read);

         cs1->Read(chipherbytes,0,chipherbytes->Length);
         plainbytes2 = ms1->ToArray();
         cs1->Close();
         ms1->Close();

         textBox4->Text = Encoding::Unicode->GetString(plainbytes2);

关于c++ - 如何解密加密文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23725023/

相关文章:

.net - 快速释放本地对象

.net - Visual Studio 在使用 .NET Framework 2.0 为 C++\CLI 窗体打开设计器时崩溃

c++ - 通过 BOOST_FOREACH 使我的 C++ 类可迭代

c++ - 我不明白VS2013编译器显示的错误

c++ - LAPACKE 特征解不准确。如何改进?

mysql - 为什么我总是收到这个 mysql 错误?

visual-studio-2010 - 在 Visual Studio 2010 中比较文件的工具

c++ - 将执行从一个线程转移到另一个线程以实现任务并行性和 future 调用

c# - 如何在 C# 中隐藏/取消隐藏进程?

delphi - 使用许多参数从 C++\CLI 调用 Delphi DLL