I have a code in C# and I actually convert it on iOS Swift.
I have this function in 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
The output text must be this => 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!. (24 bytes)