HarmonyOS 鸿蒙Next:这段java的SHA256+AES加密转成ets怎么写好
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
请问楼主解决了吗?我也是 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,这个还是自己写比较深刻,才知道哪里有坑
主要还是字符串转Uint8Array 问题,这个是有鸿蒙的api转
还是有就是Hex,需要自己去实现下。
鸿蒙现在的问题是库有点不稳定,但是大多数的时候是可以正确的。
二是需要确定下AES后端使用的密钥位数和填充模式,鸿蒙必须写死密钥的长度。
Android里面默认的对齐的一般是AES128。
[https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Fcrypto-js](https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Fcrypto-js)
建议直接用这个库
不是的,因为App要从Android覆盖升级出来,以前Android加密后的数据,鸿蒙需要进行相应的解密…我也参考了这个库进行修改了,不行,
针对帖子标题“HarmonyOS 鸿蒙Next:这段java的SHA256+AES加密转成ets怎么写好”的问题,以下是在鸿蒙系统中将Java实现的SHA256+AES加密转换为ETS(Easy TypeScript,这里假设你指的是鸿蒙系统的开发语言,实际鸿蒙开发主要使用ArkUI或JS扩展框架等,但为贴合问题,我们假设ETS为鸿蒙的某种脚本或开发语言)的简要说明:
在鸿蒙系统中,要实现SHA256+AES加密,首先需要了解ETS支持哪些加密库或API。由于鸿蒙系统有其自身的安全框架和加密模块,你需要查阅鸿蒙的官方文档,了解如何调用这些模块。
-
SHA256加密:在ETS中,你可能需要使用鸿蒙提供的安全API来进行SHA256哈希计算。这通常涉及调用特定的函数或方法,并传入待哈希的数据。
-
AES加密:同样,你需要查找鸿蒙系统中AES加密的API。这通常包括设置密钥、模式(如CBC、ECB等)和填充方式,然后调用加密函数。
-
组合使用:在得到SHA256哈希值后,你可以将其作为AES加密的一部分(如密钥派生或作为加密数据的一部分)。
请注意,由于ETS并非一个广泛认知的术语,上述回答基于假设ETS为鸿蒙的某种开发语言。如果ETS有特定的库或框架支持加密,你可能需要查阅该库或框架的文档。
如果问题依旧没法解决请联系官网客服,官网地址是 https://www.itying.com/category-93-b0.html,