2016-08-24 56 views
1

我正在嘗試在iOS上執行原始RSA加密。請不要試圖說服我。SecKeyEncrypt SecPaddingNone iOS

我基本上是用兩把鑰匙做加密。第一步,使用密鑰A,使用SecPaddingPKCS1,並給我一個256字節的輸出。之後,使用Key B,我使用SecPaddingNone。我假設我的輸出將保持256字節,但它變成512字節。我不確定我做錯了什麼,有人知道嗎?我在想這個錯嗎?

我使用SwiftyRSA庫來執行加密。

感謝

編輯代碼:

的encryptData功能已經從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) 

讓我知道如果我需要添加更多的代碼。

由於

+0

你能告訴你的代碼? – Paulw11

+0

我加了一些,讓我知道如果我需要更多。 – hockeybro

回答

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 

    ... 
+0

非常感謝!另外,感謝您如此快速地將其修復到回購站! – hockeybro