[英]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.