gpt4 book ai didi

objective-c - 如何在 iOS 中使用 AES128 加密的 Openssl 工具解密数据

转载 作者:可可西里 更新时间:2023-11-01 04:40:29 24 4
gpt4 key购买 nike

我有很多代码片段,它们使用 AES128 加密数据(如果您提供您的工作实现,我将非常感激)例如这个:

- (NSData*)AES128EncryptWithKey:(NSString*)key {
// 'key' should be 16 bytes for AES128, will be null-padded otherwise
char keyPtr[kCCKeySizeAES128 + 1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)

// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

NSUInteger dataLength = [self length];

//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void* buffer = malloc(bufferSize);

size_t numBytesEncrypted = 0;

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionECBMode + kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES128,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);

if (cryptStatus == kCCSuccess)
{
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}

free(buffer); //free the buffer;
return nil;
}

数据经过base64编码后,用在线工具保存到data.bin

我想做的是用 OpenSSL 解密这些数据。但是,当我调用

openssl enc -aes-128-ecb -in data.bin -out out.bin -d -pass pass:0123456789123456

它告诉我错误的魔数(Magic Number)

如果我使用

openssl enc -aes-128-ecb -in data.bin -out out.bin -d -pass pass:0123456789123456 -nosalt

它告诉我解密错误

请帮忙。

最佳答案

这里有几个问题。首先,您使用 CBC 模式(这是 CCCrypt 的默认设置)加密,但在 ECB 模式下解密。很少有理由使用 ECB 模式。

您使用字符串(我假设为“0123456789123456”)作为 key 而不是密码进行加密。这些是不同的东西。我不确定 openssl 如何将密码转换为 key 。我在 enc(1) 页面上没有看到对此的解释。我假设它使用 PBKDF2,但不清楚(并且未给出迭代次数)。您应该使用 -K 选项传递实际 key 。在这种情况下,您还需要显式传递 IV。您没有正确生成 IV 或盐。你应该是,然后你应该将它们传递给 openssl。

要了解如何正确加密,请参阅 Properly encrypting with AES with CommonCrypto 。一旦你正确地加密了一些东西,你就应该有一个正确的 key 、一个盐和一个 IV。使用 aes-128-cbc(假设 128 位 AES)将所有这些交给 enc,它应该可以工作。

编辑

值得在这里说明一个显而易见的事实:如果您在双方都使用相同的工具包,加密/解密会容易得多。要完成您想要做的事情,您确实必须了解 CCCrypt() 和 OpenSSL 的具体细节,这就是我讨论它们的原因。即使您发现某些“似乎有效”的东西,安全性也很容易在您没有意识到的情况下变得非常差。 AES128EncryptWithKey: 就是一个例子;它看起来不错并且“有效”,但它有几个安全问题。如果可能的话,我要么在两侧都使用 OpenSSL,要么在两侧都使用 CCCrypt。

关于objective-c - 如何在 iOS 中使用 AES128 加密的 Openssl 工具解密数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7535501/

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