HarmonyOS 鸿蒙Next:这段java的SHA256+AES加密转成ets怎么写好

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:这段java的SHA256+AES加密转成ets怎么写好

AESCrypt.encrypt(“LitePalKey”, “[0,1,2,5,8]”);


```java
/**
 * Encrypt and encode message using 256-bit AES with key generated from password.
 *
 * [@param](/user/param) password used to generated key
 * [@param](/user/param) message  the thing you want to encrypt assumed String UTF-8
 * [@return](/user/return) Base64 encoded CipherText
 * [@throws](/user/throws) GeneralSecurityException if problems occur during encryption
 */
public static String encrypt(final String password, String message)
        throws GeneralSecurityException {

    try {
        // 生成密钥
        final SecretKeySpec key = generateKey(password);

        log("message", message);

        byte[] cipherText = encrypt(key, ivBytes, message.getBytes(CHARSET));

        //NO_WRAP is important as was getting \n at the end
        String encoded = Base64.encodeToString(cipherText, Base64.NO_WRAP);
        log("Base64.NO_WRAP", encoded);
        return encoded;
    } catch (UnsupportedEncodingException e) {
        if (DEBUG_LOG_ENABLED)
            LogUtilsH5.e(TAG, e);
        throw new GeneralSecurityException(e);
    }
}
/**
 * Generates SHA256 hash of the password which is used as key
 *
 * [@param](/user/param) password used to generated key
 * [@return](/user/return) SHA256 of the password
 */
private static SecretKeySpec generateKey(final String password)
        throws NoSuchAlgorithmException, UnsupportedEncodingException {
    final MessageDigest digest = MessageDigest.getInstance(HASH_ALGORITHM);
    byte[] bytes = password.getBytes("UTF-8");
    digest.update(bytes, 0, bytes.length);
    byte[] key = digest.digest();

    log("SHA-256 key ", key);

    SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
    return secretKeySpec;
}
7c7+rEUCzYSBOvSl6tuVFw==

更多关于HarmonyOS 鸿蒙Next:这段java的SHA256+AES加密转成ets怎么写好的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

21 回复

请问楼主解决了吗?我也是 Java 改写 ets,也是遇到这种问题

更多关于HarmonyOS 鸿蒙Next:这段java的SHA256+AES加密转成ets怎么写好的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


该问题已解决,并含工具类源码(Harmony原生API实现),帖子为:https://developer.huawei.com/consumer/cn/forum/topic/0202156009282962090?fid=0101587866109860105

前段时间搞过其他平台的AES,也是各种问题,最后发现是大小端的问题,鸿蒙的没搞过,可以尝试下切换大小端看看。

这个应该不会吧,TS只是一个语言,跟硬件没有关系呀。
如果是这样,不得都有问题,而不仅仅是加密?

是的,应用层的话确实很少用到大小端相关,那会我做rtos的时候也是没考虑,因为也算是应用层,我刚搜了下代码,鸿蒙里也的确没看到有配置大小端的相关代码,应该不用考虑。

鸿蒙的问题,加密算法可能有bug,有时候成功,有时候失败。

还有就是难用,报错了提示也不明显,不知道怎么去定位。

还有就是AES, 这里的要求传密钥位数,其实Android里面是有默认的,AES ,RSA,传入就可以用,这个时候来使用鸿蒙就不知道对应的是什么了。需要找加密端来对密钥的长度和填充方式。

我改成鸿蒙版后,加密后是个

a72f23afc9c96f1d23da5dd2889b3daa

完全不一样

ets代码如下:

static encryptAES2(content: string, key: Uint8Array): Promise<string> {
  return new Promise(async (resolve, reject) => {
    try {
      // 1.创建密钥生成器
      let generator = cryptoFramework.createSymKeyGenerator('AES256')
      // 2.使用密钥生成器将密钥转换成 cryptoFramework.SymKey
      let symKey = await generator.convertKey({
        data: key
      })
      // 3.生成 iv等算法参数
      let paramsSpec: cryptoFramework.IvParamsSpec = {
        iv: {
          data: ConvertUtils.hexString2Bytes("00000000000000000000000000000000")
        },
        algName: "IvParamsSpec"
      }
      // 4.创建cipher
      let aesCipher = cryptoFramework.createCipher('AES256|CBC|PKCS5')
      // 5.init cipher
      await aesCipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, paramsSpec)
      // 6.aes 加密
      let encryptText = await aesCipher.doFinal({
        data: ConvertUtils.hexString2Bytes(content)
      })
      resolve(ConvertUtils.bytes2HexString(encryptText.data))
    } catch (err) {
      reject(err)
    }
  })
}
paramsSpec 这个你应该用不到吧,直接传 null 就行了。
/**
 * More flexible AES encrypt that doesn't encode
 *
 * @param key     AES key typically 128, 192 or 256 bit
 * @param iv      Initiation Vector
 * @param message in bytes (assumed it's already been decoded)
 * @return Encrypted cipher text (not encoded)
 * @throws GeneralSecurityException if something goes wrong during encryption
 */
public static byte[] encrypt(final SecretKeySpec key, final byte[] iv, final byte[] message)
        throws GeneralSecurityException {
    final Cipher cipher = Cipher.getInstance(AES_MODE);
    IvParameterSpec ivSpec = new IvParameterSpec(iv);
    cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec);
    byte[] cipherText = cipher.doFinal(message);

    log("cipherText", cipherText);

    return cipherText;
}

iv是{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; message是message.getBytes(CHARSET),

hexString2Bytes 这里应该不是hexString吧,

key在ets是个    
0 = 170  
1 = 60  
2 = 214  
3 = 129  
4 = 83  
5 = 19  
6 = 212  
7 = 196  
8 = 175  
9 = 161  
10 = 110  
11 = 182  
12 = 153  
13 = 16  
14 = 247  
15 = 98  
16 = 52  
17 = 214  
18 = 37  
19 = 25  
20 = 217  
21 = 0  
22 = 132  
23 = 23  
24 = 60  
25 = 96  
26 = 76  
27 = 181  
28 = 68  
29 = 72  
30 = 179  
31 = 138  

在java是个  
[-86, 60, -42, -127, 83, 19, -44, -60, -81, -95, 110, -74, -103, 16, -9, 98, 52, -42, 37, 25, -39, 0, -124, 23, 60, 96, 76, -75, 68, 72, -77, -118]  

完全搞不懂

这个是因为无符号和有符号导致的。

Java支持有符号就这样了。

那这个无符号跟有符号会否有影响呢?

鸿蒙有加解密的api。看文档实现下就行了。

先看看API,这个还是自己写比较深刻,才知道哪里有坑

研究一天了,java跟这个ets好多区别,怎么试都怎么报错,

主要还是字符串转Uint8Array 问题,这个是有鸿蒙的api转
还是有就是Hex,需要自己去实现下。

鸿蒙现在的问题是库有点不稳定,但是大多数的时候是可以正确的。
二是需要确定下AES后端使用的密钥位数和填充模式,鸿蒙必须写死密钥的长度。
Android里面默认的对齐的一般是AES128。

不是的,因为App要从Android覆盖升级出来,以前Android加密后的数据,鸿蒙需要进行相应的解密…我也参考了这个库进行修改了,不行,

针对帖子标题“HarmonyOS 鸿蒙Next:这段java的SHA256+AES加密转成ets怎么写好”的问题,以下是在鸿蒙系统中将Java实现的SHA256+AES加密转换为ETS(Easy TypeScript,这里假设你指的是鸿蒙系统的开发语言,实际鸿蒙开发主要使用ArkUI或JS扩展框架等,但为贴合问题,我们假设ETS为鸿蒙的某种脚本或开发语言)的简要说明:

在鸿蒙系统中,要实现SHA256+AES加密,首先需要了解ETS支持哪些加密库或API。由于鸿蒙系统有其自身的安全框架和加密模块,你需要查阅鸿蒙的官方文档,了解如何调用这些模块。

  1. SHA256加密:在ETS中,你可能需要使用鸿蒙提供的安全API来进行SHA256哈希计算。这通常涉及调用特定的函数或方法,并传入待哈希的数据。

  2. AES加密:同样,你需要查找鸿蒙系统中AES加密的API。这通常包括设置密钥、模式(如CBC、ECB等)和填充方式,然后调用加密函数。

  3. 组合使用:在得到SHA256哈希值后,你可以将其作为AES加密的一部分(如密钥派生或作为加密数据的一部分)。

请注意,由于ETS并非一个广泛认知的术语,上述回答基于假设ETS为鸿蒙的某种开发语言。如果ETS有特定的库或框架支持加密,你可能需要查阅该库或框架的文档。

如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html

回到顶部