Ios 苹果公司的不良做法&x2019;s doCipher:key:context:padding方法的示例代码

Ios 苹果公司的不良做法&x2019;s doCipher:key:context:padding方法的示例代码,ios,objective-c,encryption,Ios,Objective C,Encryption,本文认为, 苹果的doCipher:key:context:padding方法示例代码中存在“错误做法”。下面的代码片段显示它将使用16字节0x0的静态IV // Initialization vector; dummy in this case 0’s. uint8_t iv[kChosenCipherBlockSize]; memset((void *) iv, 0x0, (size_t) sizeof(iv)); 用外行的话来说,为什么它真的很糟糕?如何修复它 我只知道可以挂接该

本文认为,

苹果的doCipher:key:context:padding方法示例代码中存在“错误做法”。下面的代码片段显示它将使用16字节0x0的静态IV

 // Initialization vector; dummy in this case 0’s.

uint8_t iv[kChosenCipherBlockSize];

memset((void *) iv, 0x0, (size_t) sizeof(iv));
用外行的话来说,为什么它真的很糟糕?如何修复它


我只知道可以挂接该代码来截取符号键。但我不明白为什么以及如何防止这种情况发生。

那篇文章中概述的代码是不安全的,因为它不遵循初始化向量是随机值的规则。请注意,编写它的工程师评论:

//... dummy in this case 0’s.
固定大小的真实初始化向量(或博客称之为IVs)他们永远不会分配一个缓冲区来一遍又一遍地传递给具有相同值的加密函数,而是每次将缓冲区包含的数据随机化,这样就无法通过查看提供的示例代码推断其位置—就像作者所做的那样。只需断开对
memset()的调用
,运行时该内存块将被“垃圾”填满。如果您想获得技术性的,请编写自己版本的
memset()
,生成伪随机数据以覆盖该本地的内存。

在中,我们看到初始化向量(IV)在调用CCCryptorCreate时使用,CCCryptorCreate默认使用密码块链接(CBC)模式(如中所述)

CBC模式在加密前对每个块与下一个块进行异或运算,确保两个相同的块不会产生相同的结果。因为第一个块没有要异或的前一个块,所以需要组成一个称为“初始化向量”的块。这会使第一个块的输出随机化,并降低发生异或的可能性

在CBC模式下,每次调用CCCryptorCreate时,初始化向量都应该是随机的和唯一的,并且应该由加密程序和解密程序代码使用(因此您必须将其随消息发送给想要解密结果的人)


在本例中,苹果的示例代码是用
dummy注释的。dummy是真实的东西的替代品,因此我相信原始作者意识到了这个问题,只是故意选择编写一个简化的示例。

你能在这里快速总结一下博客对代码的看法吗?我不是专家,但我更新了:我只知道可以挂接该代码来截取符号键。但我不明白为什么以及如何防止。这很好。这只是为了让这个问题在博客帖子因某种原因消失后继续有用。谢谢!这是“如何”,而不是“为什么”。这是“为什么”如果两条消息使用相同的密钥和初始化向量发送,密码分析员可以一起分析这两条加密消息,以发现有关解密版本的信息。他到底能发现多少取决于密码的类型和使用模式;有关详细信息,请参阅。@BrentRoyal Gordon“解密版本”通常被称为“纯文本”,但密钥应保持安全。只需删除对
memset()
的调用是非常糟糕的建议。这确实意味着IV可以包含不可预测的数据,但这并不意味着它包含密码意义上的随机数据。“伪随机数据”(通常以某种方式播种)应该被安全的随机数据所取代。魔鬼在于细节…@owlstead我明白仅仅依赖运行时feaures是危险的('这就是为什么我建议重写memset())。关于伪随机生成器的评论可以推广到种子算法,甚至可以推广到循环中对某种rand和friends类函数的几个调用。虽然我认为需要细微差别(偶尔),但给他写一篇研究论文是没有用的!另一方面,简单地指向可能更有用,而在密文前面加上IV可能是另一种方法。随机数不仅仅是正确执行加密的细微差别。感谢您对虚拟事物的评论:我很高兴苹果的员工比第一眼看到的更清楚:)