我试图使用以下代码加密和解密我的应用程序的聊天消息。
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都使用了相同的键值。
发布于 2022-05-18 08:31:01
我也有同样的问题。为了让它为我工作,您有两个选项,删除模式设置,并让它在设置Encrypter的实例时使用默认的cic AESMode。如果要使用或必须使用cbc模式,则需要设置填充:
_encrypter = Encrypter(AES(_key, mode: AESMode.cbc, padding: "PKCS7"));
https://stackoverflow.com/questions/70817666
复制相似问题