在Objective-C和C#中,AES CBC加密和解密结果不同的问题通常是由于填充方式和密钥长度不一致导致的。以下是一种可能的解决方法:
Objective-C示例代码:
#import
// AES CBC加密
+ (NSData *)encryptData:(NSData *)data key:(NSData *)key iv:(NSData *)iv {
NSUInteger dataLength = data.length;
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t encryptedSize = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding,
key.bytes, key.length, iv.bytes,
data.bytes, dataLength,
buffer, bufferSize,
&encryptedSize);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:encryptedSize];
}
free(buffer);
return nil;
}
// AES CBC解密
+ (NSData *)decryptData:(NSData *)data key:(NSData *)key iv:(NSData *)iv {
NSUInteger dataLength = data.length;
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t decryptedSize = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES, kCCOptionPKCS7Padding,
key.bytes, key.length, iv.bytes,
data.bytes, dataLength,
buffer, bufferSize,
&decryptedSize);
if (cryptStatus == kCCSuccess) {
return [NSData dataWithBytesNoCopy:buffer length:decryptedSize];
}
free(buffer);
return nil;
}
C#示例代码:
using System;
using System.Security.Cryptography;
using System.Text;
public static class AESHelper
{
// AES CBC加密
public static byte[] Encrypt(byte[] data, byte[] key, byte[] iv)
{
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = key;
aesAlg.IV = iv;
aesAlg.Padding = PaddingMode.PKCS7;
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
csEncrypt.Write(data, 0, data.Length);
csEncrypt.FlushFinalBlock();
return msEncrypt.ToArray();
}
}
}
}
// AES CBC解密
public static byte[] Decrypt(byte[] data, byte[] key, byte[] iv)
{
using (Aes aesAlg = Aes.Create())
{
aesAlg.Key = key;
aesAlg.IV = iv;
aesAlg.Padding = PaddingMode.PKCS7;
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
using (MemoryStream msDecrypt = new MemoryStream(data))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (MemoryStream msPlain = new MemoryStream())
{
byte[] buffer = new byte[1024];
int bytesRead;
while ((bytesRead = csDecrypt.Read(buffer, 0, buffer.Length)) > 0)
{
msPlain.Write(buffer, 0, bytesRead);
}
return msPlain.ToArray();
}
}
}
}
}
}
确保在Objective-C和C#代码中,使用相同的填充方式(PKCS7Padding)和密钥长度(128位或16字节)以保证加密和解密结果一致。