flutter ASE加解密以及与ios端的加解密方法的兼容互通
ios端加密解密方法:
//加密
(NSData *)aes256EncryptWithKey(NSData *data,NSString *key){
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[data bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer); //free the buffer;
return nil;
}
//解密
(NSData *)aes256DecryptWithKey(NSData *data,NSString *key){
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[data bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
}
free(buffer); //free the buffer;
return nil;
}
flutter端aes加密需要依赖第三方包:encrypt
flutter端加密解密:
///String encryptString = UntilTool.aes256EncryptUint8ListFromString(context,encipherKey)
///
///FunctionName: 密码加密 String加密成 Uint8List
///context: 原文 encipherKey:加密key
Uint8List aes256EncryptUint8ListFromString(
String context, String encipherKey) {
if (context.isEmpty) {
return Uint8List(0);
} else {
Uint8List encryptedUint8List = utf8.encode(context);
final key = Key.fromUtf8(encipherKey);
final iv = IV.allZerosOfLength(16);
final encrypter = Encrypter(AES(
key,
mode: AESMode.cbc,
));
final encrypted = encrypter.encryptBytes(encryptedUint8List, iv: iv);
return encrypted.bytes;
}
}
///String encryptString = UntilTool.aes256DecryptUint8ListToString(encryptedUint8List,encipherKey)
///
///FunctionName: 密码解密 Uint8List 解密成 String
///encryptedUint8List: 密文 encipherKey:解密key
String aes256DecryptUint8ListToString(
Uint8List encryptedUint8List, String encipherKey) {
if (encryptedUint8List.length == 0) {
return '';
} else {
final key = Key.fromUtf8(encipherKey);
final iv = IV.allZerosOfLength(16);
final encrypted = Encrypted(encryptedUint8List);
final encrypter = Encrypter(AES(
key,
mode: AESMode.cbc,
));
final decrypted = encrypter.decryptBytes(encrypted, iv: iv);
Uint8List deUint8List = Uint8List.fromList(decrypted);
String deStr = Utf8Decoder(allowMalformed: true).convert(deUint8List);
return deStr;
}
}