IOS:如何在swift中使用RSA公钥解密密码?

IOS:如何在swift中使用RSA公钥解密密码?,swift,encryption,rsa,public-key,Swift,Encryption,Rsa,Public Key,我想使用公钥解密。但它不起作用。有人能帮我吗 discShadow\u DecryptionWithRSAKey是从服务器获取数据的委托方法。 请查找下面的代码片段以了解更多信息。我使用RSA进行加密和解密 private class func discShadow_DecryptionWithRSAKey(encryptedData:Data,rsaKeyRef:SecKey,padding:SecPadding) -> Data? { let blockSize = SecKe

我想使用公钥解密。但它不起作用。有人能帮我吗

discShadow\u DecryptionWithRSAKey
是从服务器获取数据的委托方法。 请查找下面的代码片段以了解更多信息。我使用RSA进行加密和解密

private class func discShadow_DecryptionWithRSAKey(encryptedData:Data,rsaKeyRef:SecKey,padding:SecPadding) -> Data? {
    let blockSize = SecKeyGetBlockSize(rsaKeyRef)

    var encryptedDataAsArray = [UInt8](repeating: 0, count: encryptedData.count / MemoryLayout<UInt8>.size)
        (encryptedData as NSData).getBytes(&encryptedDataAsArray, length: encryptedData.count)

    var decryptedData = [UInt8](repeating: 0, count: 0)
    var idx = 0
    while (idx < encryptedDataAsArray.count ) {
        var idxEnd = idx + blockSize
        if ( idxEnd > encryptedDataAsArray.count ) {
            idxEnd = encryptedDataAsArray.count
        }
        var chunkData = [UInt8](repeating: 0, count: blockSize)
        for i in idx..<idxEnd {
            chunkData[i-idx] = encryptedDataAsArray[i]
        }

        var decryptedDataBuffer = [UInt8](repeating: 0, count: blockSize)
        var decryptedDataLength = blockSize

        let status = SecKeyDecrypt(rsaKeyRef, padding, chunkData, idxEnd-idx, &decryptedDataBuffer, &decryptedDataLength)
        if ( status != noErr ) {
            return nil
        }

        var idxFirstZero = -1
        var idxNextZero = decryptedDataBuffer.count
        for i in 0..<decryptedDataBuffer.count {
            if ( decryptedDataBuffer[i] == 0 ) {
                if ( idxFirstZero < 0 ) {
                    idxFirstZero = i
                } else {
                    idxNextZero = i
                    break
                }
            }
        }
        var newData = [UInt8](repeating: 0, count: idxNextZero-idxFirstZero-1)
        for i in idxFirstZero+1..<idxNextZero {
            newData[i-idxFirstZero-1] = decryptedDataBuffer[i]
        }

        decryptedData += newData

        idx += blockSize
    }

    return Data(bytes: UnsafePointer<UInt8>(decryptedData), count: decryptedData.count)
}
私有类func discShadow\u使用rsakey解密(encryptedData:Data,rsaKeyRef:SecKey,padding:SecPadding)->数据?{
let blockSize=SecKeyGetBlockSize(rsaKeyRef)
var encrypteddatasarray=[UInt8](重复:0,计数:encryptedData.count/MemoryLayout.size)
(encryptedData作为NSData)。getBytes(&encryptedData数组,长度:encryptedData.count)
var decryptedData=[UInt8](重复:0,计数:0)
var idx=0
while(idxencrypteddatasarray.count){
idxEnd=encryptedDataAsArray.count
}
var chunkData=[UInt8](重复:0,计数:blockSize)

对于idx中的i..欢迎使用SO!请解释什么不起作用。另请参见此处:。You loop表示您尝试将流拆分为块,并使用RSA对每个块进行加密。RSA不适用于流。它可用于加密和解密对称密钥,而对称密钥反过来又可用于流。因此通常使用publ消息接收方的ic密钥用于加密新的随机对称密钥,通过对称算法对消息本身进行加密,然后将加密密钥和任意大小的加密消息的组合发送给接收方。接收方使用其私钥解密密钥,并使用对称算法解密有效负载