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

6 回复

【背景知识】

AES加解密算法是一种常见的对称加解密算法。

基本特点:

  • 分组密码算法,分组长度为128位。
  • 密钥长度为128位、192位或256位。
  • 与3DES相比,安全性更高,处理速度更快。

当前支持以字符串参数生成AES密钥,具体的“字符串参数”由“对称密钥算法”和“密钥长度”拼接而成,用于在创建对称密钥生成器时,指定密钥规格

【解决方案】

解决方案一:

通过Universal Keystore Kit方法进行实现: AES加解密算法CBC模式加解密步骤如下:

  • 生成密钥:

    • 指定密钥别名。
    • 初始化密钥属性集。
    • 调用generateKeyItem生成密钥。
  • 加密:

    • 获取密钥别名。
    • 获取待加密的数据。
    • 获取加密算法参数配置。
    • 调用initSession初始化密钥会话,并获取会话的句柄handle。
    • 调用finishSession结束密钥会话,获取加密后的密文。
  • 解密:

    • 获取密钥别名。
    • 获取待解密的密文。
    • 获取解密算法参数配置。
    • 调用initSession初始化密钥会话,并获取会话的句柄handle。
    • 调用finishSession结束密钥会话,获取解密后的数据。
  • 删除密钥: 当密钥废弃不用时,需要调用deleteKeyItem删除密钥。

具体示例代码可以参考官方文档示例。

解决方案二:

通过Crypto Architecture Kit方法进行实现: AES加解密算法ECB模式加解密步骤如下:

  • 加密:

    • 调用cryptoFramework.createSymKeyGenerator、SymKeyGenerator.generateSymKey,生成密钥算法为AES、密钥长度为128位的对称密钥(SymKey)。
    • 调用cryptoFramework.createCipher,指定字符串参数’AES128|ECB|PKCS7’,创建对称密钥类型为AES128、分组模式为ECB、填充模式为PKCS7的Cipher实例,用于完成加密操作。
    • 调用Cipher.init,设置模式为加密(CryptoMode.ENCRYPT_MODE),指定加密密钥(SymKey),ECB模式Params为空,初始化加密Cipher实例。
    • 加密内容较短时,可以不调用update,直接调用Cipher.doFinal,获取加密后的数据。
  • 解密:

    • 调用cryptoFramework.createCipher,指定字符串参数’AES128|ECB|PKCS7’,创建对称密钥类型为AES128、分组模式为ECB、填充模式为PKCS7的Cipher实例,用于完成解密操作。
    • 调用Cipher.init,设置模式为解密(CryptoMode.DECRYPT_MODE),指定解密密钥(SymKey),ECB模式Params为空,初始化解密Cipher实例。
    • 解密内容较短时,可以不调用update,直接调用Cipher.doFinal,获取解密后的数据。

具体示例代码可以参考官方文档示例。

解决方案三:

使用[@ohos/crypto-js](https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Fcrypto-js)三方库实现:

  • 在需要使用到的页面,导入@ohos/crypto-js三方库。
  • 定义加密解密需要用到的key。
  • 在需要使用AES加密的业务逻辑,调用AES加密。
  • 在需要把上面的加密块解密的业务逻辑,调用AES解密,注意key必须相同。
  • 进行数据转换,获取明文。

示例代码如下:

更多关于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中,当使用NOPadding加密时遇到数据长度不匹配问题(需要16位但数据是18位),可通过以下方式解决:

  1. 对原始数据进行截断处理,保留前16位字符
  2. 使用PKCS7Padding代替NOPadding,它支持任意长度数据
  3. 对不足部分补零处理(ZeroPadding)
  4. 先对数据进行MD5等哈希处理生成16位摘要

需要修改加密算法配置,将padding模式调整为兼容18位数据的方案。具体实现取决于使用的加密库API。

在HarmonyOS Next中使用AES/CBC/NOPadding加密时,当数据长度不是块大小的整数倍时会报错。针对18位数据需要16位对齐的问题,建议以下解决方案:

  1. 改用PKCS5Padding/PKCS7Padding填充模式: 将Cipher.getInstance(“AES/CBC/NOPadding”)改为Cipher.getInstance(“AES/CBC/PKCS5Padding”)

  2. 如果必须使用NOPadding,需要手动处理数据对齐:

// 计算需要填充的字节数
int paddingLength = blockSize - (dataBytes.length % blockSize);
byte[] paddedData = new byte[dataBytes.length + paddingLength];
System.arraycopy(dataBytes, 0, paddedData, 0, dataBytes.length);
// 然后使用paddedData进行加密
  1. 对于18位数据,可以截断为16位或填充到32位(取决于业务需求)

注意:CBC模式要求数据必须是块大小的整数倍,这是AES算法的基本要求而非HarmonyOS特有的限制。

回到顶部