我正在尝试使用此代码加密和解密我的应用程序的聊天消息
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 使用相同的键值
我也有同样的问题。为了让它为我工作,您有 2 个选项,删除模式设置并让它在设置加密器实例时使用默认的 cic AESMode。如果想使用或者不得不使用cbc模式,需要设置padding:
_encrypter = Encrypter(AES(_key, mode: AESMode.cbc, padding: "PKCS7"));
我也遇到了同样的问题很长一段时间,我在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;
}```