2016-08-16 3 views
0

Im ищет шифрование и дешифрование кода в SWIFT.Шифрование и дешифрование в SWIFT

Но я не могу найти решение в SWIFT. Мне нужно передать ключ для шифрования/дешифрования в MD5 и конвертировать в BASE64 в режиме ECB!

У меня есть этот код в C#:

public static string MD5Cripto(string texto, string chave) 
{ 
    try 
    { 
    TripleDESCryptoServiceProvider sObCripto 
         = new TripleDESCryptoServiceProvider(); 
    MD5CryptoServiceProvider sObjcriptoMd5 = new MD5CryptoServiceProvider(); 
    byte[] sByteHash, sByteBuff; 
    string sTempKey = chave; 

    sByteHash = sObjcriptoMd5.ComputeHash(ASCIIEncoding 
        .UTF8.GetBytes(sTempKey)); 
    sObjcriptoMd5 = null; 
    sObCriptografaSenha.Key = sByteHash; 
    sObCriptografaSenha.Mode = CipherMode.ECB; 

    sByteBuff = ASCIIEncoding.UTF8.GetBytes(texto); 
    return Convert.ToBase64String(sObCripto.CreateEncryptor() 
        .TransformFinalBlock(sByteBuff, 0, sByteBuff.Length)); 
    } 
    catch (Exception ex) 
    { 
    return "Digite os valores Corretamente." + ex.Message; 
    } 
} 

UPDATE:

Я стараюсь это, но до сих пор не работает .. Что Я делаю не так? (Игнорировать мои отпечатки ..)

func myEncrypt(encryptData:String) -> NSData? 
{ 
    let myKeyData : NSData = ("mykey" as NSString) 
        .dataUsingEncoding(NSUTF8StringEncoding)! 
    let myKeyDataMD5 = "mykey".md5() 
    let sArrayByte = myKeyDataMD5.hexToByteArray() 
    let myRawData : NSData = encryptData.dataUsingEncoding(NSUTF8StringEncoding)! 

    let buffer_size:size_t = myRawData.length + kCCBlockSize3DES 
    let 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) 

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

    if Int32(Crypto_status) == Int32(kCCSuccess) 
    { 
     let myResult: NSData = NSData(bytes: buffer, length: num_bytes_encrypted) 
     print("buffer") 

     let count = myResult.length/sizeof(UInt32) 
     var array = [UInt32](count: count, repeatedValue: 0) 
     myResult.getBytes(&array, length:count * sizeof(UInt32)) 

     print(array) 

     free(buffer) 
     print("myResult") 
     print(myResult) 

     let resultNSString = NSString(data: myResult, 
        encoding: NSUnicodeStringEncoding)! 
     let resultString = resultNSString as String 
     print("resultString") 
     print(resultString) 
     let sBase64 = toBase64(String(resultString)) 
     print("sBase64") 
     print(sBase64) 

     let data : NSData! = resultNSString 
        .dataUsingEncoding(NSUnicodeStringEncoding) 
     let count2 = data.length/sizeof(UInt32) 
     var array2 = [UInt32](count: count, repeatedValue: 0) 
     data.getBytes(&array2, length:count2 * sizeof(UInt32)) 
     print("array2") 
     print(array2) 

     return myResult 
    } 
    else 
    { 
     free(buffer) 
     return nil 
    } 

}

+2

Пожалуйста, отформатируйте свой код, чтобы он не прокручивался. – zhon

+1

MD5 является (слабым) алгоритмом хэширования, а не алгоритмом шифрования. – zhon

+0

Я не могу редактировать без кода форматирования! И я знаю, что хэш слаб, но мне нужно использовать этот способ, этот код используется в других версиях приложения на C#, Android и VB6. –

ответ

0

Пример кода вопрос обновляется.
Не знаете, что пытался выполнить код форматирования вывода в вопросе.

Обратите внимание, что 3DES использует 24-байтовый ключ (kCCKeySize3DES - 24), а MD5 обеспечивает 16-байтовый результат (CC_MD5_DIGEST_LENGTH - 16), поэтому существует неверная совпадение длины ключа.

func encrypt(dataString:String, keyString:String) -> NSData? 
{ 
    let keyData = md5(keyString) 
    let data : NSData = dataString.dataUsingEncoding(NSUTF8StringEncoding)! 
    var numBytesEncrypted : size_t = 0 
    var encryptedData: NSMutableData! = NSMutableData(length: Int(data.length) + kCCBlockSize3DES) 
    let encryptedPointer = UnsafeMutablePointer<UInt8>(encryptedData.mutableBytes) 
    let encryptedLength = size_t(encryptedData.length) 

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

    let status: CCCryptorStatus = CCCrypt(operation, algoritm, options, 
              keyData, keyLength, 
              nil, 
              data.bytes, data.length, 
              encryptedPointer, encryptedLength, 
              &numBytesEncrypted) 
    if Int32(status) == Int32(kCCSuccess) { 
     encryptedData.length = Int(numBytesEncrypted) 
    } 
    else { 
     encryptedData = nil 
    } 

    return encryptedData; 
} 

func md5(string: String) -> [UInt8] { 
    var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0) 
    if let data = string.dataUsingEncoding(NSUTF8StringEncoding) { 
     CC_MD5(data.bytes, CC_LONG(data.length), &digest) 
    } 
    return digest 
} 

Тест:

let dataString = "Now is the time" 
let keyString = "mykey" 
let encryptedData = encrypt(dataString, keyString:keyString) 
print("encryptedData: \(encryptedData!)") 

let encryptedBase64 = encryptedData!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions()) 
print("encryptedBase64: \(encryptedBase64)") 

Выход:

EncryptedData: 8d88a2bc 00beb021 f37917c3 75b0ba1a
encryptedBase64: jYiivAC + sCHzeRfDdbC6Gg ==

Примечание:

3DES, режим ECB и MD5 не рекомендуются и не должны использоваться в новом коде, вместо этого используйте режим AES, CBC с случайным iv и PBKDF2.

+0

Эта функция дает всегда разные данные, как я могу ее расшифровать? –

+0

@PiyushSanepara Это непонятно, задайте новый вопрос с [mcve] и описанием проблемы. – zaph

Смежные вопросы