我正在尝试在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)
如果我需要添加更多代码,请告诉我。
由于
答案 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
...