【问题标题】:Input data must be multiple of cipher block size in AES CTR mode在 AES CTR 模式下,输入数据必须是密码块大小的倍数
【发布时间】:2020-02-12 20:19:03
【问题描述】:

当我使用 Dart 的 encrypt package 使用 AES CTR 模式解密某些内容时,我得到了这个异常:

E/flutter (19095): Invalid argument(s): Input data length must be a multiple of cipher's block size
E/flutter (19095): #0      PaddedBlockCipherImpl.process (package:pointycastle/padded_block_cipher/padded_block_cipher_impl.dart:55:9)
E/flutter (19095): #1      AES.decrypt (package:encrypt/src/algorithms/aes.dart:38:20)

这是我的代码:

final encrypter = encrypt.Encrypter(encrypt.AES(key, mode: encrypt.AESMode.ctr));
final decrypted = encrypter.decrypt(encrypt.Encrypted.fromBase16(cipher), iv: iv);

cipher 是长度为 10 的十六进制字符串。我认为 AES CTR 模式不需要任何填充。如果确实需要填充,我应该用什么填充?我试过这个:

final decrypted = encrypter.decrypt(encrypt.Encrypted.fromBase16(cipher.padRight(16, null)), iv: iv);

但我得到以下异常:

E/flutter (19095): FormatException: Invalid radix-16 number (at character 1)
E/flutter (19095): nu
E/flutter (19095): ^

使用'0' 作为填充会导致我描述的第一个异常。

【问题讨论】:

  • 我不熟悉这个包,但我认为这是一个错误 - 你的想法是正确的,CTR 不需要填充。

标签: flutter encryption dart aes


【解决方案1】:

这是 Dart 的加密包中的一个问题。如果它不是块大小的倍数,它就无法处理使用 AES CTR 模式加密的内容。这个包是 Pointy Castle 的包装器,我能够成功地使用它来解密使用 AES CTR 模式加密的字符串。代码如下:

import 'package:encrypt/encrypt.dart' as encrypt;
import 'package:pointycastle/export.dart' as pc;

String decrypt(String cipher, Uint8List key, Uint8List iv) {
  final encryptedText = encrypt.Encrypted.fromBase16(cipher);
  final ctr = pc.CTRStreamCipher(pc.AESFastEngine())
    ..init(false, pc.ParametersWithIV(pc.KeyParameter(key.bytes), iv.bytes));
  Uint8List decrypted = ctr.process(encryptedText.bytes);

  print(String.fromCharCodes(decrypted));

  return String.fromCharCodes(decrypted);
}

cipher 是一个十六进制字符串。 encrypt 的包仍然有用,因为它提供了将十六进制字符串转换为 Uint8List 的实用程序

【讨论】:

    【解决方案2】:

    当我试图解密一个未加密的文件时,我得到了这个。只需将输入更改为已加密的文件即可。

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2019-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多