Обивка PKCS#5 в Swift

Как применить PKCS5 к NSData?

Похоже, об этом пока не так много информации, я нашел это решение Objective-C, которое бы работало, но я ищу более быстрый подход, если это возможно.

Вот моя неудачная попытка:

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 ответа

Решение

Ты можешь использовать 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
}

Я думаю, что @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)
}
Другие вопросы по тегам