dpcj32769 2016-03-22 10:35
浏览 104

3DES与CBC Swift加密

i need to encrypt my data with 3DES in CBC_MODE. I made easily in PHP language with this code :

//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)));

This is the result:

967F2488AB67FFA2

When i try to make the same code in Swift Language, the Crypt is different, i don't understand what is wrong.

In my iOS Swift project, i make a objectiveC Bridge and imported

#import <CommonCrypto/CommonCrypto.h>

This is my swift code:

    static func Encryption(data:String, key:String, iv:String) -> String
{
    let keyString          = key


    let 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 Method is an extension of String:

 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 is an Extension of 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
}

With this method the Crypt result is:

22F83DAF18EE4ABD

Anyone have an idea?

Thanks in advice

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥20 fluent无法启动
    • ¥15 孟德尔随机化r语言运行问题
    • ¥15 pyinstaller编译的时候出现No module named 'imp'
    • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
    • ¥15 怎么把多于硬盘空间放到根目录下
    • ¥15 Matlab问题解答有两个问题
    • ¥15 LCD12864中文显示
    • ¥15 在使用CH341SER.EXE时不小心把所有驱动文件删除了怎么解决
    • ¥15 gsoap生成onvif框架
    • ¥15 有关sql server business intellige安装,包括SSDT、SSMS。