简体   繁体   English

C# 将 3DES 方法解密为 Swift 语言

[英]C# Decrypt 3DES method to Swift language

I have a code in C# and I actually convert it on iOS Swift.我在 C# 中有一个代码,实际上我在 iOS Swift 上转换了它。

I have this function in C#:我在 C# 中有这个函数:

public static string DecryptString(string Message)
{
    byte[] Results;
    System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
    MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
    byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes("XXXXXXXXXX"));
    TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
    TDESAlgorithm.Key = TDESKey;
    TDESAlgorithm.Mode = CipherMode.ECB;
    TDESAlgorithm.Padding = PaddingMode.PKCS7;
    byte[] DataToDecrypt = Convert.FromBase64String(Message);
    try
    {
        ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
        Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
    }
    finally
    {
        TDESAlgorithm.Clear();
        HashProvider.Clear();
    }
    return UTF8.GetString(Results);
}

And I need to convert it in swift.我需要快速转换它。

The input text in base64 => GnLk5ckyMNaobmIMPxgiRa1SfvPfhwUd base64 中的输入文本 => GnLk5ckyMNaobmIMPxgiRa1SfvPfhwUd

The output text must be this => 283637$11$$$$DemoFr输出文本必须是这个 => 283637$11$$$$DemoFr

I try to use this code:我尝试使用此代码:

let base64Encoded = "GnLk5ckyMNaobmIMPxgiRa1SfvPfhwUd"
let decodedData = Data(base64Encoded: base64Encoded ?? "")!
let md5key = "XXXXXXXXXX".md5.data(using: .utf8)
let decodedDataTDES = self.decryptWith3DES_ECB(decryptData: decodedData, keyData: md5key!)
let strdata = String(decoding: decodedDataTDES!, as:UTF8.self)
                    
func decryptWith3DES_ECB(decryptData: Data, keyData: Data) -> Data?{
            
    let mydata_len : Int = decryptData.count
    let keyData : Data = keyData
    let buffer_size : size_t = mydata_len+kCCBlockSize3DES
    let buffer = UnsafeMutablePointer<NSData>.allocate(capacity: buffer_size)
    var num_bytes_encrypted : size_t = 0
    let operation: CCOperation = UInt32(kCCDecrypt)
    let algoritm:  CCAlgorithm = UInt32(kCCAlgorithm3DES)
    let options:   CCOptions   = UInt32(kCCOptionECBMode+kCCOptionPKCS7Padding)
    let keyLength        = size_t(kCCKeySize3DES)
    let decrypt_status : CCCryptorStatus = CCCrypt(operation, algoritm, options, (keyData as NSData).bytes, keyLength, nil, (decryptData as NSData).bytes, mydata_len, buffer, buffer_size, &num_bytes_encrypted)
    if UInt32(decrypt_status) == UInt32(kCCSuccess){
        
        let myResult : Data = Data(bytes: buffer, count: num_bytes_encrypted)
        free(buffer)
        return myResult
    }else{
        free(buffer)
        return nil
    }
}

extension String {
    var md5: String {
        let data = Data(self.utf8)
        let hash = data.withUnsafeBytes { (bytes: UnsafeRawBufferPointer) -> [UInt8] in
            var hash = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
            CC_MD5(bytes.baseAddress, CC_LONG(data.count), &hash)
            return hash
        }
        return hash.map { String(format: "%02x", $0) }.joined()
    }
}

But the output is not ok.但是输出不正常。

The output is not like in example.输出与示例中不同。

I need a bit help.我需要一点帮助。

Thanks in advance.提前致谢。

[EDIT] [编辑]

Just fix one problem about MD5 key Convert to string make the key with not a good size (normaly 16 bytes but if you convert to String it makes 32 bytes) but bug still here, my output must be 283637$11$$$$DemoFr (19 bytes) but I have something with strange chars D\\u{08}\\u{1B}]\\u{14}\\n!.只需解决一个关于 MD5 密钥的问题 Convert to string 使密钥的大小不合适(通常为 16 字节,但如果您转换为 String 则为 32 字节)但错误仍然存​​在,我的输出必须是 283637$11$$$$DemoFr ( 19 个字节)但我有一些奇怪的字符 D\\u{08}\\u{1B}]\\u{14}\\n!。 (24 bytes) (24 字节)

找到了解决方案,密钥必须是一个 24 字节的密钥,所以只需在我的密钥开头再追加 8 个字节就可以了!

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM