ios - SecKeyEncrypt kSecPaddingNone

标签 ios objective-c encryption

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

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

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

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

当我开始运行测试时,我看到的结果令人沮丧:大约 80% 的时间,它们工作得很好。但另外 20%,SecKeyEncrypt() 失败,OSStatus 为 -50,参数错误。我花了很多时间寻找堆栈损坏、堆损坏、过早释放等问题,但没有结果。

然后我开始研究在普通旧缓冲区上的公钥/私钥对操作,即我做了一个新的单元测试,它试图加密/解密我手动创建和填充的缓冲区。在这一点上,我找到了线索:如果我发送了一个零缓冲区,那么 SecKeyEncrypt 就会陷入死循环。如果我发送一个只有一个的缓冲区,那么它工作正常。如果我用 1 填充缓冲区,然后用零替换第一个字节,我又回到了无限循环。

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

Typically, kSecPaddingPKCS1 is used, which adds PKCS1 padding before encryption. If you specify kSecPaddingNone, the data is encrypted as-is.

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

这里有更多经验的人有什么可以帮助我理解发生了什么吗?我误解了文档吗?我是在尝试做一些我不应该做的事情吗?我是否过于简单化了?

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

最佳答案

当您使用原始 RSA 加密时,您的消息 m(表示为整数)必须小于(公) key 的模数 n(n, e), 否则无法解密,参见 RSA algorithm 的描述:

c = m ^ e (mod n)

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

请注意,您不应永远使用原始 RSA 加密,它始终是旨在避免算法弱点的协议(protocol)的一部分,请参阅“Attacks against plain RSA”。

关于ios - SecKeyEncrypt kSecPaddingNone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18703635/

相关文章:

ios - 在点击手势时调用 UIISlider valueChanged 方法

iphone - iPhone 和 BlackBerry 的共享库

c# - 在 C# 服务器和 PHP 客户端中使用 RSA KeyPair

ios - iOS 中的 Netflix 风格 UIScrollView

ios - 如何在 iOS 9 中使用 3D Touch?当压力变化时它会触发事件吗?

objective-c - 如何使用 UIKit 计算文本的确切高度?

database - Oracle 数据库 11g 使用了哪个 PKCS#11 函数?

c# - 加密包含 key 的查询字符串

iphone - 仪器处理的 NSMutableArray 泄漏警告

objective-c - 访问 DOM Webkit Objective C