gpt4 book ai didi

linux - 如何将 .NET AES 与 Linux EVP 加密相匹配

转载 作者:太空宇宙 更新时间:2023-11-04 10:29:12 26 4
gpt4 key购买 nike

我有一个文件需要在 C# .NET 应用程序中解密。这是文件由无法修改的遗留系统生成的情况。

下面是用于在 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);
}

所以问题是我必须在 .NET 中做什么才能匹配 openssl/linux 应用程序的解密方式?发生这种情况的 linux 机器正在使用 openssl 1.0.1t。

我想我可能会尝试在 Windows 上构建 Linux 应用程序,但是当我下载适用于 Windows 1.0.1t 的 openssl 时,include 文件夹是空的,因此没有任何 header 可用于构建它。

我该怎么办?

最佳答案

EVP_aes_128_ctr 在 CTR 模式下是 AES 128。由于 CTR 模式实际上是一种流密码,因此没有填充的概念。

.NET 不公开 CTR 模式,因此不能直接移植到 .NET。如果您确实需要它在 .NET 中工作,则必须在 CipherMode.ECB(以及 PaddingMode.None 和 BlockSize = 128)中使用 AES 以根据 https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Counter_.28CTR.29 中的描述实现 CTR。 .

关于linux - 如何将 .NET AES 与 Linux EVP 加密相匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40682752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com