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

用随机字节填充内存-C/Objective-C,objective-c,c,memory,random,fill,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(o

我在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()
memory时,它不是全写为零,而是随机的。我自己也尝试过写随机值,但我的C语言背景很难做到。如果有一个函数(如
bzero
)写入随机字节,请告诉我

我也尝试过这样做:

char* iv = malloc(kCCBlockSizeAES128);
int i;
srand((unsigned int)time(NULL));
for (i = 0; i < kCCBlockSizeAES128; i++) {
    iv[i] = (char)rand()%256;
}
但是当我给他一个至少有一个字节不是零的iv时,加密/解密不会提供错误,但解密不会产生原始数据。例如,这个

uint8_t iv[kCCBlockSizeAES128];
int i;
for (i = 0; i < kCCBlockSizeAES128; i++) {
    iv[i] = 0x1;
}
uint8_t iv[kccblocksizeaaes128];
int i;
对于(i=0;i
或者对于完全随机的数据

uint8_t iv[kCCBlockSizeAES128];
int i;
for (i = 0; i < kCCBlockSizeAES128; i++) {
    iv[i] = arc4random() % 256;
}
uint8_t iv[kccblocksizeaaes128];
int i;
对于(i=0;i
…行不通


我一点也不懂这个逻辑。。。有什么想法吗?

您可以使用
arc4random\u buf
用随机数据填充缓冲区:

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

uint8_t iv[kCCBlockSizeAES128];
arc4random_buf(&iv, kCCBlockSizeAES128);
#包括
#包括
uint8_t iv[KCCBlocksizeeAes128];
arc4random_buf(四号和四号,KCCBlocksizeeAes128);


另外,
malloc
返回的内存块(与任何未初始化的内存一样)充满了垃圾。您不应该假设它将填充任何内容,尤其是没有加密功能的随机数。

注释:
如果(!iv){iv=NULL;}
没有意义。@Mat I这样做是因为如果您向crpypto提供NULL,它将创建一个始终为全零的iv本身。当我无法创建IV时,我让crypto创建一个零IV。否则我想要一个随机IV。你的帖子很模糊:“似乎失败了”?确保它失败了。此外,无论IV的内容如何,加密功能都应该工作-可能不安全,但会工作。所以你的问题可能在别处。请更详细地描述什么不起作用以及它是如何失败的。(如果
if
块中的语句只有在
!iv
为真时才会运行,这只在
iv==null
时发生)@Mat好吧,我说它似乎失败了,因为我对一个文件进行了加密,没有任何问题,但当我解密它时,它的信息与原始文件不同。你说得对,这很模糊。我将继续调试。如果我发现了什么,我会告诉你的。关于if(!iv){…},我现在明白你的意思了:)@Mat我已经更新了我的问题,你能再检查一下吗?编译器找不到函数
arc4random\u buf
,即使使用import语句。它是arc4random_addrandom()还是类似的东西?请确保您是根据Mac OS X 10.7或iOS 4.3(或更高版本)SDK进行编译的。嗯,我是使用Mac OS 10.6进行编译的。。。但是arc4random_addrandom()可以吗?这可能是一个愚蠢的问题,为什么要将&iv传递给arc4random_buf而不仅仅是iv?我认为iv已经是一个指针了,我们只需要把随机数据放在iv指向的地方,&iv不是包含指针值的地址吗?我认为你应该通过四级考试而不是四级考试
#include <stdlib.h>
#include <stdint.h>

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