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

问题描述

我有一个C#代码,实际上是在iOS Swift上将其转换的。

我在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,DataToDecrypt.Length);
    }
    finally
    {
        TDESAlgorithm.Clear();
        HashProvider.Clear();
    }
    return UTF8.GetString(Results);
}

我需要迅速进行转换。

base64中的输入文本=> GnLk5ckyMNaobmIMPxgiRa1SfvPfhwUd

输出文本必须是=> 283637 $ 11 $$$$ DemoFr

我尝试使用以下代码:

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()
    }
}

但是输出不正确。

输出与示例不同。

我需要一些帮助。

谢谢。

[编辑]

只需解决有关MD5密钥的一个问题 转换为字符串会使密钥的大小不合适(通常为16个字节,但是如果转换为字符串,则密钥为32个字节) 但是错误仍然存​​在,我的输出必须是283637 $ 11 $$$$ DemoFr(19个字节),但是我有一些奇怪的字符D \ u {08} \ u {1B}] \ u {14} \ n!。 (24个字节)

解决方法

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...