SecKeyEncrypt SecPaddingNone iOS

时间:2016-08-24 03:49:45

标签: ios security encryption rsa

我正在尝试在iOS上进行Raw RSA加密。请不要试着说服我。

我基本上用两把钥匙加密。第一步,使用密钥A,使用SecPaddingPKCS1并给我一个256字节的输出。之后,使用密钥B,我使用SecPaddingNone。我假设我的输出将保持256字节,但它变为512字节。我不确定我做错了什么,有人知道吗?我在考虑这个错误吗?

我使用SwiftyRSA库来执行加密。

由于

编辑代码:

已从SwiftyRSA复制encryptData函数。假设data是256个字节,并且是密钥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)

如果我需要添加更多代码,请告诉我。

由于

1 个答案:

答案 0 :(得分:2)

这个是SwiftyRSA中的一个错误; RSA在加密后返回blocksize(在本例中为256)个字节。如果加密超过blocksize个字节,则数据将被拆分为多个块,每个块都是加密的,因此您将获得多个blocksize个字节。

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

当没有使用填充时,块大小不需要减少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

    ...