2016-11-18 17 views
0

C#.NETアプリケーションで復号化する必要があるファイルがあります。これは、ファイルが変更できないレガシーシステムによって生成される状況です。ここで.NET AESとLinux EVP暗号化を一致させる方法

は、Linuxアプリでファイルを復号化するために使用されるコードは(私は、暗号化に固有ではありませんでしたファイルと、そのようなからのデータをロードして実行するために持ついくつかのことを切り出す)である:

#define BUFFER_SIZE 8192 
    #define ENCRYPTION_KEY_LENGTH 16 

    unsigned char OutBuf[BUFFER_SIZE]; 
    unsigned char InBuf[BUFFER_SIZE]; 

    unsigned char arucIV[ENCRYPTION_KEY_LENGTH]; 
    unsigned char arucKey[ENCRYPTION_KEY_LENGTH]; 

    istream * pIn = &std::cin; 
    ostream * pOut = &std::cout; 
    string sInFile, sOutFile; 
    bool decrypt = false; 

    int rc, nOut, nIn; 

    EVP_CIPHER_CTX * pCTX = EVP_CIPHER_CTX_new(); 

    pIn->read((char*)arucIV, ENCRYPTION_KEY_LENGTH); 
    nIn = pIn->gcount(); 
    if(nIn == ENCRYPTION_KEY_LENGTH) 
    { 
     rc = AesKeyGen(arucIV, arucKey, ENCRYPTION_KEY_LENGTH); 
     if(rc == 0) 
     { 
      if(EVP_DecryptInit_ex(pCTX, EVP_aes_128_ctr(), NULL, arucKey, arucIV)) 
      { 
       while(pIn->good() && pOut->good()) 
       { 
        pIn->read((char*)InBuf, BUFFER_SIZE); 
        nIn = pIn->gcount(); 
        if(nIn) 
        { 
         if(EVP_DecryptUpdate(pCTX, OutBuf, &nOut, InBuf, nIn)) 
         { 
          pOut->write((char*)OutBuf, nOut); 
         } 
        } 
       } 

       if(EVP_DecryptFinal_ex(pCTX, OutBuf, &nOut)) 
       { 
        pOut->write((char*)OutBuf, nOut); 
       } 
      } 
     } 
     else 
     { 
      printf("Error Generating key.\n"); 
     } 
    } 
    else 
    { 
     printf("Error reading IV from input.\n"); 
    } 
.NETで

私はこのコードを試してみました、それは正確に最初の16のバイトを復号化し、残りはゴミです:

 byte[] result = new byte[cipherText.Length]; 

     using (RijndaelManaged rm = new RijndaelManaged()) 
     { 
      rm.BlockSize = 128; 
      rm.Key = Key; 
      rm.IV = IV; 
      rm.Mode = CipherMode.CFB; 
      rm.Padding = PaddingMode.Zeros; 
      ICryptoTransform ctr = rm.CreateDecryptor(); 

      int position = 0; 
      while (position + 128 < cipherText.Length) 
      { 
       ctr.TransformBlock(cipherText, position, 128, result, position); 
       position += 128; 
      } 
      ctr.TransformFinalBlock(cipherText, position, cipherText.Length - position); 
     } 

そこで問題は、私がどのようにOpenSSL/linuxに一致するように.NETで行う必要がありますものですアプリは復号化していますか?これが起こっているLinuxボックスは、openssl 1.0.1tを使用しています。

私はWindows上でlinuxアプリケーションを構築しようと思ったかもしれませんが、Windows 1.0.1t用のopensslをダウンロードすると、インクルードフォルダが空であるため、ヘッダを作成できません。

私は何をしますか?

答えて

1

EVP_aes_128_ctrは、CTRモードのAES 128です。また、CTRモードは実質的にストリーム暗号であるため、パディングの概念はありません。

.NETではCTRモードが公開されていないため、.NETに直接移植することはできません。 .NETから実際に動作する必要がある場合は、https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29の説明からCTRを実装するには、CipherMode.ECB(およびBlockSize = 128のPaddingMode.None)でAESを使用する必要があります。