1

文字列を暗号化してファイルに保存し、後でファイルから文字列を読み取って復号化しようとしています。しかし、コードを実行すると、「復号化するデータの長さが無効です」というエラーが表示されます:/デバッグによって、何らかの理由でバイト配列(array^バイト)の長さが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)); }

これを数時間で修正しようとしましたが、成功しませんでした。助けていただければ幸いです:)

私の悪い英語でごめんなさい。

4

1 に答える 1

4

UTF-8 を使用して、任意のバイト配列を文字列に変換しようとしています。これは、ランダムなテキスト ファイルを JPEG であるかのように読み込もうとして、それが有効な画像であると期待するようなものです。

Encoding.GetString(byte[])バイト配列が実際にそのエンコーディングでエンコードされたテキストである場合にのみ使用してください。

「任意の」バイナリ データ (通常は圧縮または暗号化されたデータ) を表現したい場合は、必要に応じて base64 または 16 進数を使用する必要があります。(Convert.ToBase64StringそしてConvert.FromBase64Stringあなたの友達です。)

于 2012-06-14T20:17:21.417 に答える