HarmonyOS鸿蒙Next中NOPadding加密报错 13800138000&123456 NOPadding是16位 但数据是18位 有什么方法解决吗
HarmonyOS鸿蒙Next中NOPadding加密报错 13800138000&123456 NOPadding是16位 但数据是18位 有什么方法解决吗
public static String encryptAESExpand(String data) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/NOPadding"); // 参数分别代表 算法名称/加密模式/数据填充方式
int blockSize = cipher.getBlockSize();
byte[] dataBytes = data.getBytes();
int plaintextLength = dataBytes.length;
if (plaintextLength % blockSize != 0) {
plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize));
}
byte[] plaintext = new byte[plaintextLength];
System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length);
SecretKeySpec keyspec = new SecretKeySpec(key.getBytes("utf-8"), "AES");
IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes("utf-8"));
cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);
byte[] encrypted = cipher.doFinal(plaintext);
// String encode = Base64.getEncoder().encodeToString(encrypted);
String encode =encodeBase64(encrypted);
//如果数据过长base64会自动添加换行符
encode = encode.replaceAll(System.lineSeparator(), "");
return getChar(9) + encode;
} catch (Exception e) {
return null;
}
}
更多关于HarmonyOS鸿蒙Next中NOPadding加密报错 13800138000&123456 NOPadding是16位 但数据是18位 有什么方法解决吗的实战教程也可以访问 https://www.itying.com/category-93-b0.html
改用自动填充模式呢?
// 修改加密模式参数为支持自动填充的PKCS5Padding
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17
const key = CryptoJS.enc.Latin1.parse(‘abcdef0123456789’) // 十六位十六进制数作为密钥
const iv = CryptoJS.enc.Latin1.parse(‘0123456789abcdef’) //十六位十六进制数作为密钥偏移量
// aes加密; function Encrypt(content) { if (content) { let arr = [] for (let i = 0; i < 9; i++) { let intNum = Math.floor(Math.random() * 3) // [0, 3) if (intNum === 0) { // 生成一个大写字母(ascii值介于:65-90之间); arr.push(String.fromCharCode(Math.ceil(65 + Math.random() * 26))) } else if (intNum === 1) { // 生成一个小写字母(ascii值介于:97-122之间); arr.push(String.fromCharCode(Math.ceil(97 + Math.random() * 26))) } else { // 生成一个数字(ascii值介于:48-57之间); arr.push(String.fromCharCode(Math.ceil(48 + Math.random() * 10))) } } content = CryptoJS.enc.Utf8.parse(content) let encrypted = CryptoJS.AES.encrypt(content, key, { iv: iv, padding: CryptoJS.pad.ZeroPadding, }) return ‘AaBbCcDdF’ + encrypted.toString() } else { return ‘’ } }
这是pc的加密代码
在HarmonyOS Next中使用AES/CBC/NOPadding加密时,当数据长度不是块大小的整数倍时会报错。针对18位数据需要16位对齐的问题,建议以下解决方案:
-
改用PKCS5Padding/PKCS7Padding填充模式: 将Cipher.getInstance(“AES/CBC/NOPadding”)改为Cipher.getInstance(“AES/CBC/PKCS5Padding”)
-
如果必须使用NOPadding,需要手动处理数据对齐:
// 计算需要填充的字节数
int paddingLength = blockSize - (dataBytes.length % blockSize);
byte[] paddedData = new byte[dataBytes.length + paddingLength];
System.arraycopy(dataBytes, 0, paddedData, 0, dataBytes.length);
// 然后使用paddedData进行加密
- 对于18位数据,可以截断为16位或填充到32位(取决于业务需求)
注意:CBC模式要求数据必须是块大小的整数倍,这是AES算法的基本要求而非HarmonyOS特有的限制。