HarmonyOS 鸿蒙Next RAS非对称加密后台解析错误
HarmonyOS 鸿蒙Next RAS非对称加密后台解析错误
Android代码逻辑
/** 加密-公钥 */
public String encodeByPublicKey(String res, String key) {
byte[] resBytes = res.getBytes();
byte[] keyBytes = parseHexStr2Byte(key); // 先把公钥转为2进制
StringBuffer result = new StringBuffer(); // 结果
// 如果超过了100个字节就分段
if (keyBytes.length <= max) { // 不超过直接返回即可
return encodePub(resBytes, keyBytes);
} else {
int size = resBytes.length / max
+ (resBytes.length % max > 0 ? 1 : 0);
for (int i = 0; i < size; i++) {
int len = i == size - 1 ? resBytes.length % max : max;
byte[] bs = new byte[len]; // 临时数组
System.arraycopy(resBytes, i * max, bs, 0, len);
result.append(encodePub(bs, keyBytes));
if (i != size - 1)
result.append(split);
}
return result.toString();
}
}
/** 加密-公钥-无分段 */
private String encodePub(byte[] res, byte[] keyBytes) {
X509EncodedKeySpec x5 = new X509EncodedKeySpec(keyBytes); // 用2进制的公钥生成x509
try {
KeyFactory kf = KeyFactory.getInstance(KEY_ALGORITHM);
Key pubKey = kf.generatePublic(x5); // 用KeyFactory把x509生成公钥pubKey
Cipher cp = Cipher.getInstance(kf.getAlgorithm()); // 生成相应的Cipher
cp.init(Cipher.ENCRYPT_MODE, pubKey); // 给cipher初始化为加密模式,以及传入公钥pubKey
return parseByte2HexStr(cp.doFinal(res)); // 以16进制的字符串返回
} catch (Exception e) {
System.out.println("公钥加密失败");
e.printStackTrace();
}
return null;
}
迁移鸿蒙代码如下:
public async encodeByPublicKey(plainText: string): Promise<string> {
try {
const publicKeyBytes = this.parseHexStr2Byte(RSAUtils.PUBLIC_KEY);
const pubKeyBlob: cryptoFramework.DataBlob = { data: publicKeyBytes };
const rsaGenerator = cryptoFramework.createAsyKeyGenerator('RSA1024');
const keyPair = await rsaGenerator.convertKey(pubKeyBlob, null);
const cipher = cryptoFramework.createCipher('RSA1024|PKCS1');
await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair.pubKey, null);
const plainTextBytes = new util.TextEncoder().encode(plainText);
const chunkSize = RSAUtils.MAX_ENCRYPT_SIZE;
const encryptedHexChunks: string[] = [];
for (let i = 0; i < plainTextBytes.length; i += chunkSize) {
const chunk = plainTextBytes.slice(i, i + chunkSize);
const chunkBlob: cryptoFramework.DataBlob = { data: chunk };
const encryptedChunk = await cipher.doFinal(chunkBlob);
encryptedHexChunks.push(this.parseByte2HexStr(encryptedChunk.data));
}
// 用空格连接所有分段
return encryptedHexChunks.join(' ');
} catch (e) {
console.error('加密失败:', e);
throw new Error('加密失败');
}
}
加密之后的数据格式长度没什么问题,但是后台解析一直是错误的,Android后台返回的公钥是16进制数据。求助!!!!
更多关于HarmonyOS 鸿蒙Next RAS非对称加密后台解析错误的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next RAS非对称加密后台解析错误的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,RAS非对称加密后台解析错误可能涉及多个技术点。首先,RAS非对称加密通常用于数据加密和数字签名,其核心是基于大整数分解的数学难题。解析错误可能源于密钥对生成、数据加密、解密过程中的问题。
-
密钥对生成:RAS非对称加密依赖于公钥和私钥的配对。如果密钥对生成过程中出现错误,例如密钥长度不符合要求或密钥对不匹配,将导致后续加密解密操作失败。
-
数据加密:在加密过程中,如果数据未按预期格式进行处理,或加密算法实现有误,可能导致加密后的数据无法被正确解析。
-
数据解密:解密过程需要与加密过程严格对应。如果解密时使用的私钥与加密时使用的公钥不匹配,或解密算法实现有误,将导致解密失败。
-
后台处理:后台在处理加密数据时,可能涉及数据格式转换、编码解码等操作。如果这些操作未正确处理,也可能导致解析错误。
-
调试与日志:通过调试和日志分析,可以定位解析错误的具体环节。检查密钥对生成、加密解密过程中的日志,有助于发现问题所在。
解决此类问题,需确保密钥对生成、加密解密流程的正确性,并验证后台处理逻辑的准确性。