无效参数:输入缓冲区太短且填充块无效或损坏

问题描述 投票:0回答:2

我正在尝试使用此代码加密和解密我的应用程序的聊天消息

String decrypt(String encrypted, {String key, String iv}) {
  final key = Key.fromUtf8(key); //hardcode combination of 16 character
  final iv = IV.fromUtf8(iv); //hardcode combination of 16 character

  final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
  Encrypted enBase64 = Encrypted.from64(encrypted);
  final decrypted = encrypter.decrypt(enBase64, iv: iv);
  return decrypted;
}

String encrypt(String value, {String key, String iv}) {
  final key = Key.fromUtf8(key); //hardcode
  final iv = IV.fromUtf8(iv); //hardcode

  final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
  final encrypted = encrypter.encrypt(value, iv: iv);

  return encrypted.base64;
}

出于安全目的,我为您知道的每个聊天室生成了唯一的 16 个字符作为密钥和 iv 例如

String dec = decrypt("encrypted text" {key: "1204581692165412",  iv: "e16ca718048594ce"});
String enc = encrypt("plain text" {key: "1204581692165412",  iv: "e16ca718048594ce"});

但我不断收到错误

Invalid argument(s): Invalid or corrupted pad block
When the exception was thrown, this was the stack
#0      
PKCS7Padding.padCount   
package:pointycastle/paddings/pkcs7.dart:42
#1      
PaddedBlockCipherImpl.doFinal   
package:pointycastle/padded_block_cipher/padded_block_cipher_impl.dart:112
#2  
PaddedBlockCipherImpl.process   
package:pointycastle/padded_block_cipher/padded_block_cipher_impl.dart:74
#3      
AES.decrypt   
package:encrypt/…/algorithms/aes.dart:63
#4      
Encrypter.decryptBytes   
package:encrypt/src/encrypter.dart:25
#5      
Encrypter.decrypt   
package:encrypt/src/encrypter.dart:31

成功加密但在解密时抛出错误该错误来自解密函数

final decrypted = encrypter.decrypt(enBase64, iv: iv);

所以我添加了填充为空

final encrypter = Encrypter(AES(key, mode: AESMode.cbc, padding: null));

我仍然收到另一个错误

E/flutter ( 5888): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: Invalid argument(s): Input buffer too short
E/flutter ( 5888): #0      CBCBlockCipher._encryptBlock (package:pointycastle/block/modes/cbc.dart:72:7)
E/flutter ( 5888): #1      CBCBlockCipher.processBlock (package:pointycastle/block/modes/cbc.dart:67:13)
E/flutter ( 5888): #2      AES._processBlocks (package:encrypt/src/algorithms/aes.dart:73:25)
E/flutter ( 5888): #3      AES.encrypt (package:encrypt/src/algorithms/aes.dart:41:22)
E/flutter ( 5888): #4      Encrypter.encryptBytes (package:encrypt/src/encrypter.dart:12:19)
E/flutter ( 5888): #5      Encrypter.encrypt (package:encrypt/src/encrypter.dart:20:12)
E/flutter ( 5888): #6      encrypt (package:quelib/src/handlers/helpers/encryption.dart:18:31)
E/flutter ( 5888): #7      _ChatBottomInputState.sendChatData (package:quelib/src/pages/home/chat/chatBtm.dart:293:11)
E/flutter ( 5888): #8      _ChatBottomInputState.build.<anonymous closure> (package:quelib/src/pages/home/chat/chatBtm.dart:244:44)
E/flutter ( 5888): #9      _InkResponseState._handleTap (package:flutter/src/material/ink_well.dart:989:21)
E/flutter ( 5888): #10     GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:198:24)
E/flutter ( 5888): #11     TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:608:11)
E/flutter ( 5888): #12     BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:296:5)
E/flutter ( 5888): #13     BaseTapGestureRecognizer.handlePrimaryPointer (package:flutter/src/gestures/tap.dart:230:7)
E/flutter ( 5888): #14     PrimaryPointerGestureRecognizer.handleEvent (package:flutter/src/gestures/recognizer.dart:563:9)
E/flutter ( 5888): #15     PointerRouter._dispatch (package:flutter/src/gestures/pointer_router.dart:94:12)
E/flutter ( 5888): #16     PointerRouter._dispatchEventToRoutes.<anonymous closure> (package:flutter/src/gestures/pointer_router.dart:139:9)
E/flutter ( 5888): #17     _LinkedHashMapMixin.forEach (dart:collection-patch/compact_hash.dart:539:8)
E/flutter ( 5888): #18     PointerRouter._dispatchEventToRoutes (package:flutter/src/gestures/pointer_router.dart:137:18)
E/flutter ( 5888): #19     PointerRouter.route (package:flutter/src/gestures/pointer_router.dart:123:7)
E/flutter ( 5888): #20     GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:439:19)
E/flutter ( 5888): #21     GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:419:22)
E/flutter ( 5888): #22     RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:322:11)
E/flutter ( 5888): #23     GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:374:7)
E/flutter ( 5888): #24     GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:338:5)
E/flutter ( 5888): #25     GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:296:7)
E/flutter ( 5888): #26     GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:279:7)
E/flutter ( 5888): #27     _rootRunUnary (dart:async/zone.dart:1444:13)
E/flutter ( 5888): #28     _CustomZone.runUnary (dart:async/zone.dart:1335:19)
E/flutter ( 5888): #29     _CustomZone.runUnaryGuarded (dart:async/zone.dart:1244:7)
E/flutter ( 5888): #30     _invoke1 (dart:ui/hooks.dart:169:10)
E/flutter ( 5888): #31     PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:293:7)
E/flutter ( 5888): #32     _dispatchPointerDataPacket (dart:ui/hooks.dart:88:31)

来自加密函数

final encrypted = encrypter.encrypt(value, iv: iv);

如果我使用特定的非生成虚拟密钥

String decrypt(String encrypted) {
  final key =
      Key.fromUtf8("1245714587458888"); //hardcode combination of 16 character
  final iv =
      IV.fromUtf8("e16ce888a20dadb8"); //hardcode combination of 16 character

  final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
  Encrypted enBase64 = Encrypted.from64(encrypted);
  final decrypted = encrypter.decrypt(enBase64, iv: iv);
  return decrypted;
}

String encrypt(String value) {
  final key = Key.fromUtf8("1245714587458888"); //hardcode
  final iv = IV.fromUtf8("e16ce888a20dadb8"); //hardcode

  final encrypter = Encrypter(AES(key, mode: AESMode.cbc));
  final encrypted = encrypter.encrypt(value, iv: iv);

  return encrypted.base64;
}

它工作完美,没有任何问题,但这并不安全。所以我想问我的问题是来自我生成的密钥还是来自其他地方。请帮帮我。

注意:正在使用该软件包

encrypt: ^5.0.1

更新:终于修复了 我对 IV 和 Key 使用相同的键值

flutter dart encryption aes
2个回答
3
投票

我也有同样的问题。为了让它为我工作,您有 2 个选项,删除模式设置并让它在设置加密器实例时使用默认的 cic AESMode。如果想使用或者不得不使用cbc模式,需要设置padding:

_encrypter = Encrypter(AES(_key, mode: AESMode.cbc, padding: "PKCS7"));

0
投票

我也遇到了同样的问题很长一段时间,我在chatgpt中得到了解决方案,下面是我为正常工作所做的更改,主要错误是在我正在加密的数据的加密和解密过程中,iv应该是相同的直接解密地图数据,排除一些数据

final iv = IV.fromLength(16); 

  // Function to generate a unique key for a user based on their UID
  encrypt.Key generateKey(String email) {
    final salt = utf8.encode(email); // Convert UID to bytes
    final hashBytes = sha256.convert(salt).bytes; // Generate SHA-256 hash
    return encrypt.Key(Uint8List.fromList(hashBytes)); // Convert hash bytes to Uint8List and return as the key
  }


 Future<Map<String, dynamic>> encryptData(StringkeySalt,Map<Stringdynamic>data) strong textasync {
    final encrypter = Encrypter(AES(await generateKey(keySalt), mode: AESMode.cbc, padding: "PKCS7"));
    final keysToEncrypt = data.keys.toList();
    final iv = IV.fromSecureRandom(16);

    Map<String, dynamic> encryptedData = {};
    for (var key in keysToEncrypt) {
      final value = data[key];
      if (ExcludeKeys(key)) {
        final encrypted = encrypter.encrypt(value, iv: iv);
        encryptedData[key] = base64.encode(iv.bytes) + ":" + encrypted.base64;
      } else {
        encryptedData[key] = value; // Directly store value without encryption
      }
    }
    return encryptedData;
  }

  bool ExcludeKeys(String key) {
    final keysToExclude = ['FCMTOKEN', 'UID'];
    return !keysToExclude.contains(key);
  }

  Future<Map<String, dynamic>> decryptData(String keySalt, Map<String, dynamic> encryptedData) async {
    final encrypter = Encrypter(AES(await generateKey(keySalt), mode: AESMode.cbc, padding: "PKCS7"));
    final keysToDecrypt = encryptedData.keys.toList();

    Map<String, dynamic> decryptedData = {};
    for (var key in keysToDecrypt) {
      final encryptedValue = encryptedData[key];
      if (ExcludeKeys(key)) {
        final ivAndEncrypted = encryptedValue.split(":");
        if (ivAndEncrypted.length != 2) {
          print("Error decrypting value for key: $key. Invalid format.");
          continue; // Skip to the next iteration
        }
        final iv = IV.fromBase64(ivAndEncrypted[0]);
        final encrypted = Encrypted.fromBase64(ivAndEncrypted[1]);
        final decryptedValue = encrypter.decrypt(encrypted, iv: iv);
        decryptedData[key] = decryptedValue;
      } else {
        decryptedData[key] = encryptedValue; // Keep value as it is without decryption
      }
    }
    return decryptedData;
  }```
© www.soinside.com 2019 - 2024. All rights reserved.