SecKeyEncrypt SecPaddingNone iOS

SecKeyEncrypt SecPaddingNone iOS

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

我基本上是用两个密钥进行加密。第一步,使用密钥 A,使用 SecPaddingPKCS1 并给我一个 256 字节的输出。之后,使用密钥 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 returns blocksize(本例中为 256)字节。如果您加密超过 blocksize 字节,那么数据将被分成多个块,每个块都被加密,因此您将得到 blocksize 字节的倍数。

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

当不使用padding时,blocksize不需要减11,但SwiftyRSA仍然这样做。我已经在不使用填充的情况下进行了 11 字节减少的测试,并且在没有填充的情况下进行了第二次加密,returns 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

    ...