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

Ale*_*lex 4 c memory random objective-c fill

我在Objective-C(AES256)中使用CommonCrypto进行加密,我想提供一个IV(初始化向量)来实现更安全的加密.我现在正在这样做:

const void* iv = malloc(kCCBlockSizeAES128);
// EDIT:
//if (!iv) {
//    iv = NULL;
//}
Run Code Online (Sandbox Code Playgroud)

然后我创建了cryptor对象:

CCCryptorRef cryptor;
CCCryptorStatus cryptStatus = CCCryptorCreate(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                                  keyPtr, kCCKeySizeAES256,
                                                  iv,
                                                  &cryptor);
Run Code Online (Sandbox Code Playgroud)

问题是加密这种方式似乎失败了(悲伤的脸......).我的意思是:它加密没有明显的问题,但它解密不同于原始数据.我虽然这会起作用,因为当你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;
}
Run Code Online (Sandbox Code Playgroud)

哦,顺便说一句,我意识到这一定是一个非常愚蠢的问题:)

最后,我想要的是const void* iv = malloc(kCCBlockSizeAES128)在某些操作之后,我确信它的数据是完全随机的.有什么想法吗?

PS:我只提供了加密/ Objective-C背景,所以你知道我需要这个.我认为这不会影响一件事.kCCBlockSizeAES128 = 16(90%肯定:)

编辑:

行!经过一番打击后,我很高兴地宣布我在加密和解密方面遇到的问题是由于我现在已解决的程序中另一部分的错误.所以我现在需要解决的是如何用随机字节填充iv.一些选择:

  • 使用malloc(),它返回垃圾,而不是随机字节 - >可能不安全(?)
  • 使用arc4random_buf(),这正是我想要的,除了它只能工作10.7+而我的mac是10.6.6(加上我想支持10.6)
  • 我没有考虑过的其他东西......?< - 在这里帮忙!

编辑2:

行!填充一些测试数据的IV(全零,所有的人等),经过一些 deugging我高兴地宣布,ccrypto似乎并不在某些情况下是工作.我将解释如何:

每当我将加密输入一个归零的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);
Run Code Online (Sandbox Code Playgroud)

但是当我给他喂一个iv,其中至少有一个字节不为零时,加密/解密不提供错误,但解密不会产生原始数据.例如,这......

uint8_t iv[kCCBlockSizeAES128];
int i;
for (i = 0; i < kCCBlockSizeAES128; i++) {
    iv[i] = 0x1;
}
Run Code Online (Sandbox Code Playgroud)

或完全随机的数据......

uint8_t iv[kCCBlockSizeAES128];
int i;
for (i = 0; i < kCCBlockSizeAES128; i++) {
    iv[i] = arc4random() % 256;
}
Run Code Online (Sandbox Code Playgroud)

......不行.

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

一二三*_*一二三 10

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

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

uint8_t iv[kCCBlockSizeAES128];
arc4random_buf(&iv, kCCBlockSizeAES128);
Run Code Online (Sandbox Code Playgroud)

此外,返回的内存块malloc(与任何未初始化的内存一样)充满了垃圾.你不应该假设它会被任何东西填充,特别是没有加密有用的随机数.