如何解决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个字节就可以了!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。