3DES с шифрованием CBC Swift

Мне нужно зашифровать мои данные с 3DES в CBC_MODE.
Я легко сделал на языке PHP с этим кодом:

//Key for Crypt
$key = '324359ECE67B213FE4342EC143F6EB87324359ECE67B213F';
$key = pack('H*', $key);

//Initial Vector
$iv = '02021105';
//String to Crypt
$data_value = '1234567';

// Crypt della stringa
$crypt = strtoupper(bin2hex(mcrypt_encrypt(MCRYPT_3DES, $key,$data_value, MCRYPT_MODE_CBC, $iv)));

Это результат:

967F2488AB67FFA2

Когда я пытаюсь сделать один и тот же код на языке Swift, Crypt отличается, я не понимаю, что не так.

В моем проекте iOS Swift я сделал мост targetC и импортировал

#import <CommonCrypto/CommonCrypto.h>

Это мой быстрый код:

    static func Encryption(data:String, key:String, iv:String) -> String
{
let keyString          = keylet keyData: NSData! = keyString.hex2bin(key)
let keyBytes         = UnsafeMutablePointer<Void>(keyData.bytes

var message = data

if(message.length%8 != 0)
{
while message.length%8 != 0 {
message = message+"\0"}
}

let data: NSData! = (message as NSString).dataUsingEncoding(NSUTF8StringEncoding) as NSData!
let dataLength    = size_t(data.length)
let dataBytes     = UnsafeMutablePointer<Void>(data.bytes)

let cryptData    = NSMutableData(length: Int(dataLength) + kCCBlockSize3DES)
let cryptPointer = UnsafeMutablePointer<Void>(cryptData!.mutableBytes)
let cryptLength  = size_t(cryptData!.length)

let keyLength              = size_t(kCCKeySize3DES)
let operation: CCOperation = UInt32(kCCEncrypt)
let algoritm:  CCAlgorithm = UInt32(kCCAlgorithm3DES)
let options:   CCOptions   = UInt32() //Default value is CBC_MODE

var numBytesEncrypted :size_t = 0

let cryptStatus = CCCrypt(operation,
algoritm,
options,
keyBytes, keyLength,
iv,
dataBytes, dataLength,
cryptPointer, cryptLength,
&numBytesEncrypted)
print(cryptStatus)
if UInt32(cryptStatus) == UInt32(kCCSuccess) {

cryptData!.length = Int(numBytesEncrypted)

let hexString = cryptData?.hexString

return hexString!.uppercaseString

} else {

print("Error: \(cryptStatus)")

return "0"}
}

Метод HEX2BIN является расширением строки:

 func hex2bin(hex: String, ignore: String? = nil) -> NSData? {
guard let hexData = hex.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) else {
return nil
}
let hexDataLen = hexData.length
let binDataCapacity = hexDataLen / 2
guard let binData = NSMutableData(length: binDataCapacity) else {
return nil
}
var binDataLen: size_t = 0
let ignore_cstr = ignore != nil ? (ignore! as NSString).UTF8String : nil

binData.length = Int(binDataLen)
return binData
}

HEXSTRING является расширением NSData:

var hexString : String {
let buf = UnsafePointer<UInt8>(bytes)
let charA = UInt8(UnicodeScalar("a").value)
let char0 = UInt8(UnicodeScalar("0").value)

func itoh(i: UInt8) -> UInt8 {
return (i > 9) ? (charA + i - 10) : (char0 + i)
}

var p = UnsafeMutablePointer<UInt8>.alloc(length * 2)

for i in 0..<length {
p[i*2] = itoh((buf[i] >> 4) & 0xF)
p[i*2+1] = itoh(buf[i] & 0xF)
}

return NSString(bytesNoCopy: p, length: length*2, encoding: NSUTF8StringEncoding, freeWhenDone: true)! as String
}

С этим методом результат Crypt:

22F83DAF18EE4ABD

У кого-нибудь есть идея?

Спасибо за совет

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …