Обивка 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)
}