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をダウンロードすると、インクルードフォルダが空であるため、ヘッダを作成できません。
私は何をしますか?