我正在将PKI api移植到Swift 2.2,发现以下错误。在Objective-C中一切正常。
要加密的数据对象的大小为32字节。这是我正在使用的代码。

let buflen = 64
var cipherBuffer = UnsafeMutablePointer<UInt8>.alloc(buflen)
cipherBuffer[buflen] = 0 // zero terminate

var cipherLength: Int = 0

var statusCode: OSStatus?

let dataPointer = UnsafePointer<UInt8>(data.bytes)

statusCode = SecKeyEncrypt(publicKey, SecPadding.PKCS1, dataPointer, data.length, cipherBuffer, &cipherLength)

这将导致错误-50和0密码长度。
我正在对公钥和数据指针进行hexdump,以确保它们正常,但找不到SecKeyEncrypt调用的问题
任何帮助都将不胜感激

最佳答案

经过一番研究,我找到了这个问题的解决办法
我使用alloc和zero终止数组来创建cipherBuffer,如下所示:

let buflen = 64
var cipherBuffer = UnsafeMutablePointer<UInt8>.alloc(buflen)
cipherBuffer[buflen] = 0 // zero terminate

我尝试了下面的方法,效果很好。
let blockSize = SecKeyGetBlockSize(publicKey) //64
var cipherBuffer = [UInt8](count: Int(blockSize), repeatedValue: 0)

考虑到这两种方法都使用hexDump报告了一个64字节、0x00的块,我做了一个快速测试并查看了前面的代码,发现删除“cipherBuffer[buflen]=0”的行可以解决问题。
这似乎与数组的零终止有关,否则我可能做了一些奇怪的事情。

10-08 04:16