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

标签 objective-c c memory random fill

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

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% 确定:)

编辑:

好的!经过一些调试后,我很高兴地宣布,我在加密和解密方面遇到的问题是由于我程序的另一部分中的一个错误,我现在已经解决了。所以我现在需要弄清楚的是如何用随机字节填充 iv。一些选项:

  • 使用 malloc(),它返回垃圾而非随机字节 -> 可能不安全 (?)
  • 使用 arc4random_buf(),这正是我想要的,只是它只能在 10.7+ 上工作,而我的 mac 是 10.6.6(另外我想支持 10.6)
  • 还有什么我没有考虑过的……? <-- 在这里帮忙!

编辑 2:

好的!在用一些测试数据(全零、全一等)和一些调试填充 iv 之后,我很高兴地宣布 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);

但是 当我给他一个 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;
}

...不会工作。

我一点都不明白这个逻辑......有什么想法吗?

最佳答案

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

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

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

此外,malloc 返回的内存块(与任何未初始化的内存一样)充满了垃圾。您不应该假设它会填充任何东西,尤其是密码学上有用的随机数。

关于objective-c - 用随机字节填充内存 - C/Objective-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6972570/

相关文章:

c++ - 如何从注入(inject)进程的内存空间重建数据结构?

ios - 处理核心基础类时的内存管理问题

objective-c - 检查文件是否存在于 URL 而不是路径

ios - 如何旋转类似于照片应用程序的 UICollectionView 并保持当前 View 居中?

c - C 中的变量矩阵

c++ - 使用现有基类对象创建派生类对象?

iphone - 判断是否在 iPhone 或 iPad 上运行的 API

objective-c - 为什么这段代码会出现这种奇怪的行为? objective-c

c - 如何将 Visual Studio 2008 Express Edition 配置为 c89/c90/c99?

c - 在 CLION 中安装 SDL