mirror of https://github.com/allinssl/allinssl
87 lines
2.1 KiB
TypeScript
87 lines
2.1 KiB
TypeScript
/**
|
||
* 文件定义:加密解密
|
||
*/
|
||
|
||
// import JSEncrypt from 'jsencrypt'
|
||
/* -------------- 1、加密解密 -------------- */
|
||
|
||
/**
|
||
* 生成2048位RSA密钥对
|
||
* @returns {{ publicKey: string, privateKey: string }} 包含公钥和私钥的对象
|
||
*/
|
||
export const generateKeyPair = async () => {
|
||
const { JSEncrypt } = await import('jsencrypt')
|
||
const encrypt = new JSEncrypt({ default_key_size: '2048' })
|
||
encrypt.getKey()
|
||
|
||
return {
|
||
publicKey: encrypt.getPublicKey() as string,
|
||
privateKey: encrypt.getPrivateKey() as string,
|
||
}
|
||
}
|
||
|
||
/**
|
||
* RSA加密
|
||
* @param {string} str - 需要加密的字符串
|
||
* @param {string} publicKey - 公钥
|
||
* @returns {string} 加密后的字符串
|
||
*/
|
||
export const rsaEncrypt = async (str: string, publicKey: string): Promise<string> => {
|
||
const { JSEncrypt } = await import('jsencrypt')
|
||
// 基础验证
|
||
if (!str || !publicKey || publicKey.length < 10) return str
|
||
// 检查字符串长度(2048位RSA密钥最大可加密245字节)
|
||
const byteLength = new TextEncoder().encode(str).length
|
||
if (byteLength > 245) {
|
||
console.error('RSA加密失败: 数据长度超过245字节限制')
|
||
return str
|
||
}
|
||
|
||
try {
|
||
const encrypt = new JSEncrypt()
|
||
encrypt.setPublicKey(publicKey)
|
||
const encrypted = encrypt.encrypt(str)
|
||
|
||
// 确保加密结果有效
|
||
if (!encrypted) {
|
||
console.error('RSA加密失败')
|
||
return str
|
||
}
|
||
|
||
return encrypted
|
||
} catch (error) {
|
||
console.error('RSA加密出错:', error)
|
||
return str
|
||
}
|
||
}
|
||
|
||
/**
|
||
* RSA解密
|
||
* @param {string} str - 需要解密的字符串
|
||
* @param {string} privateKey - 私钥
|
||
* @returns {string} 解密后的字符串
|
||
*/
|
||
export const rsaDecrypt = async (str: string, privateKey: string): Promise<string> => {
|
||
const { JSEncrypt } = await import('jsencrypt')
|
||
|
||
// 基础验证
|
||
if (!str || !privateKey || privateKey.length < 10) return str
|
||
|
||
try {
|
||
const decrypt = new JSEncrypt()
|
||
decrypt.setPrivateKey(privateKey)
|
||
const decrypted = decrypt.decrypt(str)
|
||
|
||
// 确保解密结果有效
|
||
if (!decrypted) {
|
||
console.error('RSA解密失败')
|
||
return str
|
||
}
|
||
|
||
return decrypted
|
||
} catch (error) {
|
||
console.error('RSA解密出错:', error)
|
||
return str
|
||
}
|
||
}
|