0

私はC#、VB.net、VC ++(VS 2008)に暗号化復号化コードを持っており、これによって暗号化されたファイルは誰でも復号化できます。

ここでの要件は、VC ++6.0でVC++(VS 2008)静的libファイルを使用する必要があるということです。

または、これを行うための他の代替案を提案します(dllなし)

namespace RijndaelEncDec
{

    void Rijndael::LN_EncryptFile(String^ fileSource, String^ fileDestination, String^ password)
    {
        // Declare the streams used
        // to encrypt to an in memory
        // array of bytes.

        CryptoStream^   cryptoStream;

        FileStream^ fsIn;
        FileStream^ fsOut ;

        // Declare the RijndaelManaged object
        // used to encrypt the data.
        RijndaelManaged^ RijndaelCipher;

        try
        {           
            fsIn=gcnew FileStream(fileSource, FileMode::Open, FileAccess::Read);
            fsOut = gcnew FileStream(fileDestination, FileMode::Create, FileAccess::Write);


            array<Byte>^  salt = gcnew array<Byte>(13){ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xF1, 0xF0, 0xEE, 0x21, 0x22, 0x45 };
            Rfc2898DeriveBytes ^secretKey =gcnew Rfc2898DeriveBytes(password,salt);

            RijndaelCipher = gcnew RijndaelManaged();
            RijndaelCipher->Padding = PaddingMode::PKCS7;
            RijndaelCipher->Mode=CipherMode::CBC;
            RijndaelCipher->BlockSize=128;
            RijndaelCipher->Key = secretKey->GetBytes(32);
            RijndaelCipher->IV = secretKey->GetBytes(16);


            ICryptoTransform^ encryptor = RijndaelCipher->CreateEncryptor();
            cryptoStream = gcnew CryptoStream(fsOut, encryptor, CryptoStreamMode::Write);


            int ByteData;
            while ((ByteData=fsIn->ReadByte()) != -1)
            {
              cryptoStream->WriteByte(ByteData);
            }

          cryptoStream->FlushFinalBlock();

        }
         catch (FileNotFoundException^ ex)
            {
                if ((ex->FileName->CompareTo(fileSource) == 0) && (GlobalVariableClass::logPermission == true))
                {
                    StreamWriter^ writer = gcnew StreamWriter(GlobalVariableClass::logFileLocation);
                    writer->WriteLine(ex->Message);
                    writer->Close();
                }
                if ((ex->FileName->CompareTo(fileDestination) == 0) && GlobalVariableClass::logPermission == true)
                {
                    StreamWriter^ writer = gcnew StreamWriter(GlobalVariableClass::logFileLocation);
                    writer->WriteLine(ex->Message + " i.e. Input file for Encryption");
                    writer->Close();
                }

            }
         catch (Exception^ ex)
            {
                if(GlobalVariableClass::logPermission==true)
                {
                    StreamWriter^ writer = gcnew StreamWriter(GlobalVariableClass::logFileLocation);
                    writer->WriteLine(ex->Message + " During Encrypting File");
                    writer->Close();

                }


            }
        finally
        {


            // Close the streams.

            if (cryptoStream)
                cryptoStream->Close();
            if(fsIn)
                fsIn->Close();
            if(fsOut)
                fsOut->Close();
            // Clear the RijndaelManaged object.
            if (RijndaelCipher)
                RijndaelCipher->Clear();
        }

        // Return the encrypted bytes from the memory stream.
        return ;//msEncrypt->ToArray();
    }

    void Rijndael::DecryptFile(String^ fileSource, String^ fileDestination, String^ password)
    {



        array<Byte>^  salt = gcnew array<Byte>(13) { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xF1, 0xF0, 0xEE, 0x21, 0x22, 0x45 };
        Rfc2898DeriveBytes ^secretKey =gcnew Rfc2898DeriveBytes(password,salt);       

        CryptoStream^ csDecrypt;
        StreamReader^ srDecrypt;
        FileStream^ fsIn;
        FileStream^ fsOut;

        // Declare the RijndaelManaged object
        // used to decrypt the data.
        RijndaelManaged^ RijndaelCipher;



        try
        {

            fsIn  = gcnew FileStream(fileSource, FileMode::Open, FileAccess::Read);
            fsOut = gcnew FileStream(fileDestination, FileMode::Create, FileAccess::Write);   

            RijndaelCipher = gcnew RijndaelManaged();
            RijndaelCipher->Padding = PaddingMode::PKCS7;
            RijndaelCipher->Key = secretKey->GetBytes(32);
            RijndaelCipher->IV = secretKey->GetBytes(16);

            // Create a decrytor to perform the stream transform.
            ICryptoTransform^ decryptor = RijndaelCipher->CreateDecryptor();

            // Create the streams used for decryption.

            csDecrypt = gcnew CryptoStream(fsOut, decryptor, CryptoStreamMode::Write);

            int ByteData;
            while ((ByteData=fsIn->ReadByte()) != -1)

            {

              csDecrypt->WriteByte(ByteData);

            }





        }
         catch (FileNotFoundException^ ex)
                {
                    if ((ex->FileName->CompareTo(fileSource) == 0) && (GlobalVariableClass::logPermission == true))
                    {

                        StreamWriter^ writer = gcnew StreamWriter(GlobalVariableClass::logFileLocation);
                        writer->WriteLine(ex->Message + " i.e. Input file for decryption");
                        writer->Close();
                    }
                    if ((ex->FileName->CompareTo(fileDestination) == 0) && GlobalVariableClass::logPermission == true)
                    {
                        StreamWriter^ writer = gcnew StreamWriter(GlobalVariableClass::logFileLocation);
                        writer->WriteLine(ex->Message + " i.e. Output file while decryption");
                        writer->Close();
                    }

                }
                catch (Exception^ ex)
                {
                    if (GlobalVariableClass::logPermission == true)
                    {
                        StreamWriter^ writer = gcnew StreamWriter(GlobalVariableClass::logFileLocation);
                        writer->WriteLine(ex->Message + " During Decrypting File");
                        writer->Close();
                    }

                }
        finally
        {
            // Clean things up.

            // Close the streams.
            if (srDecrypt)
                srDecrypt->Close();
            if (csDecrypt)
                csDecrypt->Close();

               fsIn->Close();
               fsOut->Close();


            // Clear the RijndaelManaged object.
            if (RijndaelCipher)
                RijndaelCipher->Clear();
        }

        return ;
    }

    String^ Rijndael:: ReadEncryptFileToBuffer(String^ fileSource,[System::Runtime::InteropServices::OutAttribute]  String ^% buffer,String^ password)
    {
        FileStream^ fsIn; 
        MemoryStream^ memoryStream;
        CryptoStream^ cryptoStream;
        StreamReader^ fileReader,^streamReader;
        RijndaelManaged^ RijndaelCipher;
        String^ decryptText;

         // First we are going to open the file streams
        try
        {
          RijndaelCipher = gcnew RijndaelManaged();
          RijndaelCipher->Mode = CipherMode::CBC;
          RijndaelCipher->KeySize = 256;
          RijndaelCipher->BlockSize = 128;
          RijndaelCipher->Padding = PaddingMode::PKCS7;

          fsIn = gcnew FileStream(fileSource, FileMode::Open, FileAccess::Read);
          fileReader = gcnew StreamReader(fsIn,System::Text::Encoding::Default);
          String^ cipherText = fileReader->ReadToEnd();
          array<Byte>^ cipherByte = System::Text::Encoding::Default->GetBytes(cipherText);



          array<Byte>^  salt = gcnew array<Byte>(13) { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xF1, 0xF0, 0xEE, 0x21, 0x22, 0x45 };  
          Rfc2898DeriveBytes^ secretKey = gcnew Rfc2898DeriveBytes(password, salt);
          ICryptoTransform^ Decryptor = RijndaelCipher->CreateDecryptor(secretKey->GetBytes(32), secretKey->GetBytes(16));





          memoryStream = gcnew MemoryStream(cipherByte);
          cryptoStream = gcnew CryptoStream(memoryStream, Decryptor, CryptoStreamMode::Read);
          streamReader = gcnew StreamReader(cryptoStream);
          decryptText = streamReader->ReadToEnd();
          buffer = decryptText;
          Console::WriteLine(decryptText);



        }
         catch (FileNotFoundException^ ex)
        {
            if (ex->FileName->CompareTo(fileSource) == 0 && GlobalVariableClass::logPermission == true)
            {

                StreamWriter^ writer = gcnew StreamWriter(GlobalVariableClass::logFileLocation);
                writer->WriteLine(ex->Message + " i.e. Input file for decryption Buffer");
                writer->Close();

            }


        }
        catch (Exception^ ex)
        {
            if (GlobalVariableClass::logPermission == true)
            {
                StreamWriter^ writer = gcnew StreamWriter(GlobalVariableClass::logFileLocation);
                writer->WriteLine(ex->Message + "i.e. During Reading Encrypting File to Decrypted Buffer");
                writer->Close();
            }

        }
        finally
        {
          if(fsIn)
          fsIn->Close();
          if(memoryStream)
          memoryStream->Close();
          if(cryptoStream)
          cryptoStream->Close();
          if(streamReader)
          streamReader->Close();

        }
        return decryptText;
    }

    void Rijndael::WriteEncFileFromDecBuffer(String^ buffer, String^ fileDestination, String^ password)
    {
        FileStream^ fsOut; 
        CryptoStream^ cryptoStream;
        StreamReader^ streamReader;

        try
        {
            RijndaelManaged^ RijndaelCipher = gcnew RijndaelManaged();
            RijndaelCipher->Mode = CipherMode::CBC;
            RijndaelCipher->KeySize = 256;
            RijndaelCipher->BlockSize = 128;
            RijndaelCipher->Padding = PaddingMode::PKCS7;

            FileStream^ fsOut = gcnew FileStream(fileDestination, FileMode::Create, FileAccess::Write);

            array<Byte>^  salt = gcnew array<Byte>(13) { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0xF1, 0xF0, 0xEE, 0x21, 0x22, 0x45 };
            array<Byte>^ plainText = System::Text::Encoding::Default->GetBytes(buffer);
            Rfc2898DeriveBytes^ secretKey = gcnew Rfc2898DeriveBytes(password, salt);
            ICryptoTransform^ Encryptor = RijndaelCipher->CreateEncryptor(secretKey->GetBytes(32), secretKey->GetBytes(16));

            cryptoStream = gcnew CryptoStream(fsOut, Encryptor, CryptoStreamMode::Write);

            cryptoStream->Write(plainText, 0, plainText->Length);

            cryptoStream->FlushFinalBlock();
            cryptoStream->Close();
            fsOut->Close();
        }

        catch(FileNotFoundException^ ex)
        {
            if ( GlobalVariableClass::logPermission == true)
            {

                StreamWriter^ writer = gcnew StreamWriter(GlobalVariableClass::logFileLocation);
                writer->WriteLine(ex->Message + " i.e. Output file from Dencrypted Buffer");
                writer->Close();
            }

        }
        catch(Exception^ ex)
        {
            if (GlobalVariableClass::logPermission == true)
            {
                StreamWriter^ writer = gcnew StreamWriter(GlobalVariableClass::logFileLocation);
                writer->WriteLine(ex->Message + " During Writing Encrypting File from Decrypted Buffer");
                writer->Close();

            }
        }
        finally
        {
          fsOut->Close();
          cryptoStream->Close();
          streamReader->Close();

        } 
    }
}
4

3 に答える 3

1

これはできません。VS6 は .NET が存在する前に存在したため、VS6 が認識しているテクノロジからアクセスできるマネージド コンポーネントへのインターフェイスを提供する必要があります。最も単純な 2 つのオプション:

  1. マネージ ライブラリ用の COM インターフェイスを作成し、C++ からそれを使用する
  2. C スタイルのインターフェースを作成し、それを C++ から使用します。C++ オブジェクトおよび機能との DLL 境界を超える問題のため、C++ インターフェイスではありません。

ただし、.lib ファイルが必要であるという要件がわかりません。明白な解決策のどちらもこれを採用しません。より良い答えが必要な場合は、.lib が「必要」な理由を明確にする必要があります。問題は、不可能な一連の要件があることです。

  1. DLL は使用できません (1 つの PE モジュールのみに制限されます)。
  2. マネージドとアンマネージドは同じ PE に共存できません。
  3. VS6 はマネージド コードを記述できません。

これらの 3 つの制限は、思い通りにできないことを証明しています。どこかで妥協する必要があります。

于 2012-08-29T10:17:02.003 に答える
0

むしろ、VC++ 6.0 コードを VC++ 9.0 (または .NetFramework サポートを含む任意のバージョン) にアップグレードすることをお勧めします。そのバージョンは、マネージド環境でもアプリケーション コードをコンパイルできます。したがって、マネージド スタティック ライブラリを使用するか、必要に応じてすべての機能を使用するためにライブラリ マネージド コードを埋め込むことができます。

DLLはクライアント側でリバースエンジニアリングできるため、暗号化/復号化コードにDLLを使用するのではなく、静的ライブラリを使用するという点で、要件は関連しているようです。

はい、もう 1 つコードが C++/CLI (管理された C++) で記述されているため、VC++ 9.0 でコンパイルする前に、(共通プロパティを使用して) "CLR サポート" に切り替えるようにしてください。どうぞ。

于 2012-08-31T06:45:18.653 に答える
0

あなたの最善の策は、実装の 1 つで関数の C ラッパーを作成し、それから DLL を作成することだと思います。

于 2012-08-29T10:08:55.550 に答える