- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在尝试将 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 addsPKCS1
padding before encryption. If you specifykSecPaddingNone
, 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/
在尝试将 SecKeyEncrypt() 与 kSecPaddingNone 一起使用时,我遇到了一些挫折。经过大量调查,我找到了解决方法,但我想知道发生了什么。目前,我没有可用的代码,但我可以在今天
我正在尝试在 iOS 上进行原始 RSA 加密。请不要试图说服我不要这样做。 我基本上是用两个 key 进行加密。第一步,使用 key A,使用 SecPaddingPKCS1 并给我一个 256 字
从我的观察可以看出,苹果安全框架中SecKeyEncrypt方法的各种填充值不支持SHA512哈希摘要的OAEP填充。实际上,我似乎无法确定SecKeyEncrypt方法是否在CBC过程中对每个块进行
任何人请帮助从指数和模数创建SecKeyRef作为我的公共(public)指数 = 010001和 公共(public)模数 =008903fb6d15f352ed3b45add3216f632f71
我尝试使用 iPhone 的 PKI 库来加密一个短字符串 (12345678),但每当我尝试使用 SecKeyEncrypt 时,我总是收到错误 -9809(即 errSSLCrypto)。 Sec
对于 iPad 应用程序(ios5.0,arc),我需要加密传输到我正在使用的 Web 服务的数据。在阅读有关通过 Apple 提供的加密时,我遇到了两个 API 来执行此操作:CCCrypt 和 S
我正在将 PKI api 移植到 Swift 2.2 并发现以下错误。在 Objective-C 中一切正常。 要加密的数据对象大小为 32 字节。这是我正在使用的代码。 let buflen = 6
当尝试使用 SecKeyCreateEncryptedData 加密纯数据 block 时,它使用指定的算法加密纯数据并且工作正常。我用于加密的代码片段是 SecKeyCreateEncryptedD
我正在尝试使用 iOS 上的安全框架使用 RSA 加密一些数据。我想加密一个简单的 base64 编码字符串,如下所示: NSData *data = [[NSData alloc] initWith
我正在使用 SecKeyEncrypt 将 JSON 格式的字符串作为输入。如果向 SecKeyEncrypt 传递一个小于 246 的 plainTextLength,它就可以工作。如果我传递给它的
我是一名优秀的程序员,十分优秀!