|
|
@ -4,8 +4,6 @@ import android.net.Uri |
|
|
|
import android.util.Base64 |
|
|
|
import android.util.Base64 |
|
|
|
import androidx.annotation.Keep |
|
|
|
import androidx.annotation.Keep |
|
|
|
import cn.hutool.crypto.digest.DigestUtil |
|
|
|
import cn.hutool.crypto.digest.DigestUtil |
|
|
|
import cn.hutool.crypto.symmetric.AES |
|
|
|
|
|
|
|
import cn.hutool.crypto.symmetric.DESede |
|
|
|
|
|
|
|
import io.legado.app.constant.AppConst |
|
|
|
import io.legado.app.constant.AppConst |
|
|
|
import io.legado.app.constant.AppConst.dateFormat |
|
|
|
import io.legado.app.constant.AppConst.dateFormat |
|
|
|
import io.legado.app.constant.AppLog |
|
|
|
import io.legado.app.constant.AppLog |
|
|
@ -299,14 +297,6 @@ interface JsExtensions { |
|
|
|
return EncoderUtils.base64Encode(str, flags) |
|
|
|
return EncoderUtils.base64Encode(str, flags) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fun md5Encode(str: String): String { |
|
|
|
|
|
|
|
return MD5Utils.md5Encode(str) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun md5Encode16(str: String): String { |
|
|
|
|
|
|
|
return MD5Utils.md5Encode16(str) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 格式化时间 |
|
|
|
* 格式化时间 |
|
|
|
*/ |
|
|
|
*/ |
|
|
@ -602,6 +592,13 @@ interface JsExtensions { |
|
|
|
return UUID.randomUUID().toString() |
|
|
|
return UUID.randomUUID().toString() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun androidId(): String { |
|
|
|
|
|
|
|
return AppConst.androidId |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//******************对称加密解密************************// |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/////AES |
|
|
|
/** |
|
|
|
/** |
|
|
|
* AES 解码为 ByteArray |
|
|
|
* AES 解码为 ByteArray |
|
|
|
* @param str 传入的AES加密的数据 |
|
|
|
* @param str 传入的AES加密的数据 |
|
|
@ -640,6 +637,31 @@ interface JsExtensions { |
|
|
|
return aesDecodeToByteArray(str, key, transformation, iv)?.let { String(it) } |
|
|
|
return aesDecodeToByteArray(str, key, transformation, iv)?.let { String(it) } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* AES解码为String,算法参数经过Base64加密 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param data 加密的字符串 |
|
|
|
|
|
|
|
* @param key Base64后的密钥 |
|
|
|
|
|
|
|
* @param mode 模式 |
|
|
|
|
|
|
|
* @param padding 补码方式 |
|
|
|
|
|
|
|
* @param iv Base64后的加盐 |
|
|
|
|
|
|
|
* @return 解密后的字符串 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
fun aesDecodeArgsBase64Str( |
|
|
|
|
|
|
|
data: String, |
|
|
|
|
|
|
|
key: String, |
|
|
|
|
|
|
|
mode: String, |
|
|
|
|
|
|
|
padding: String, |
|
|
|
|
|
|
|
iv: String |
|
|
|
|
|
|
|
): String? { |
|
|
|
|
|
|
|
return EncoderUtils.decryptAES( |
|
|
|
|
|
|
|
data.encodeToByteArray(), |
|
|
|
|
|
|
|
Base64.decode(key, Base64.NO_WRAP), |
|
|
|
|
|
|
|
"AES/${mode}/${padding}", |
|
|
|
|
|
|
|
Base64.decode(iv, Base64.NO_WRAP) |
|
|
|
|
|
|
|
)?.let { String(it) } |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 已经base64的AES 解码为 ByteArray |
|
|
|
* 已经base64的AES 解码为 ByteArray |
|
|
|
* @param str 传入的AES Base64加密的数据 |
|
|
|
* @param str 传入的AES Base64加密的数据 |
|
|
@ -753,35 +775,78 @@ interface JsExtensions { |
|
|
|
return aesEncodeToBase64ByteArray(data, key, transformation, iv)?.let { String(it) } |
|
|
|
return aesEncodeToBase64ByteArray(data, key, transformation, iv)?.let { String(it) } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
fun androidId(): String { |
|
|
|
|
|
|
|
return AppConst.androidId |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* AES解密,算法参数经过Base64加密 |
|
|
|
* AES加密并转为Base64,算法参数经过Base64加密 |
|
|
|
* |
|
|
|
* |
|
|
|
* @param data 加密的字符串 |
|
|
|
* @param data 被加密的字符串 |
|
|
|
* @param key Base64后的密钥 |
|
|
|
* @param key Base64后的密钥 |
|
|
|
* @param mode 模式 |
|
|
|
* @param mode 模式 |
|
|
|
* @param padding 补码方式 |
|
|
|
* @param padding 补码方式 |
|
|
|
* @param iv Base64后的加盐 |
|
|
|
* @param iv Base64后的加盐 |
|
|
|
* @return 解密后的字符串 |
|
|
|
* @return 加密后的Base64 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
fun aesDecodeArgsBase64Str( |
|
|
|
fun aesEncodeArgsBase64Str( |
|
|
|
data: String, |
|
|
|
data: String, |
|
|
|
key: String, |
|
|
|
key: String, |
|
|
|
mode: String, |
|
|
|
mode: String, |
|
|
|
padding: String, |
|
|
|
padding: String, |
|
|
|
iv: String |
|
|
|
iv: String |
|
|
|
): String? { |
|
|
|
): String? { |
|
|
|
return AES( |
|
|
|
return EncoderUtils.encryptAES2Base64( |
|
|
|
mode, |
|
|
|
data.encodeToByteArray(), |
|
|
|
padding, |
|
|
|
|
|
|
|
Base64.decode(key, Base64.NO_WRAP), |
|
|
|
Base64.decode(key, Base64.NO_WRAP), |
|
|
|
|
|
|
|
"AES/${mode}/${padding}", |
|
|
|
Base64.decode(iv, Base64.NO_WRAP) |
|
|
|
Base64.decode(iv, Base64.NO_WRAP) |
|
|
|
).decryptStr(data) |
|
|
|
)?.let { String(it) } |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/////DES |
|
|
|
|
|
|
|
fun desDecodeToString( |
|
|
|
|
|
|
|
data: String, key: String, transformation: String, iv: String |
|
|
|
|
|
|
|
): String? { |
|
|
|
|
|
|
|
return EncoderUtils.decryptDES( |
|
|
|
|
|
|
|
data.encodeToByteArray(), |
|
|
|
|
|
|
|
key.encodeToByteArray(), |
|
|
|
|
|
|
|
transformation, |
|
|
|
|
|
|
|
iv.encodeToByteArray() |
|
|
|
|
|
|
|
)?.let { String(it) } |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun desBase64DecodeToString( |
|
|
|
|
|
|
|
data: String, key: String, transformation: String, iv: String |
|
|
|
|
|
|
|
): String? { |
|
|
|
|
|
|
|
return EncoderUtils.decryptBase64DES( |
|
|
|
|
|
|
|
data.encodeToByteArray(), |
|
|
|
|
|
|
|
key.encodeToByteArray(), |
|
|
|
|
|
|
|
transformation, |
|
|
|
|
|
|
|
iv.encodeToByteArray() |
|
|
|
|
|
|
|
)?.let { String(it) } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun desEncodeToString( |
|
|
|
|
|
|
|
data: String, key: String, transformation: String, iv: String |
|
|
|
|
|
|
|
): String? { |
|
|
|
|
|
|
|
return EncoderUtils.encryptDES( |
|
|
|
|
|
|
|
data.encodeToByteArray(), |
|
|
|
|
|
|
|
key.encodeToByteArray(), |
|
|
|
|
|
|
|
transformation, |
|
|
|
|
|
|
|
iv.encodeToByteArray() |
|
|
|
|
|
|
|
)?.let { String(it) } |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun desEncodeToBase64String( |
|
|
|
|
|
|
|
data: String, key: String, transformation: String, iv: String |
|
|
|
|
|
|
|
): String? { |
|
|
|
|
|
|
|
return EncoderUtils.encryptDES2Base64( |
|
|
|
|
|
|
|
data.encodeToByteArray(), |
|
|
|
|
|
|
|
key.encodeToByteArray(), |
|
|
|
|
|
|
|
transformation, |
|
|
|
|
|
|
|
iv.encodeToByteArray() |
|
|
|
|
|
|
|
)?.let { String(it) } |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//////3DES |
|
|
|
/** |
|
|
|
/** |
|
|
|
* 3DES解密 |
|
|
|
* 3DES解密 |
|
|
|
* |
|
|
|
* |
|
|
@ -799,7 +864,12 @@ interface JsExtensions { |
|
|
|
padding: String, |
|
|
|
padding: String, |
|
|
|
iv: String |
|
|
|
iv: String |
|
|
|
): String? { |
|
|
|
): String? { |
|
|
|
return DESede(mode, padding, key.toByteArray(), iv.toByteArray()).decryptStr(data) |
|
|
|
return EncoderUtils.decryptDESede( |
|
|
|
|
|
|
|
data.encodeToByteArray(), |
|
|
|
|
|
|
|
key.encodeToByteArray(), |
|
|
|
|
|
|
|
"DESede/${mode}/${padding}", |
|
|
|
|
|
|
|
iv.encodeToByteArray() |
|
|
|
|
|
|
|
)?.let { String(it) } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
@ -819,38 +889,14 @@ interface JsExtensions { |
|
|
|
padding: String, |
|
|
|
padding: String, |
|
|
|
iv: String |
|
|
|
iv: String |
|
|
|
): String? { |
|
|
|
): String? { |
|
|
|
return DESede( |
|
|
|
return EncoderUtils.decryptDESede( |
|
|
|
mode, |
|
|
|
data.encodeToByteArray(), |
|
|
|
padding, |
|
|
|
|
|
|
|
Base64.decode(key, Base64.NO_WRAP), |
|
|
|
Base64.decode(key, Base64.NO_WRAP), |
|
|
|
|
|
|
|
"DESede/${mode}/${padding}", |
|
|
|
Base64.decode(iv, Base64.NO_WRAP) |
|
|
|
Base64.decode(iv, Base64.NO_WRAP) |
|
|
|
).decryptStr(data) |
|
|
|
)?.let { String(it) } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* AES加密并转为Base64,算法参数经过Base64加密 |
|
|
|
|
|
|
|
* |
|
|
|
|
|
|
|
* @param data 被加密的字符串 |
|
|
|
|
|
|
|
* @param key Base64后的密钥 |
|
|
|
|
|
|
|
* @param mode 模式 |
|
|
|
|
|
|
|
* @param padding 补码方式 |
|
|
|
|
|
|
|
* @param iv Base64后的加盐 |
|
|
|
|
|
|
|
* @return 加密后的Base64 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
fun aesEncodeArgsBase64Str( |
|
|
|
|
|
|
|
data: String, |
|
|
|
|
|
|
|
key: String, |
|
|
|
|
|
|
|
mode: String, |
|
|
|
|
|
|
|
padding: String, |
|
|
|
|
|
|
|
iv: String |
|
|
|
|
|
|
|
): String? { |
|
|
|
|
|
|
|
return AES( |
|
|
|
|
|
|
|
mode, |
|
|
|
|
|
|
|
padding, |
|
|
|
|
|
|
|
Base64.decode(key, Base64.NO_WRAP), |
|
|
|
|
|
|
|
Base64.decode(iv, Base64.NO_WRAP) |
|
|
|
|
|
|
|
).encryptBase64(data) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 3DES加密并转为Base64 |
|
|
|
* 3DES加密并转为Base64 |
|
|
@ -869,7 +915,12 @@ interface JsExtensions { |
|
|
|
padding: String, |
|
|
|
padding: String, |
|
|
|
iv: String |
|
|
|
iv: String |
|
|
|
): String? { |
|
|
|
): String? { |
|
|
|
return DESede(mode, padding, key.toByteArray(), iv.toByteArray()).encryptBase64(data) |
|
|
|
return EncoderUtils.encryptDESede2Base64( |
|
|
|
|
|
|
|
data.encodeToByteArray(), |
|
|
|
|
|
|
|
key.encodeToByteArray(), |
|
|
|
|
|
|
|
"DESede/${mode}/${padding}", |
|
|
|
|
|
|
|
iv.encodeToByteArray() |
|
|
|
|
|
|
|
)?.let { String(it) } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
@ -889,14 +940,16 @@ interface JsExtensions { |
|
|
|
padding: String, |
|
|
|
padding: String, |
|
|
|
iv: String |
|
|
|
iv: String |
|
|
|
): String? { |
|
|
|
): String? { |
|
|
|
return DESede( |
|
|
|
return EncoderUtils.encryptDESede2Base64( |
|
|
|
mode, |
|
|
|
data.encodeToByteArray(), |
|
|
|
padding, |
|
|
|
|
|
|
|
Base64.decode(key, Base64.NO_WRAP), |
|
|
|
Base64.decode(key, Base64.NO_WRAP), |
|
|
|
|
|
|
|
"DESede/${mode}/${padding}", |
|
|
|
Base64.decode(iv, Base64.NO_WRAP) |
|
|
|
Base64.decode(iv, Base64.NO_WRAP) |
|
|
|
).encryptBase64(data) |
|
|
|
)?.let { String(it) } |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//******************消息摘要************************// |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* 生成摘要,并转为16进制字符串 |
|
|
|
* 生成摘要,并转为16进制字符串 |
|
|
|
* |
|
|
|
* |
|
|
@ -925,4 +978,12 @@ interface JsExtensions { |
|
|
|
return Base64.encodeToString(DigestUtil.digester(algorithm).digest(data), Base64.NO_WRAP) |
|
|
|
return Base64.encodeToString(DigestUtil.digester(algorithm).digest(data), Base64.NO_WRAP) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun md5Encode(str: String): String { |
|
|
|
|
|
|
|
return MD5Utils.md5Encode(str) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fun md5Encode16(str: String): String { |
|
|
|
|
|
|
|
return MD5Utils.md5Encode16(str) |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|