1
This commit is contained in:
@@ -0,0 +1,232 @@
|
||||
import CryptoJS from "./lib/index.js"
|
||||
import { JSEncrypt } from "./src/JSEncrypt"
|
||||
export { RSARANDOMKEY } from "../interface.uts"
|
||||
|
||||
function adjustIV(ivStr, requiredLength = 16) {
|
||||
// 将字符串转换为字节
|
||||
let ivBytes = CryptoJS.enc.Utf8.parse(ivStr);
|
||||
// 创建一个新的WordArray来存储处理后的IV
|
||||
let adjustedIV = CryptoJS.lib.WordArray.create();
|
||||
|
||||
if (ivBytes.sigBytes >= requiredLength) {
|
||||
// 如果IV长度足够或过长,进行截取
|
||||
adjustedIV = CryptoJS.lib.WordArray.create(ivBytes.words.slice(0, requiredLength / 4));
|
||||
} else {
|
||||
// 如果IV长度不足,进行补足0
|
||||
adjustedIV = CryptoJS.lib.WordArray.create(ivBytes.words);
|
||||
for (let i = ivBytes.sigBytes / 4; i < requiredLength / 4; i++) {
|
||||
adjustedIV.words[i] = 0;
|
||||
}
|
||||
adjustedIV.sigBytes = requiredLength;
|
||||
}
|
||||
|
||||
return adjustedIV;
|
||||
}
|
||||
|
||||
function adjustIV2(ivStr:Uint8Array, requiredLength = 16) {
|
||||
// 确保密钥长度为requiredLength字节,不足时用0填充,过长时截断
|
||||
const paddedKey = new Uint8Array(requiredLength);
|
||||
if (ivStr.length < requiredLength) {
|
||||
paddedKey.set(ivStr, 0);
|
||||
} else {
|
||||
paddedKey.set(ivStr.slice(0, requiredLength), 0);
|
||||
}
|
||||
|
||||
// 将Uint8Array转换为WordArray
|
||||
const words:number[] = [];
|
||||
for (let i = 0; i < paddedKey.length; i += 4) {
|
||||
let word = 0;
|
||||
for (let j = 0; j < 4 && i + j < paddedKey.length; j++) {
|
||||
word |= paddedKey[i + j] << (24 - j * 8);
|
||||
}
|
||||
words.push(word);
|
||||
}
|
||||
return CryptoJS.lib.WordArray.create(words, paddedKey.length);
|
||||
}
|
||||
|
||||
export function base64Encode(input : string) : string {
|
||||
return CryptoJS.enc.Utf8.parse(input).toString(CryptoJS.enc.Base64)
|
||||
}
|
||||
export function base64Decode(input : string) : string {
|
||||
return CryptoJS.enc.Base64.parse(input).toString(CryptoJS.enc.Utf8)
|
||||
}
|
||||
export function md5(input : string) : string {
|
||||
return CryptoJS.MD5(input).toString()
|
||||
}
|
||||
|
||||
export function sha256(str : string) : string {
|
||||
return CryptoJS.SHA256(str).toString()
|
||||
}
|
||||
export function sha512(str : string) : string {
|
||||
return CryptoJS.SHA512(str).toString()
|
||||
}
|
||||
export function hmacSha256(key : string, data : string) : string {
|
||||
return CryptoJS.HmacSHA256(data, key).toString()
|
||||
}
|
||||
|
||||
export function hmacSha512(key : string, data : string) : string {
|
||||
return CryptoJS.HmacSHA512(data, key).toString()
|
||||
}
|
||||
|
||||
export function sha1(str : string) : string {
|
||||
return CryptoJS.SHA1(str).toString()
|
||||
}
|
||||
/**
|
||||
* Aes
|
||||
* @param {string} key utf8字符串它会根据keySize来截取和补足0
|
||||
* @param {string} data 待加密的字符
|
||||
* @param {string} mode ECB,CBC
|
||||
* @param {string} iv 固定是16位,不足会补齐0
|
||||
* @param {string} keySize 对key的加密补位,也就是加密位数16为128,24为192,32为256
|
||||
*/
|
||||
export function aesEncrypt(key : string, data : string, mode : string = "ECB", iv : string | null = null, keySize : number | null = 16) : string {
|
||||
const keyData = adjustIV(key, keySize || 16);
|
||||
const ivValue = adjustIV(iv || "");
|
||||
let word = CryptoJS.AES.encrypt(data, keyData, {
|
||||
iv: ivValue,
|
||||
mode: CryptoJS.mode[mode],
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
});
|
||||
return word.toString()
|
||||
}
|
||||
/**
|
||||
* DAes
|
||||
* @param {string} key utf8字符串它会根据keySize来截取和补足0
|
||||
* @param {string} data 加密后的base64的字符
|
||||
* @param {string} mode ECB,CBC
|
||||
* @param {string} iv 固定是16位,不足会补齐0
|
||||
* @param {string} keySize 对key的加密补位,也就是加密位数16为128,24为192,32为256
|
||||
*/
|
||||
export function aesDecrypt(key : string, data : string, mode : string = "ECB", iv : string | null = null, keySize : number | null = 16) : string {
|
||||
const keyData = adjustIV(key, keySize || 16);
|
||||
const ivValue = adjustIV(iv || "");
|
||||
|
||||
let word = CryptoJS.AES.decrypt(data, keyData, { iv: ivValue, mode: CryptoJS.mode[mode], padding: CryptoJS.pad.Pkcs7 });
|
||||
return word.toString(CryptoJS.enc.Utf8)
|
||||
}
|
||||
|
||||
export function aesEncrypt2(key : Uint8Array, data : Uint8Array, mode : string = "ECB", iv : Uint8Array | null = null, keySize : number | null = 16) : Uint8Array {
|
||||
const keyData = adjustIV2(key, keySize || 16);
|
||||
|
||||
// 将数据转换为WordArray
|
||||
const words:number[] = [];
|
||||
for (let i = 0; i < data.length; i += 4) {
|
||||
let word = 0;
|
||||
for (let j = 0; j < 4 && i + j < data.length; j++) {
|
||||
word |= data[i + j] << (24 - j * 8);
|
||||
}
|
||||
words.push(word);
|
||||
}
|
||||
const dataU8 = CryptoJS.lib.WordArray.create(words, data.length);
|
||||
|
||||
// 处理IV
|
||||
let ivValue:any;
|
||||
if (mode === "ECB") {
|
||||
ivValue = CryptoJS.lib.WordArray.create([]);
|
||||
} else {
|
||||
const ivData = iv || new Uint8Array(16);
|
||||
ivValue = adjustIV2(ivData, 16);
|
||||
}
|
||||
|
||||
let word = CryptoJS.AES.encrypt(dataU8, keyData, {
|
||||
iv: ivValue,
|
||||
mode: CryptoJS.mode[mode],
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
});
|
||||
|
||||
// 正确地将WordArray转换为Uint8Array
|
||||
// @ts-ignore
|
||||
const resultWords = word.ciphertext.words;
|
||||
// @ts-ignore
|
||||
const sigBytes = word.ciphertext.sigBytes;
|
||||
const result = new Uint8Array(sigBytes);
|
||||
|
||||
for (let i = 0; i < sigBytes; i++) {
|
||||
const wordIndex = Math.floor(i / 4);
|
||||
const byteIndex = i % 4;
|
||||
result[i] = (resultWords[wordIndex] >>> (24 - byteIndex * 8)) & 0xff;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export function aesDecrypt2(key : Uint8Array, data : Uint8Array, mode : string = "ECB", iv : Uint8Array | null = null, keySize : number | null = 16) : Uint8Array {
|
||||
const keyData = adjustIV2(key, keySize || 16);
|
||||
|
||||
// 处理IV
|
||||
let ivValue:any;
|
||||
if (mode === "ECB") {
|
||||
ivValue = CryptoJS.lib.WordArray.create([]);
|
||||
} else {
|
||||
const ivData = iv || new Uint8Array(16);
|
||||
ivValue = adjustIV2(ivData, 16);
|
||||
}
|
||||
|
||||
// 将加密数据转换为WordArray
|
||||
const words:number[] = [];
|
||||
for (let i = 0; i < data.length; i += 4) {
|
||||
let word = 0;
|
||||
for (let j = 0; j < 4 && i + j < data.length; j++) {
|
||||
word |= data[i + j] << (24 - j * 8);
|
||||
}
|
||||
words.push(word);
|
||||
}
|
||||
const cipherParams = CryptoJS.lib.CipherParams.create({
|
||||
ciphertext: CryptoJS.lib.WordArray.create(words, data.length)
|
||||
});
|
||||
|
||||
let word = CryptoJS.AES.decrypt(cipherParams, keyData, { iv: ivValue, mode: CryptoJS.mode[mode], padding: CryptoJS.pad.Pkcs7 });
|
||||
|
||||
// 正确地将WordArray转换为Uint8Array
|
||||
const resultWords = word.words;
|
||||
const sigBytes = word.sigBytes;
|
||||
const result = new Uint8Array(sigBytes);
|
||||
|
||||
for (let i = 0; i < sigBytes; i++) {
|
||||
const wordIndex = Math.floor(i / 4);
|
||||
const byteIndex = i % 4;
|
||||
result[i] = (resultWords[wordIndex] >>> (24 - byteIndex * 8)) & 0xff;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export function desEncrypt(key : string, data : string, mode : string = "ECB", iv : string | null = null) : string {
|
||||
let word = CryptoJS.DES.encrypt(data, key, { iv: CryptoJS.enc.Utf8.parse(iv || ""), mode: CryptoJS.mode[mode] });
|
||||
return word.toString()
|
||||
}
|
||||
|
||||
|
||||
export function desDecrypt(key : string, data : string, mode : string = "ECB", iv : string | null = null) : string {
|
||||
let word = CryptoJS.DES.decrypt(data, key, { iv: CryptoJS.enc.Utf8.parse(iv || ""), mode: CryptoJS.mode[mode] });
|
||||
return word.toString(CryptoJS.enc.Utf8)
|
||||
}
|
||||
|
||||
export function generateRSAKeyPair(keySize : number = 2048) : RSARANDOMKEY {
|
||||
const crypt = new JSEncrypt({ default_key_size: keySize.toString() })
|
||||
crypt.getKey()
|
||||
return {
|
||||
publicKey: crypt.getPublicKey(),
|
||||
privateKey: crypt.getPrivateKey()
|
||||
} as RSARANDOMKEY
|
||||
}
|
||||
|
||||
export function rsaEncrypt(publicKey : string, data : string) : string {
|
||||
JSEncrypt.prototype.setPublicKey(publicKey)
|
||||
return JSEncrypt.prototype.encrypt(data) || ""
|
||||
}
|
||||
export function rsaDecrypt(privateKey : string, data : string) : string {
|
||||
JSEncrypt.prototype.setPrivateKey(privateKey)
|
||||
return JSEncrypt.prototype.decrypt(data) || ""
|
||||
}
|
||||
//返回的是hex字符串
|
||||
export function rc4Encrypt(key : string, data : string) : string {
|
||||
return CryptoJS.RC4.encrypt(data, CryptoJS.enc.Utf8.parse(key)).toString(CryptoJS.format.Hex)
|
||||
}
|
||||
|
||||
// key是hex字符
|
||||
export function rc4Decrypt(key : string, data : string) : string {
|
||||
const ciphertext = CryptoJS.enc.Hex.parse(data);
|
||||
let dec = CryptoJS.RC4.decrypt({ ciphertext: ciphertext }, CryptoJS.enc.Utf8.parse(key))
|
||||
return dec.toString(CryptoJS.enc.Utf8);
|
||||
}
|
||||
Reference in New Issue
Block a user