Шифрование MD5 3DES Swift

У меня есть приложение, которое должно отправлять учетные данные для входа, которые были зашифрованы сначала MD5, а затем 3DES.

Мне удалось использовать CryptoSwift для шифрования строки с помощью MD5. Однако я не могу найти ничего для шифрования с помощью 3DES на Swift.

Я пробовал CommonCrypto. Насколько я могу судить, это на C, но его можно импортировать в Objective C с соединительным заголовком.

Я нашел несколько статей и руководств, в которых рассказывается, как импортировать CommonCrypto в Swift либо с помощью связующего заголовка (с предупреждением, что он не будет работать с фреймворками), либо с помощью Model.map. Однако ни один из них не работает. Я не уверен, является ли это ограничением в последних версиях iOS или Xcode.

Может кто-нибудь посоветовать альтернативу?

Спасибо

ОТРЕДАКТИРОВАНО

Привет, пожалуйста, ознакомьтесь с приведенными ниже шагами, которые я предпринял

  1. Итак, я создал новый проект под названием newEncrypt.
  2. Я решил не использовать параметр заголовка, поскольку в инструкциях говорится, что это ограничено приложениями, отличными от Framework/
  3. Я создал внутри newEncrypt папку под названием CommonCrypto с файлом module.map внутри. содержимое которого: модуль CommonCrypto [система] { заголовок "/usr/include/CommonCrypto/CommonCrypto.h" экспорт * }
  4. добавлен ${SRCROOT}/CommonCrypto для быстрых путей компилятора-поиска-импорта. Отладить и выпустить.
  5. На этом инструкции как бы обрываются. Я предполагаю, что мне нужно импортировать CommonCrypto в мой класс. Эта ошибка с «не удалось построить объектный модуль C «CommonCrypto». Я также предполагаю, что у меня должны быть файлы библиотеки CommonCrypto (из папки «include» CommonCryto) в «/usr/include/CommonCrypto/CommonCrypto.h» или «/newEncrypt/CommonCrypto/CommonCrypto.h»? Я пробовал это, но Я просто получаю те же ошибки.
  6. Затем я попытался добавить заголовочный файл с помощью #import и добавил -lfoo к другим флагам отладки и выпуска компоновщика (хотя это может быть неправильным) на случай, если это все еще может потребоваться. Но я все равно получаю так же не могу построить объектив c ошибкой. Я уверен, что делаю что-то не так, это очевидно

person ThundercatChris    schedule 15.07.2015    source источник
comment
Конечно, можно импортировать CommonCrypto в Swift, хотя это утомительно. Как вы заметили, вы нашли несколько сайтов, объясняющих этот процесс. Не зная, что вы пробовали и с какими проблемами столкнулись, невозможно понять, какой была бы альтернатива. ни один из них не работает, не говорит нам, в чем ваша проблема.   -  person Rob Napier    schedule 15.07.2015
comment
MD5 — это хэш, а не шифрование, и его можно легко отменить с помощью таблиц поиска (md5.gromweb.com).   -  person David Skrundz    schedule 15.07.2015
comment
Спасибо, что так быстро ответили. Я подписался на spin.atomicobject.com/2015/02/23/c -libraries-swift для одного. Я попытался добавить файл Model.map с модулем CommonCrypto [system] {header /usr/include/CommonCrypto/CommonCrypto.h export *} в качестве содержимого в папке CommonCrypto в проекте. Я добавил библиотеку CommonCrypto в то же место, а также в папку include в папке пользователя. Я также добавил местоположение в путь импорта быстрого компилятора.   -  person ThundercatChris    schedule 15.07.2015
comment
@ThundercatChris Ваша связанная статья выглядит нормально. Да, это должно сработать. Вы должны обновить свой вопрос, чтобы точно объяснить, что вы сделали и с какой именно проблемой вы столкнулись (какая ошибка? какой симптом? вы получаете предупреждение? ваш компьютер загорается?) Вы должны начать с пустого проекта и попрактикуйтесь в том, чтобы CommonCrypto связывался, прежде чем пробовать его в реальном проекте.   -  person Rob Napier    schedule 15.07.2015
comment
@RobNapier Я отредактировал свой исходный вопрос, включив в него шаги, которые я предпринял в новом проекте.   -  person ThundercatChris    schedule 16.07.2015
comment
Привет, я все еще не с этим. Кто-нибудь может помочь, пожалуйста?   -  person ThundercatChris    schedule 20.07.2015
comment
ПРЕДУПРЕЖДЕНИЕ. Имейте в виду, что использование MD5 и 3DES могло быть приемлемым в восьмидесятых, но MD5 считается неработоспособным, а 3DES считается безопасным только в определенных обстоятельствах. Пожалуйста, используйте этот Q/A только для совместимости с древними системами.   -  person Maarten Bodewes    schedule 23.09.2019


Ответы (1)


Так что получается, что я полностью усложнил это.

Уже есть действительно полезная статья http://www.stackoverflow.dluat.com/questions/31004609/how-to-convert-common-crypto-code-from-objective-c-to-swift

Мне не нужно было импортировать какие-либо внешние библиотеки или SDK, все, что мне было нужно, это соединительный заголовок и #import <CommonCrypto/CommonCrypto.h>

override func viewDidLoad() {
    super.viewDidLoad()
    myEncrypt("my string to encrypt") 
}

func myEncrypt(encryptData:String) -> NSData?{

        var myKeyData : NSData = ("myEncryptionKey" as NSString).dataUsingEncoding(NSUTF8StringEncoding)!
        var myRawData : NSData = encryptData.dataUsingEncoding(NSUTF8StringEncoding)!
        var iv : [UInt8] = [56, 101, 63, 23, 96, 182, 209, 205]  // I didn't use
        var buffer_size : size_t = myRawData.length + kCCBlockSize3DES
        var buffer = UnsafeMutablePointer<NSData>.alloc(buffer_size)
        var num_bytes_encrypted : size_t = 0

        let operation: CCOperation = UInt32(kCCEncrypt)
        let algoritm:  CCAlgorithm = UInt32(kCCAlgorithm3DES)
        let options:   CCOptions   = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
        let keyLength        = size_t(kCCKeySize3DES)

        var Crypto_status: CCCryptorStatus = CCCrypt(operation, algoritm, options, myKeyData.bytes, keyLength, nil, myRawData.bytes, myRawData.length, buffer, buffer_size, &num_bytes_encrypted)

        if UInt32(Crypto_status) == UInt32(kCCSuccess){

            var myResult: NSData = NSData(bytes: buffer, length: num_bytes_encrypted)

            free(buffer)
            println("my result \(myResult)") //This just prints the data

            let keyData: NSData = myResult
            let hexString = keyData.toHexString()
            println("hex result \(hexString)") // I needed a hex string output


            myDecrypt(myResult) // sent straight to the decryption function to test the data output is the same
            return myResult
        }else{
            free(buffer)
            return nil
        }   
    }


func myDecrypt(decryptData : NSData) -> NSData?{

    var mydata_len : Int = decryptData.length
    var keyData : NSData = ("myEncryptionKey" as NSString).dataUsingEncoding(NSUTF8StringEncoding)!

    var buffer_size : size_t = mydata_len+kCCBlockSizeAES128
    var buffer = UnsafeMutablePointer<NSData>.alloc(buffer_size)
    var num_bytes_encrypted : size_t = 0

    var iv : [UInt8] = [56, 101, 63, 23, 96, 182, 209, 205]  // I didn't use

    let operation: CCOperation = UInt32(kCCDecrypt)
    let algoritm:  CCAlgorithm = UInt32(kCCAlgorithm3DES)
    let options:   CCOptions   = UInt32(kCCOptionECBMode + kCCOptionPKCS7Padding)
    let keyLength        = size_t(kCCKeySize3DES)

    var decrypt_status : CCCryptorStatus = CCCrypt(operation, algoritm, options, keyData.bytes, keyLength, nil, decryptData.bytes, mydata_len, buffer, buffer_size, &num_bytes_encrypted)

    if UInt32(decrypt_status) == UInt32(kCCSuccess){

        var myResult : NSData = NSData(bytes: buffer, length: num_bytes_encrypted)
        free(buffer)
        println("decrypt \(myResult)")

        var stringResult = NSString(data: myResult, encoding:NSUTF8StringEncoding)
        println("my decrypt string \(stringResult!)")
        return myResult
    }else{
        free(buffer)
        return nil

    }
}

Я надеюсь, что это поможет кому-то.

person ThundercatChris    schedule 12.08.2015
comment
Я сделал то же самое, что и выше. Но я не могу расшифровать текст из зашифрованных данных. Можете ли вы обновить ответ с расшифровкой текста? - person Balaji Ramakrishnan; 08.12.2016
comment
@BalajiRamakrishnan Я не получаю 50% времени. - person 6rchid; 03.07.2021