2016-08-16 4 views
0

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, 무작위 iv 및 PBKDF2가있는 CBC 모드를 사용하십시오.

+0

이 함수는 항상 다른 데이터로 주어집니다. 어떻게 해독 할 수 있습니까? –

+0

@PiyushSanepara 명확하지 않지만 [mcve]와 함께 새로운 질문을하고 문제에 대한 설명을하십시오. – zaph