gpt4 book ai didi

ios - SecKeyEncrypt SecPaddingNone iOS

转载 作者:行者123 更新时间:2023-12-01 20:05:21 28 4
gpt4 key购买 nike

我正在尝试在 iOS 上进行原始 RSA 加密。请不要试图说服我不要这样做。

我基本上是用两个 key 进行加密。第一步,使用 key A,使用 SecPaddingPKCS1 并给我一个 256 字节的输出。之后,使用 Key B,我使用 SecPaddingNone。我假设我的输出将保持 256 字节,但它变为 512 字节。我不确定我做错了什么,有人知道吗?我想错了吗?

我使用 SwiftyRSA 库来执行加密。

谢谢

编辑代码:

encryptData 函数已从 SwiftyRSA 复制过来。假设 data是256字节,是Key A第一次加密的结果。

let dataString = text.dataUsingEncoding(NSUTF8StringEncoding)
let certificateLabel = "certificate"
let certificateRef = self.getCertificateFromKeyChain(certificateLabel)
let certificateData = self.getDataFromCertificate(certificateRef)
let cryptoImportExportManager = CryptoExportImportManager()
let publicKeyRef = cryptoImportExportManager.importPublicKeyReferenceFromDERCertificate(certificateData)
let encryptedData = self.encryptData(data, publicKey: publicKeyRef!, padding: SecPadding.None)

让我知道是否需要添加更多代码。

谢谢

最佳答案

这是 SwiftyRSA 中的一个错误; RSA 返回 blocksize (在本例中为 256)字节加密后。如果加密超过 blocksize字节然后数据被分成多个 block ,每个 block 都被加密,所以你会得到blocksize的倍数字节回来。

当使用 PKCS1 填充时,有效 block 大小减少了 11 个字节,这意味着加密 256 个字节将返回两个 block 或 512 个字节(因为 256 > 256-11 或 245)。

当不使用填充时, block 大小不需要减少 11,但 SwiftyRSA 仍然这样做。我已经测试了没有使用没有填充的 11 字节减少和第二次加密,没有填充,按预期返回 256 字节。回归测试仍然通过,我已经确认 openssl 可以正确解密双重加密的数据(首先使用填充,然后第二次加密,没有填充)。

这已在 Git 存储库中修复,但如果您想修补本地源代码作为解决方法,修复方法是更改​​ encryptData如下:

// Encrypts data with a RSA key
public func encryptData(data: NSData, publicKey: SecKeyRef, padding: SecP public func encryptData(data: NSData, publicKey: SecKeyRef, padding: SecPadding) throws -> NSData {
let blockSize = SecKeyGetBlockSize(publicKey)

let maxChunkSize = (padding == .None) ? blockSize : blockSize - 11

...

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com