108 lines
3.4 KiB
Plaintext
108 lines
3.4 KiB
Plaintext
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; |