我在Objective-C(AES256)中使用CommonCrypto进行加密,我想提供一个IV(初始化向量)来实现更安全的加密。我现在正在这样做:
const void* iv = malloc(kCCBlockSizeAES128);
// EDIT:
//if (!iv) {
// iv = NULL;
//}
然后我创建了cryptor对象:
CCCryptorRef cryptor;
CCCryptorStatus cryptStatus = CCCryptorCreate(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
iv,
&cryptor);
问题是加密这种方式似乎失败了(悲伤的脸......)。我的意思是:它加密没有明显的问题,但它解密不同于原始数据。我虽然这可行,因为当你malloc()
内存时,它并不是全部写入零,而是随机的。我也试过自己编写随机值,但我的C背景真的很难。如果有一个写随机字节的函数(如bzero
),请告诉我。
我也尝试过这样的事情:
char* iv = malloc(kCCBlockSizeAES128);
int i;
srand((unsigned int)time(NULL));
for (i = 0; i < kCCBlockSizeAES128; i++) {
iv[i] = (char)rand()%256;
}
哦,顺便说一句,我意识到这一定是一个非常愚蠢的问题:)
最后,我想要的就像const void* iv = malloc(kCCBlockSizeAES128)
一样,经过一些操作,我确信它的数据是完全随机的。有什么想法?
PS:我只提供了加密/ Objective-C背景,所以你知道我需要这个。我认为这不会影响一件事。 kCCBlockSizeAES128 = 16(90%肯定:)
奥莱特!在一些去除后,我很高兴地宣布我遇到的问题与加密&amp;解密是由于我现在解决的程序的另一部分中的错误。所以我现在需要解决的是如何用随机字节填充iv。一些选择:
奥莱特!在用一些测试数据(全部为零,所有等等)填充iv并且更多后,我不高兴地宣布ccrypto似乎不是在某些条件下工作。我将解释如何:
每当我将crypto提供给一个归零的iv或NULL(加密相同的东西)时它就可以工作。例如,这在加密和解密时效果很好:
uint8_t iv[kCCBlockSizeAES128];
int i;
for (i = 0; i < kCCBlockSizeAES128; i++) {
iv[i] = 0x0; // I know this is the same as doing: memset((void *)iv, 0x0, (size_t)sizeof(iv));
}
CCCryptorRef cryptor;
CCCryptorStatus cryptStatus = CCCryptorCreate(operation, kCCAlgorithmAES128,
kCCOptionPKCS7Padding,
(const void *)keyPtr, kCCKeySizeAES256,
iv,
&cryptor);
但是当我向他提供一个iv,其中至少有一个字节不为零时,加密/解密不会提供错误,但解密不会产生原始数据。例如,这......
uint8_t iv[kCCBlockSizeAES128];
int i;
for (i = 0; i < kCCBlockSizeAES128; i++) {
iv[i] = 0x1;
}
或完全随机的数据...
uint8_t iv[kCCBlockSizeAES128];
int i;
for (i = 0; i < kCCBlockSizeAES128; i++) {
iv[i] = arc4random() % 256;
}
......将无效。
我不明白这个逻辑一点......任何想法?
答案 0 :(得分:10)
您可以使用arc4random_buf
使用随机数据填充缓冲区:
#include <stdlib.h>
#include <stdint.h>
uint8_t iv[kCCBlockSizeAES128];
arc4random_buf(&iv, kCCBlockSizeAES128);
此外,malloc
返回的内存块(与任何未初始化的内存一样)都填充了 garbage 。你不应该假设它会被任何填充,尤其不是加密有用的随机数。