首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在AES CTR模式下,输入数据必须是密码块大小的倍数

在AES CTR模式下,输入数据必须是密码块大小的倍数
EN

Stack Overflow用户
提问于 2020-02-13 04:19:04
回答 1查看 1.3K关注 0票数 4

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

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

下面是我的代码:

代码语言:javascript
复制
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模式不需要任何填充。如果它确实需要填充,我应该用什么填充?我试过这个:

代码语言:javascript
复制
final decrypted = encrypter.decrypt(encrypt.Encrypted.fromBase16(cipher.padRight(16, null)), iv: iv);

但我得到了以下异常:

代码语言:javascript
复制
E/flutter (19095): FormatException: Invalid radix-16 number (at character 1)
E/flutter (19095): nu
E/flutter (19095): ^

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-13 06:58:31

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

代码语言:javascript
复制
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的实用程序

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60196268

复制
相关文章

相似问题

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