hm_pcenter/entry/src/main/ets/util/JiaMi.ets

108 lines
3.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import { CryptoJS } from '@ohos/crypto-js'
import { buffer, util } from '@kit.ArkTS';
/**
* DES 加密工具类ArkTS 版本)
*/
class JiaMi {
/**
* 使用 key 对 data 进行 DES 加密,并返回 Base64 编码字符串
* @param data 待加密的字符串UTF-8
* @param id 用户ID
* @param secret 密钥
* @returns Base64 编码的加密字符串,失败返回 null
*/
desCrypto(data: string, id: string, secret: string): string | null {
const key = `${id}:${secret}`;
return this.desCryptoWithKey(data, key);
}
/**
* 使用指定 key 对 data 进行 DES 加密
* @param data 待加密的字符串
* @param key 密钥字符串
* @returns Base64 编码的加密字符串,失败返回 null
*/
desCryptoWithKey(data: string, key: string) {
const keyHex = CryptoJS.enc.Utf8.parse(key);
const encrypted = CryptoJS.DES.encrypt(data, keyHex, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString(); // 默认就是 Base64
let new_key = CryptoJS.enc.Utf8.parse(key);
// let iv:CryptoJS.lib.WordArray = CryptoJS.lib.WordArray.create(uintArray)
let encryptd = CryptoJS.DES.encrypt(data, new_key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
// iv:iv
})
let words = encryptd.ciphertext;
let sigBytes = words.sigBytes;
let uint8Array = new Uint8Array(sigBytes);
for (let i = 0; i < sigBytes; i++) {
uint8Array[i] = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
}
return new util.Base64Helper().encodeToStringSync(uint8Array)
// let jiMw = new util.Base64Helper().decodeSync(jiemiDa)
return encryptd.toString();
}
/**
* DES 解密Base64 输入,返回字符串)
* @param encryptData Base64 编码的密文 03962723612
* @param key 密钥
* @returns 明文字符串
* @throws 错误信息
*/
decrypt(encryptData: string, key: string): string {
let new_key = CryptoJS.enc.Utf8.parse(key);
let uintArray = new Uint8Array([1,2,3,4,5,6,7,8])
let iv:CryptoJS.lib.WordArray = CryptoJS.lib.WordArray.create(uintArray)
let bytes = CryptoJS.DES.decrypt(encryptData, new_key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7,
// iv:iv
})
let result = bytes.toString(CryptoJS.enc.Utf8);
return result.toString();
}
/**
* 使用 id 和 secret 解密
* @param encryptData Base64 密文
* @param id 用户ID
* @param secret 密钥
* @returns 明文字符串
* @throws 错误信息
*/
decryptWithId(encryptData: string, id: string, secret: string): string {
const key = `${id}:${secret}`;
return this.decrypt(encryptData, key);
}
/**
* 辅助函数:将密钥补全或截断为 8 字节DES 要求)
* @param key 原始密钥字符串
* @returns 8 字节长度的字符串
*/
private static padKeyTo8Bytes(key: string): string {
let keyStr = key;
if (keyStr.length < 8) {
// 不足8字节补空格或可改为补0或其他
keyStr = keyStr.padEnd(8, ' ');
} else if (keyStr.length > 8) {
// 超过8字节截断
keyStr = keyStr.substring(0, 8);
}
return keyStr;
}
}
export default JiaMi;