SecKeyEncrypt kSecPaddingNone

时间:2013-09-09 17:23:06

标签: ios objective-c encryption

尝试将SecKeyEncrypt()kSecPaddingNone一起使用时,我遇到了一些挫败感。经过多次调查,我找到了一个解决方法,但我想知道发生了什么。目前,我没有可用的代码,但我可以在今天晚些时候发布。我真的不相信问题出在我的代码中:我倾向于认为我只是在做一些根本错误的事情。 (也就是说,我相信我的代码是正确的,但我正在尝试做的是错误的。)

我的问题是:我想使用对称密钥加密大块数据,然后使用不同的公钥加密该密钥。使用CryptoExercise作为模板,我很容易得到一堆代码来做到这一点。我为AES128生成一个对称密钥,用它来加密我的大缓冲区。我的单元测试没有问题。

然后我的单元测试创​​建一个公钥/私钥对,尝试用公钥加密对称密钥,用私钥解密,然后解密大缓冲区。请注意,我根据我的问题集的受限域做了一些简化的假设:我总是使用AES128加密大缓冲区,所以密钥总是16个字节,我总是使用1024位公钥/私钥对,所以我通过创建一个128字节的缓冲区加密AES密钥,用随机数据填充它,然后将AES密钥嵌入到该缓冲区中。

最后,因为我有一组固定的缓冲区大小,所以当我调用`SecKeyEncrypt()时,我正在使用kSecPaddingNone。我的假设是我可以依靠填充缓冲区的方法和缓冲区大小的知识。

当我开始运行我的测试时,我看到的是令人沮丧的:大约80%的时间,他们工作得很好。但是其他20%,SecKeyEncrypt()失败并且{-1}}为-50,参数错误。我花了很多时间寻找堆栈损坏,堆损坏,过早释放等等,但那是徒劳的。

然后我开始查看普通旧缓冲区上的公钥/私钥对操作,即我进行了一个新的单元测试,试图加密/解密我创建并手动填充的缓冲区。此时,我发现了我的线索:如果我发送了一个零缓冲区,那么OSStatus就会陷入无限循环。如果我发送了一个只填充缓冲区的缓冲区,那么它运行正常。如果我用缓冲区填充缓冲区,然后用零替换第一个字节,我就会回到无限循环中。

其他各种模式使我得到了解决方法,目前在第一个字节之后插入AES密钥并始终将第一个字节设置为1,但我非常困惑。来自SecKeyEncrypt的文档:

  

通常使用SecKeyEncrypt(),在加密前添加kSecPaddingPKCS1填充。如果指定PKCS1,则数据按原样加密。

我读到的方式,明文缓冲区的内容不应该影响加密算法的执行,然而,我的单元测试似乎表明它正在发生,并且缓冲区的第一个字节在某种程度上是至关重要的到操作。我的解决方法似乎在100%的时间内通过了我的单元测试。

在这里有经验的人有没有什么可以帮助我理解发生了什么?我误解了文档吗?我想做一些我不应该做的事吗?我过度简化了吗?

我可以在今晚晚些时候发布代码,一旦我再次访问它,如果有人认为它会有所帮助。

1 个答案:

答案 0 :(得分:2)

使用原始RSA加密时,您的消息 m (表示为整数)必须小于(公共)密钥的模数 n > n e ),否则无法解密,请参阅RSA algorithm的说明:

c = m ^ e (mod n

Padding负责这一点,PKCS#1等标准经过精心设计,可在RSA加密之前安全地填充消息。如果您要求kSecPaddingNone,该函数会假定您知道自己在做什么并为自己提供填充。

请注意,从不使用原始RSA加密,它始终是旨在避免算法弱点的协议的一部分,请参阅" Attacks against plain RSA& #34;