我正在尝试在iOS上进行Raw RSA加密。请不要尝试让我退出。
我基本上是用两个密钥进行加密。第一步,使用键A,使用SecPaddingPKCS1,并为我提供256个字节的输出。之后,使用密钥B,我使用SecPaddingNone。我假设我的输出将保持256字节,但变为512字节。我不确定自己在做什么错,有人知道吗?我在想这个错误吗?
我使用SwiftyRSA库执行加密。
谢谢
修改代码:
cryptoData函数已从SwiftyRSA复制过来。假定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)
让我知道是否需要添加更多代码。
谢谢
最佳答案
这是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
...
关于ios - SecKeyEncrypt SecPaddingNone iOS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39114114/