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;