HarmonyOS鸿蒙Next中如何将下列java的加密和解密方法转换成对应的方法?
HarmonyOS鸿蒙Next中如何将下列java的加密和解密方法转换成对应的方法?
AES加密
/**
* AES加密
*
* @param content 需要加密的内容
* @param strKey 加密秘钥
* @return 加密后的比特流
*/
public static String encrypt(String content, String strKey) throws Exception {
SecretKeySpec key = new SecretKeySpec(strKey.getBytes(), "AES"); //NOSONAR
Cipher cipher = Cipher.getInstance("AES");
byte[] byteContent = content.getBytes(StandardCharsets.UTF_8);
cipher.init(Cipher.ENCRYPT_MODE, key);
return byte2hex(cipher.doFinal(byteContent));
}
RSA加密
/**
* RSA加密
*
* @param data
* @param publicKey
* @return
*/
public static String encryptRSA(String data, PublicKey publicKey) throws Exception {
// 对数据加密
Cipher cipher = Cipher.getInstance(RSA_KEY_DECRYPT_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return byte2hex(cipher.doFinal(data.getBytes()));
}
byte[]转16进制string
/**
* byte[]转16进制string
*
* @param b
* @return
*/
public static String byte2hex(byte[] b) {
StringBuilder hs = new StringBuilder();
for (byte bi : b) {
String temp = Integer.toHexString(bi & 0XFF);
if (temp.length() == 1) {
hs.append("0");
}
hs.append(temp);
}
return hs.toString().toUpperCase();
}
获取公钥
public static PublicKey getPublicKey(String publicKey) throws Exception {
byte[] keyBytes = Base64.getDecoder().decode(publicKey);
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(spec);
}
RSA签名
/**
* RSA签名
*
* @param data
* @param privateKey
* @return
*/
public static String sign(String data, PrivateKey privateKey) throws Exception {
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initSign(privateKey);
signature.update(data.getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(signature.sign());
}
RSA解密
/**
* RSA解密
*
* @param message
* @param privateKey
* @return
*/
public static String decryptRSA(String message, PrivateKey privateKey) throws Exception {
byte[] bytes = hex2byte(message);
Cipher cipher = Cipher.getInstance(RSA_KEY_DECRYPT_ALGORITHM);
cipher.init(2, privateKey);
byte[] result = cipher.doFinal(bytes);
return new String(result);
}
AES解密
/**
* AES解密
*
* @param content 待解密内容
* @param strKey 解密密钥
* @return 解密后的
*/
public static String decrypt(String content, String strKey) throws Exception {
SecretKeySpec key = new SecretKeySpec(strKey.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
return new String(cipher.doFinal(hex2byte(content)));
}
更多关于HarmonyOS鸿蒙Next中如何将下列java的加密和解密方法转换成对应的方法?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
3 回复
可以参考这篇文章
https://developer.huawei.com/consumer/cn/blog/topic/03182691071171011
这是文档地址
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/crypto-architecture-kit-intro
更多关于HarmonyOS鸿蒙Next中如何将下列java的加密和解密方法转换成对应的方法?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中使用ArkTS实现AES加密解密:
加密方法示例:
import cryptoFramework from '@ohos.security.cryptoFramework';
async function encryptAES(text: string, key: string) {
let cipher = cryptoFramework.createCipher('AES256|ECB|PKCS7');
let keyBlob = { data: stringToUint8Array(key) };
await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyBlob, null);
let input = { data: stringToUint8Array(text) };
let encrypted = await cipher.doFinal(input);
return uint8ArrayToBase64(encrypted.data);
}
解密方法类似,将CryptoMode改为DECRYPT_MODE即可。需注意密钥长度需符合AES标准(128/192/256位)。
在HarmonyOS Next中,可以使用ArkTS实现类似功能。以下是转换后的代码示例:
- AES加密/解密:
import cryptoFramework from '@ohos.security.cryptoFramework';
async function aesEncrypt(content: string, key: string): Promise<string> {
let cipher = cryptoFramework.createCipher('AES128|ECB|PKCS7');
let keyBlob = { data: new Uint8Array(Array.from(key, c => c.charCodeAt(0))) };
let symKey = await cryptoFramework.createSymKeyGenerator('AES128').convertKey(keyBlob);
await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null);
let input = { data: new Uint8Array(Array.from(content, c => c.charCodeAt(0))) };
let output = await cipher.doFinal(input);
return Array.from(output.data).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();
}
- RSA加密/解密:
async function rsaEncrypt(data: string, publicKey: cryptoFramework.PubKey): Promise<string> {
let cipher = cryptoFramework.createCipher('RSA1024|PKCS1');
await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, publicKey, null);
let input = { data: new Uint8Array(Array.from(data, c => c.charCodeAt(0))) };
let output = await cipher.doFinal(input);
return Array.from(output.data).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();
}
- 16进制转换:
function byte2hex(bytes: Uint8Array): string {
return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('').toUpperCase();
}
function hex2byte(hex: string): Uint8Array {
let result = new Uint8Array(hex.length / 2);
for (let i = 0; i < hex.length; i += 2) {
result[i/2] = parseInt(hex.substr(i, 2), 16);
}
return result;
}
- 获取公钥:
async function getPublicKey(base64Key: string): Promise<cryptoFramework.PubKey> {
let keyData = new Uint8Array(atob(base64Key).split('').map(c => c.charCodeAt(0)));
let keyGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
return await keyGenerator.convertKey({ data: keyData }, false);
}
- RSA签名:
async function rsaSign(data: string, privateKey: cryptoFramework.PriKey): Promise<string> {
let signer = cryptoFramework.createSign('RSA1024|SHA1');
await signer.init(privateKey);
let input = { data: new Uint8Array(Array.from(data, c => c.charCodeAt(0))) };
let signature = await signer.sign(input);
return btoa(String.fromCharCode(...Array.from(signature.data)));
}
注意:HarmonyOS Next的加密API与Java有些差异,需要异步处理,且部分参数配置方式不同。实际使用时请根据具体需求调整参数。