首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无效参数:输入缓冲区太短,无效或损坏垫块

无效参数:输入缓冲区太短,无效或损坏垫块
EN

Stack Overflow用户
提问于 2022-01-22 22:29:43
回答 1查看 1K关注 0票数 1

我试图使用以下代码加密和解密我的应用程序的聊天消息。

代码语言:javascript
运行
复制
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字符,用于安全目的。

代码语言:javascript
运行
复制
String dec = decrypt("encrypted text" {key: "1204581692165412",  iv: "e16ca718048594ce"});
String enc = encrypt("plain text" {key: "1204581692165412",  iv: "e16ca718048594ce"});

但我一直搞错了

代码语言:javascript
运行
复制
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

,它成功地将错误加密,但在解密错误时抛出错误从解密函数开始。

代码语言:javascript
运行
复制
final decrypted = encrypter.decrypt(enBase64, iv: iv);

因此,我添加了填充为空。

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

我还犯了另一个错误

代码语言:javascript
运行
复制
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)

它来自于加密功能

代码语言:javascript
运行
复制
final encrypted = encrypter.encrypt(value, iv: iv);

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

代码语言:javascript
运行
复制
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都使用了相同的键值。

EN

回答 1

Stack Overflow用户

发布于 2022-05-18 08:31:01

我也有同样的问题。为了让它为我工作,您有两个选项,删除模式设置,并让它在设置Encrypter的实例时使用默认的cic AESMode。如果要使用或必须使用cbc模式,则需要设置填充:

代码语言:javascript
运行
复制
_encrypter = Encrypter(AES(_key, mode: AESMode.cbc, padding: "PKCS7"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70817666

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档