gpt4 book ai didi

c++ - 使用 AES 使用 Common Crypto 和 Crypto++ 加密时的不同结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:41 32 4
gpt4 key购买 nike

使用 Apple 的 Common Crypto 和 Crypto++ 使用相同的 key 加密相同的文件(二进制数据)时,我得到了不同的结果。我使用的算法是 AES。

这是使用 Common Crypto 的 Objective C 代码:

void FileUtil::writeToFileEncrypt(string fileName, const void *data, int size, string key, int *sizeOut)
{
int numBytesEncrypted = 0;
char keyPtr[kCCKeySizeAES256+1];

if (key.length() > 32)
{
key = key.substr(0, 32);
}

memcpy(keyPtr, key.c_str(), sizeof(keyPtr));

if (key.length() < 32)
{
for (int i = key.length(); i < 32; i++)
{
keyPtr[i] = '0';
}
}

size_t bufferSize = size + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
data, size, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);

if (cryptStatus == kCCSuccess) {
cout << "encrypt success" << endl;
}

ofstream myfile;
myfile.open (fileName.c_str(), ios::out | ios::binary);
myfile.write((const char *)buffer, numBytesEncrypted);
myfile.close();

free(buffer);

*sizeOut = numBytesEncrypted;
}

这是使用 Crypto++ 的 C++ 代码

void EncryptUtils::encrypt(string fileName, unsigned char *chars, string key, int *length, int dataLength)
{
unsigned char *iv = (unsigned char *)"0000000000000000";

char keyPtr[32 + 1];

if (key.length() > 32)
{
key = key.substr(0, 32);
}

memcpy(keyPtr, key.c_str(), sizeof(keyPtr));

if (key.length() < 32)
{
for (int i = key.length(); i < 32; i++)
{
keyPtr[i] = '0';
}
}
keyPtr[32] = '\0';

CryptoPP::AES::Encryption aesEncryption((unsigned char *)keyPtr, 32);
CryptoPP::CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv);

int newBufSize = (sizeof(unsigned char *) * dataLength) + 32;
unsigned char *newBuf = (unsigned char *)malloc(newBufSize);
CryptoPP::ArraySink *arraySink = new CryptoPP::ArraySink(newBuf, newBufSize);

CryptoPP::StreamTransformationFilter stfEncryptor(cbcEncryption, arraySink, CryptoPP::StreamTransformationFilter::PKCS_PADDING);
stfEncryptor.Put(reinterpret_cast<const unsigned char*>(chars), (unsigned int)dataLength);
stfEncryptor.MessageEnd();

*length = arraySink->TotalPutLength();

ofstream myfile;
myfile.open (fileName.c_str(), ios::out | ios::binary);
myfile.write((const char *)newBuf, *length);
myfile.close();
}

我需要让它们都产生相同的结果。有什么我忽略的吗?

最佳答案

  1. “Objective-C”版本不是用 Objective-C 编写的,而是用 C++ 编写的。实际加密使用的是 CCCrypt,它是普通的“C”。

  2. “Objective-C”版本没有提供 iv,因此它默认为全零。 C++ 版本提供了 ASCII“0”字符的 iv,这与全零数据不同。这可能是错误。

  3. 在加密调用之前和之后立即为每个包括 key 、iv、数据输入和数据输出提供输入和输出十六进制数据转储。

关于c++ - 使用 AES 使用 Common Crypto 和 Crypto++ 加密时的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28233023/

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