Мне нужно зашифровать мои данные с 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
У кого-нибудь есть идея?
Спасибо за совет
Задача ещё не решена.
Других решений пока нет …