Flutter encrypt库AES128-CBC无填充加密16字节字符串返回32字节问题求助
问题成因分析
误将编码后的密文字符串长度当成原始密文长度
你使用的encrypt库中,encrypter.encrypt方法返回的是Encrypted类型对象,默认输出的可读格式是十六进制(base16)编码结果。16字节的原始密文经过base16编码后会得到32个字符的字符串,你统计的32长度实际是编码后的字符数,而非原始密文的字节数。你可以通过返回对象的bytes属性获取原始二进制密文,其长度为16字节。输入数据实际字节长度与预期不符
你描述输入是16字节的字符串,但字符串的字符数不等于字节数:如果字符串包含中文、全角符号等多字节字符,16个字符对应的实际字节长度会超过16。无填充模式的AES要求输入字节长度为块大小(16字节)的整数倍,若输入实际为32字节,加密后原始密文自然为32字节。你可以在加密前将输入转换为字节数组,校验长度是否符合预期。代码逻辑导致输入长度被放大
你编写的encrypt方法中存在特殊逻辑:当输入参数为Key类型时,会直接取其base16属性作为加密输入。base16编码会将原始字节长度翻倍,比如16字节的Key转成base16编码后就是32字节的字符串,加密后就会得到32字节的密文。
内容的提问来源于stack exchange,提问作者lou habert
相关产品推荐
相关产品推荐

