parent
							
								
									b388dce8a5
								
							
						
					
					
						commit
						3da6aa8dd3
					
				| @ -0,0 +1,496 @@ | ||||
| /* | ||||
|  * This file is part of FYReader. | ||||
|  * FYReader is free software: you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation, either version 3 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * FYReader is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License | ||||
|  * along with FYReader.  If not, see <https://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Copyright (C) 2020 - 2022 fengyuecanzhu | ||||
|  */ | ||||
| 
 | ||||
| package xyz.fycz.myreader.model.third3.analyzeRule | ||||
| 
 | ||||
| import android.util.Base64 | ||||
| import cn.hutool.crypto.digest.DigestUtil | ||||
| import cn.hutool.crypto.digest.HMac | ||||
| import cn.hutool.crypto.symmetric.SymmetricCrypto | ||||
| import xyz.fycz.myreader.util.utils.MD5Utils | ||||
| 
 | ||||
| /** | ||||
|  * js加解密扩展类, 在js中通过java变量调用 | ||||
|  * 添加方法,请更新文档/legado/app/src/main/assets/help/JsHelp.md | ||||
|  */ | ||||
| interface JsEncodeUtils { | ||||
| 
 | ||||
|     fun md5Encode(str: String): String { | ||||
|         return MD5Utils.md5Encode(str) | ||||
|     } | ||||
| 
 | ||||
|     fun md5Encode16(str: String): String { | ||||
|         return MD5Utils.md5Encode16(str) | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     //******************对称加密解密************************// | ||||
| 
 | ||||
|     /** | ||||
|      * 在js中这样使用 | ||||
|      * java.createSymmetricCrypto(transformation, key, iv).decrypt(data) | ||||
|      * java.createSymmetricCrypto(transformation, key, iv).decryptStr(data) | ||||
| 
 | ||||
|      * java.createSymmetricCrypto(transformation, key, iv).encrypt(data) | ||||
|      * java.createSymmetricCrypto(transformation, key, iv).encryptBase64(data) | ||||
|      * java.createSymmetricCrypto(transformation, key, iv).encryptHex(data) | ||||
|      */ | ||||
| 
 | ||||
|     /* 调用SymmetricCrypto key为null时使用随机密钥*/ | ||||
|     fun createSymmetricCrypto( | ||||
|         transformation: String, | ||||
|         key: ByteArray?, | ||||
|         iv: ByteArray? | ||||
|     ): SymmetricCrypto { | ||||
|         val symmetricCrypto = SymmetricCrypto(transformation, key) | ||||
|         return if (iv != null && iv.isNotEmpty()) symmetricCrypto.setIv(iv) else symmetricCrypto | ||||
|     } | ||||
| 
 | ||||
|     fun createSymmetricCrypto( | ||||
|         transformation: String, | ||||
|         key: ByteArray | ||||
|     ): SymmetricCrypto { | ||||
|         return createSymmetricCrypto(transformation, key, null) | ||||
|     } | ||||
| 
 | ||||
|     fun createSymmetricCrypto( | ||||
|         transformation: String, | ||||
|         key: String | ||||
|     ): SymmetricCrypto { | ||||
|         return createSymmetricCrypto(transformation, key, null) | ||||
|     } | ||||
| 
 | ||||
|     fun createSymmetricCrypto( | ||||
|         transformation: String, | ||||
|         key: String, | ||||
|         iv: String? | ||||
|     ): SymmetricCrypto { | ||||
|         return createSymmetricCrypto( | ||||
|             transformation, key.encodeToByteArray(), iv?.encodeToByteArray() | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|     //******************对称加密解密old************************// | ||||
| 
 | ||||
|     /////AES | ||||
|     /** | ||||
|      * AES 解码为 ByteArray | ||||
|      * @param str 传入的AES加密的数据 | ||||
|      * @param key AES 解密的key | ||||
|      * @param transformation AES加密的方式 | ||||
|      * @param iv ECB模式的偏移向量 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).decrypt(str)") | ||||
|     ) | ||||
|     fun aesDecodeToByteArray( | ||||
|         str: String, key: String, transformation: String, iv: String | ||||
|     ): ByteArray? { | ||||
|         return createSymmetricCrypto(transformation, key, iv).decrypt(str) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * AES 解码为 String | ||||
|      * @param str 传入的AES加密的数据 | ||||
|      * @param key AES 解密的key | ||||
|      * @param transformation AES加密的方式 | ||||
|      * @param iv ECB模式的偏移向量 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).decryptStr(str)") | ||||
|     ) | ||||
|     fun aesDecodeToString( | ||||
|         str: String, key: String, transformation: String, iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto(transformation, key, iv).decryptStr(str) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * AES解码为String,算法参数经过Base64加密 | ||||
|      * | ||||
|      * @param data 加密的字符串 | ||||
|      * @param key Base64后的密钥 | ||||
|      * @param mode 模式 | ||||
|      * @param padding 补码方式 | ||||
|      * @param iv Base64后的加盐 | ||||
|      * @return 解密后的字符串 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).decryptStr(data)") | ||||
|     ) | ||||
|     fun aesDecodeArgsBase64Str( | ||||
|         data: String, | ||||
|         key: String, | ||||
|         mode: String, | ||||
|         padding: String, | ||||
|         iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto( | ||||
|             "AES/${mode}/${padding}", | ||||
|             Base64.decode(key, Base64.NO_WRAP), | ||||
|             Base64.decode(iv, Base64.NO_WRAP) | ||||
|         ).decryptStr(data) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 已经base64的AES 解码为 ByteArray | ||||
|      * @param str 传入的AES Base64加密的数据 | ||||
|      * @param key AES 解密的key | ||||
|      * @param transformation AES加密的方式 | ||||
|      * @param iv ECB模式的偏移向量 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).decrypt(str)") | ||||
|     ) | ||||
|     fun aesBase64DecodeToByteArray( | ||||
|         str: String, key: String, transformation: String, iv: String | ||||
|     ): ByteArray? { | ||||
|         return createSymmetricCrypto(transformation, key, iv).decrypt(str) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 已经base64的AES 解码为 String | ||||
|      * @param str 传入的AES Base64加密的数据 | ||||
|      * @param key AES 解密的key | ||||
|      * @param transformation AES加密的方式 | ||||
|      * @param iv ECB模式的偏移向量 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).decryptStr(str)") | ||||
|     ) | ||||
|     fun aesBase64DecodeToString( | ||||
|         str: String, key: String, transformation: String, iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto(transformation, key, iv).decryptStr(str) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 加密aes为ByteArray | ||||
|      * @param data 传入的原始数据 | ||||
|      * @param key AES加密的key | ||||
|      * @param transformation AES加密的方式 | ||||
|      * @param iv ECB模式的偏移向量 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).decrypt(data)") | ||||
|     ) | ||||
|     fun aesEncodeToByteArray( | ||||
|         data: String, key: String, transformation: String, iv: String | ||||
|     ): ByteArray? { | ||||
|         return createSymmetricCrypto(transformation, key, iv).decrypt(data) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 加密aes为String | ||||
|      * @param data 传入的原始数据 | ||||
|      * @param key AES加密的key | ||||
|      * @param transformation AES加密的方式 | ||||
|      * @param iv ECB模式的偏移向量 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).decryptStr(data)") | ||||
|     ) | ||||
|     fun aesEncodeToString( | ||||
|         data: String, key: String, transformation: String, iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto(transformation, key, iv).decryptStr(data) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 加密aes后Base64化的ByteArray | ||||
|      * @param data 传入的原始数据 | ||||
|      * @param key AES加密的key | ||||
|      * @param transformation AES加密的方式 | ||||
|      * @param iv ECB模式的偏移向量 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).encryptBase64(data).toByteArray()") | ||||
|     ) | ||||
|     fun aesEncodeToBase64ByteArray( | ||||
|         data: String, key: String, transformation: String, iv: String | ||||
|     ): ByteArray? { | ||||
|         return createSymmetricCrypto(transformation, key, iv).encryptBase64(data).toByteArray() | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 加密aes后Base64化的String | ||||
|      * @param data 传入的原始数据 | ||||
|      * @param key AES加密的key | ||||
|      * @param transformation AES加密的方式 | ||||
|      * @param iv ECB模式的偏移向量 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).encryptBase64(data)") | ||||
|     ) | ||||
|     fun aesEncodeToBase64String( | ||||
|         data: String, key: String, transformation: String, iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto(transformation, key, iv).encryptBase64(data) | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * AES加密并转为Base64,算法参数经过Base64加密 | ||||
|      * | ||||
|      * @param data 被加密的字符串 | ||||
|      * @param key Base64后的密钥 | ||||
|      * @param mode 模式 | ||||
|      * @param padding 补码方式 | ||||
|      * @param iv Base64后的加盐 | ||||
|      * @return 加密后的Base64 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).encryptBase64(data)") | ||||
|     ) | ||||
|     fun aesEncodeArgsBase64Str( | ||||
|         data: String, | ||||
|         key: String, | ||||
|         mode: String, | ||||
|         padding: String, | ||||
|         iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto("AES/${mode}/${padding}", key, iv).encryptBase64(data) | ||||
|     } | ||||
| 
 | ||||
|     /////DES | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).decryptStr(data)") | ||||
|     ) | ||||
|     fun desDecodeToString( | ||||
|         data: String, key: String, transformation: String, iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto(transformation, key, iv).decryptStr(data) | ||||
|     } | ||||
| 
 | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).decryptStr(data)") | ||||
|     ) | ||||
|     fun desBase64DecodeToString( | ||||
|         data: String, key: String, transformation: String, iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto(transformation, key, iv).decryptStr(data) | ||||
|     } | ||||
| 
 | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).encrypt(data)") | ||||
|     ) | ||||
|     fun desEncodeToString( | ||||
|         data: String, key: String, transformation: String, iv: String | ||||
|     ): String? { | ||||
|         return String(createSymmetricCrypto(transformation, key, iv).encrypt(data)) | ||||
|     } | ||||
| 
 | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).encryptBase64(data)") | ||||
|     ) | ||||
|     fun desEncodeToBase64String( | ||||
|         data: String, key: String, transformation: String, iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto(transformation, key, iv).encryptBase64(data) | ||||
|     } | ||||
| 
 | ||||
|     //////3DES | ||||
|     /** | ||||
|      * 3DES解密 | ||||
|      * | ||||
|      * @param data 加密的字符串 | ||||
|      * @param key 密钥 | ||||
|      * @param mode 模式 | ||||
|      * @param padding 补码方式 | ||||
|      * @param iv 加盐 | ||||
|      * @return 解密后的字符串 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).decryptStr(data)") | ||||
|     ) | ||||
|     fun tripleDESDecodeStr( | ||||
|         data: String, | ||||
|         key: String, | ||||
|         mode: String, | ||||
|         padding: String, | ||||
|         iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto("DESede/${mode}/${padding}", key, iv).decryptStr(data) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 3DES解密,算法参数经过Base64加密 | ||||
|      * | ||||
|      * @param data 加密的字符串 | ||||
|      * @param key Base64后的密钥 | ||||
|      * @param mode 模式 | ||||
|      * @param padding 补码方式 | ||||
|      * @param iv Base64后的加盐 | ||||
|      * @return 解密后的字符串 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).decryptStr(data)") | ||||
|     ) | ||||
|     fun tripleDESDecodeArgsBase64Str( | ||||
|         data: String, | ||||
|         key: String, | ||||
|         mode: String, | ||||
|         padding: String, | ||||
|         iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto( | ||||
|             "DESede/${mode}/${padding}", | ||||
|             Base64.decode(key, Base64.NO_WRAP), | ||||
|             iv.encodeToByteArray() | ||||
|         ).decryptStr(data) | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * 3DES加密并转为Base64 | ||||
|      * | ||||
|      * @param data 被加密的字符串 | ||||
|      * @param key 密钥 | ||||
|      * @param mode 模式 | ||||
|      * @param padding 补码方式 | ||||
|      * @param iv 加盐 | ||||
|      * @return 加密后的Base64 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).encryptBase64(data)") | ||||
|     ) | ||||
|     fun tripleDESEncodeBase64Str( | ||||
|         data: String, | ||||
|         key: String, | ||||
|         mode: String, | ||||
|         padding: String, | ||||
|         iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto("DESede/${mode}/${padding}", key, iv) | ||||
|             .encryptBase64(data) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 3DES加密并转为Base64,算法参数经过Base64加密 | ||||
|      * | ||||
|      * @param data 被加密的字符串 | ||||
|      * @param key Base64后的密钥 | ||||
|      * @param mode 模式 | ||||
|      * @param padding 补码方式 | ||||
|      * @param iv Base64后的加盐 | ||||
|      * @return 加密后的Base64 | ||||
|      */ | ||||
|     @Deprecated( | ||||
|         "过于繁琐弃用", | ||||
|         ReplaceWith("createSymmetricCrypto(transformation, key, iv).encryptBase64(data)") | ||||
|     ) | ||||
|     fun tripleDESEncodeArgsBase64Str( | ||||
|         data: String, | ||||
|         key: String, | ||||
|         mode: String, | ||||
|         padding: String, | ||||
|         iv: String | ||||
|     ): String? { | ||||
|         return createSymmetricCrypto( | ||||
|             "DESede/${mode}/${padding}", | ||||
|             Base64.decode(key, Base64.NO_WRAP), | ||||
|             iv.encodeToByteArray() | ||||
|         ).encryptBase64(data) | ||||
|     } | ||||
| 
 | ||||
| //******************消息摘要/散列消息鉴别码************************// | ||||
| 
 | ||||
|     /** | ||||
|      * 生成摘要,并转为16进制字符串 | ||||
|      * | ||||
|      * @param data 被摘要数据 | ||||
|      * @param algorithm 签名算法 | ||||
|      * @return 16进制字符串 | ||||
|      */ | ||||
|     fun digestHex( | ||||
|         data: String, | ||||
|         algorithm: String, | ||||
|     ): String { | ||||
|         return DigestUtil.digester(algorithm).digestHex(data) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 生成摘要,并转为Base64字符串 | ||||
|      * | ||||
|      * @param data 被摘要数据 | ||||
|      * @param algorithm 签名算法 | ||||
|      * @return Base64字符串 | ||||
|      */ | ||||
|     fun digestBase64Str( | ||||
|         data: String, | ||||
|         algorithm: String, | ||||
|     ): String { | ||||
|         return Base64.encodeToString(DigestUtil.digester(algorithm).digest(data), Base64.NO_WRAP) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 生成散列消息鉴别码,并转为16进制字符串 | ||||
|      * | ||||
|      * @param data 被摘要数据 | ||||
|      * @param algorithm 签名算法 | ||||
|      * @param key 密钥 | ||||
|      * @return 16进制字符串 | ||||
|      */ | ||||
|     @Suppress("FunctionName") | ||||
|     fun HMacHex( | ||||
|         data: String, | ||||
|         algorithm: String, | ||||
|         key: String | ||||
|     ): String { | ||||
|         return HMac(algorithm, key.toByteArray()).digestHex(data) | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 生成散列消息鉴别码,并转为Base64字符串 | ||||
|      * | ||||
|      * @param data 被摘要数据 | ||||
|      * @param algorithm 签名算法 | ||||
|      * @param key 密钥 | ||||
|      * @return Base64字符串 | ||||
|      */ | ||||
|     @Suppress("FunctionName") | ||||
|     fun HMacBase64( | ||||
|         data: String, | ||||
|         algorithm: String, | ||||
|         key: String | ||||
|     ): String { | ||||
|         return Base64.encodeToString( | ||||
|             HMac(algorithm, key.toByteArray()).digest(data), | ||||
|             Base64.NO_WRAP | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
					Loading…
					
					
				
		Reference in new issue