用随机字节填充内存 - C / Objective-C

时间:2011-08-07 11:45:17

标签: objective-c c memory random fill

我在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。一些选择:

  • 使用malloc(),它返回垃圾,而不是随机字节 - &gt;潜在的不安全(?)
  • 使用arc4random_buf(),这正是我想要的,除了它只能工作10.7+而我的mac是10.6.6(加上我想支持10.6)
  • 我没有考虑过的其他事情......? &lt; - help here!

编辑2:

奥莱特!在用一些测试数据(全部为零,所有等等)填充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;
}

......将无效。

我不明白这个逻辑一点......任何想法?

1 个答案:

答案 0 :(得分:10)

您可以使用arc4random_buf使用随机数据填充缓冲区:

#include <stdlib.h>
#include <stdint.h>

uint8_t iv[kCCBlockSizeAES128];
arc4random_buf(&iv, kCCBlockSizeAES128);

此外,malloc返回的内存块(与任何未初始化的内存一样)都填充了 garbage 。你不应该假设它会被任何填充,尤其不是加密有用的随机数。