export class Des3 {
static cipherDES(key: string, iv: string, bytes: Uint8Array): Uint8Array {
try {
// 生成密钥
key = key.substring(0, 8);
let keyData = new Uint8Array(24);
keyData.set(new util.TextEncoder().encodeInto(key))
let symKeyBlob: cryptoFramework.DataBlob = { data: keyData };
const symKey = cryptoFramework.createSymKeyGenerator('3DES192')// 鸿蒙只提供了3DES算法,好在可以兼容DES
.convertKeySync(symKeyBlob) // 3DES 对密钥长度有要求,是普通DES的3倍长度
// DES加密
const spec: cryptoFramework.IvParamsSpec = {
iv: { data: this.stringToUint8Array(iv) },
algName: "IvParamsSpec"
}
const cipher = cryptoFramework.createCipher('3DES192|CBC|PKCS7'); // PKCS7 与 PKCS5Padding 可视为相同的填充方式,互相兼容
cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, spec)
const encryptData = cipher.doFinalSync({ data: bytes }).data;
return encryptData
} catch (ex) {
Logger.info("请求body入参加密:" + ex)
return new Uint8Array()
}
}
static stringToUint8Array(str, len = null) {
let arr = [];
if (len == null) {
len = str.length
}
for (let i = 0; i < len; i++) {
if (str.length > i) {
arr.push(str.charCodeAt(i))
} else {
arr.push(0)
}
}
return new Uint8Array(arr);
}
}
调用
// key
const res = DESUtil.getInstance('key')
// 加密
const encrypted = res.encryptMessageWithDESCBC( res.encryptMessageWithDESCBC('pas'))
// 解密
const decrypted = res.decryptMessageWithDESCBC(res.decryptMessageWithDESCBC(encrypted))
上面的代码是鸿蒙官方API Des3加密,折腾半天发现密钥长度不能大于24位。不满足我的要求,我使用了ohos/crypto-js加解密。
//加密
static encode(str:string,key:string,iv:string){
let newUTF8key = CryptoJS.enc.Utf8.parse(key);
let encrypted: string = CryptoJS.TripleDES.encrypt(str, newUTF8key, {
//mode: CryptoJS.mode.ECB,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Hex.parse(iv)
}).ciphertext.toString(CryptoJS.enc.Base64);
return encrypted;
}
//解密 str是加密后的字符串,key是加密的key,iv是加密使用的iv
static encrypt(str:string,key:string,iv:string){
// let UTF8key: string = CryptoJS.enc.Hex.parse(key);
let newUTF8key = CryptoJS.enc.Utf8.parse(key);
let decrypted: string = CryptoJS.TripleDES.decrypt(str, newUTF8key, {
//mode: CryptoJS.mode.ECB,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7,
iv: CryptoJS.enc.Hex.parse(iv)
}).toString(CryptoJS.enc.Utf8);
console.log("...TripleDES decrypt:" + decrypted);
return decrypted;
}