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;
   }
 }

posted @ 2024-02-22 00:21  hczhhm  阅读(344)  评论(0编辑  收藏  举报