Swift中的PKCS#5填充

时间:2014-11-24 19:49:40

标签: swift pkcs#5

如何将PKCS5应用于NSData?

似乎没有太多关于此的信息,我发现这个Objective-C solution可行,但我正在寻找一个更快的"如果可能的话。

这是我失败的尝试:

func pkcs5(data: NSData, blocksize: Int = 16) -> NSMutableData {
    var data = NSMutableData(data: data)
    let count = blocksize - data.length % blocksize

    for _ in 0...count {
        // somehow append the equivalent of chr(count) to data
    }

    return data
}

如果您了解Python,请参阅我尝试复制的功能:

def pkcs5_pad(data, blocksize=16):
    pad_count = blocksize - len(data) % blocksize
    return data + (chr(pad_count) * pad_count).encode('utf-8')

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用appendBytes()

func pkcs5(data: NSData, blocksize: Int = 16) -> NSMutableData {
    var data = NSMutableData(data: data)
    var count = UInt8(blocksize - data.length % blocksize)

    for _ in 0 ..< count {
        data.appendBytes(&count, length: 1)
    }

    return data
}

“技巧”是将count声明为UInt8类型的变量,以便您 可以使用&count传递指针。

或者,您可以先创建一个带填充字节的数组,然后再创建一个数组 一步追加数据:

func pkcs5(data: NSData, blocksize: Int = 16) -> NSData {
    var data = NSMutableData(data: data)
    let count = blocksize - data.length % blocksize
    let padding = [UInt8](count: count, repeatedValue: UInt8(count))
    data.appendBytes(padding, length: count)
    return data
}

答案 1 :(得分:1)

我认为@MartinR答案没问题,但如果你想要更多例子:

使用libc:效果

func pkcs5_mem(data: NSData, blocksize: Int = 16) -> NSData {
    let count = blocksize - data.length % blocksize
    let buf = UnsafeMutablePointer<UInt8>(malloc(UInt(data.length + count)))
    // you should check `buf` is not `nil` here
    memcpy(buf, data.bytes, UInt(data.length))
    memset(buf + data.length, Int32(count), UInt(count))
    return NSData(bytesNoCopy: buf, length: data.length + count)
}

使用NSMutableData:安全轻松

func pkcs5_mutable(data: NSData, blocksize: Int = 16) -> NSData {
    let count = blocksize - data.length % blocksize
    let result = NSMutableData(capacity: data.length + count)!
    result.appendBytes(data.bytes, length: data.length)
    result.appendBytes([UInt8](count: count, repeatedValue: UInt8(count)), length: count)
    return result
}

使用Array作为缓冲区:可能很慢

func pkcs5_array(data: NSData, blocksize: Int = 16) -> NSData {
    let count = blocksize - data.length % blocksize
    var buf = [UInt8]()
    buf.reserveCapacity(data.length + count)
    buf += UnsafeBufferPointer<UInt8>(start: UnsafePointer<UInt8>(data.bytes), count: data.length)
    buf += [UInt8](count: count, repeatedValue: UInt8(count))
    return NSData(bytes: buf, length: buf.count)
}