diff --git a/app/src/main/assets/help/jsHelp.md b/app/src/main/assets/help/jsHelp.md index e6690c0a4..2c62027ee 100644 --- a/app/src/main/assets/help/jsHelp.md +++ b/app/src/main/assets/help/jsHelp.md @@ -205,10 +205,14 @@ cipher.encryptBase64(data) cipher.encryptHex(data) ``` * 非对称加密 -> 输入参数密钥 支持ByteArray|**Utf8String** +> 输入参数 key支持ByteArray|**Utf8String** ``` //创建cipher -java.createAsymmetricCrypto(transformation, privateKey, publicKey) +java.createAsymmetricCrypto(transformation) +//设置密钥 +.setPublicKey(key) +.setPrivateKey(key) + ``` > 解密加密参数 data支持ByteArray|Base64String|HexString|InputStream > keyType: 1 使用公钥 2 使用私钥 @@ -222,10 +226,13 @@ cipher.encryptBase64(data, keyType) cipher.encryptHex(data, keyType) ``` * 签名 -> 输入参数密钥 支持ByteArray|**Utf8String** +> 输入参数 key 支持ByteArray|**Utf8String** ``` //创建Sign -java.createSign(algorithm, privateKey, publicKey) +java.createSign(algorithm) +//设置密钥 +.setPublicKey(key) +.setPrivateKey(key) ``` > 签名参数 data支持ByteArray|inputStream|String ``` diff --git a/app/src/main/java/io/legado/app/help/JsEncodeUtils.kt b/app/src/main/java/io/legado/app/help/JsEncodeUtils.kt index 651404828..96c0848b8 100644 --- a/app/src/main/java/io/legado/app/help/JsEncodeUtils.kt +++ b/app/src/main/java/io/legado/app/help/JsEncodeUtils.kt @@ -3,10 +3,10 @@ package io.legado.app.help import android.util.Base64 import cn.hutool.crypto.digest.DigestUtil import cn.hutool.crypto.digest.HMac -import cn.hutool.crypto.asymmetric.AsymmetricCrypto -import cn.hutool.crypto.asymmetric.Sign +import cn.hutool.crypto.asymmetric.* import cn.hutool.crypto.symmetric.SymmetricCrypto import io.legado.app.utils.MD5Utils +import io.legado.app.utils.* /** * js加解密扩展类, 在js中通过java变量调用 @@ -72,43 +72,16 @@ interface JsEncodeUtils { /* keys都为null时使用随机密钥 */ fun createAsymmetricCrypto( - transformation: String, - privateKey: ByteArray?, - publicKey: ByteArray? + transformation: String ): AsymmetricCrypto { - return AsymmetricCrypto(transformation, privateKey, publicKey) + return AsymmetricCrypto(transformation) } - fun createAsymmetricCrypto( - transformation: String, - privateKey: String?, - publicKey: String? - ): AsymmetricCrypto { - return createAsymmetricCrypto( - transformation, - privateKey?.encodeToByteArray(), - publicKey?.encodeToByteArray() - ) - } //******************签名************************// fun createSign( - algorithm: String, - privateKey: String?, - publicKey: String? + algorithm: String ): Sign { - return createSign( - algorithm, - privateKey?.encodeToByteArray(), - publicKey?.encodeToByteArray() - ) - } - - fun createSign( - algorithm: String, - privateKey: ByteArray?, - publicKey: ByteArray? - ): Sign { - return Sign(algorithm, privateKey, publicKey) + return Sign(algorithm) } //******************对称加密解密old************************// diff --git a/app/src/main/java/io/legado/app/utils/AsymmetricCryptoExtension.kt b/app/src/main/java/io/legado/app/utils/AsymmetricCryptoExtension.kt new file mode 100644 index 000000000..078f14340 --- /dev/null +++ b/app/src/main/java/io/legado/app/utils/AsymmetricCryptoExtension.kt @@ -0,0 +1,71 @@ +package io.legado.app.utils + +import cn.hutool.crypto.asymmetric.* +import cn.hutool.crypto.KeyUtil +import java.io.InputStream + +fun AsymmetricCrypto.decrypt(data: Any, keyType: Int): ByteArray? { + return when { + data is ByteArray -> decrypt(data, KeyType(keyType)) + data is String -> decrypt(data, KeyType(keyType)) + data is InputStream -> decrypt(data, KeyType(keyType)) + else -> null + } +} + +fun AsymmetricCrypto.decryptStr(data: Any, keyType: Int): String? { + return when { + data is ByteArray -> decryptStr(data, KeyType(keyType)) + data is String -> decryptStr(data, KeyType(keyType)) + data is InputStream -> decryptStr(data, KeyType(keyType)) + else -> null + } +} + +fun AsymmetricCrypto.encrypt(data: Any, keyType: Int): ByteArray? { + return when { + data is ByteArray -> encrypt(data, KeyType(keyType)) + data is String -> encrypt(data, KeyType(keyType)) + data is InputStream -> encrypt(data, KeyType(keyType)) + else -> null + } +} +fun AsymmetricCrypto.encryptBase64(data: Any, keyType: Int): String? { + return when { + data is ByteArray -> encryptBase64(data, KeyType(keyType)) + data is String -> encryptBase64(data, KeyType(keyType)) + data is InputStream -> encryptBase64(data, KeyType(keyType)) + else -> null + } +} +fun AsymmetricCrypto.encryptHex(data: Any, keyType: Int): String? { + return when { + data is ByteArray -> encryptHex(data, KeyType(keyType)) + data is String -> encryptHex(data, KeyType(keyType)) + data is InputStream -> encryptHex(data, KeyType(keyType)) + else -> null + } +} + +fun AsymmetricCrypto.setPrivateKey(privateKey: ByteArray): AsymmetricCrypto { + return setPrivateKey(KeyUtil.generatePrivateKey(this.algorithm, privateKey)) +} +fun AsymmetricCrypto.setPrivateKey(privateKey: String): AsymmetricCrypto = setPrivateKey(privateKey.encodeToByteArray()) + +fun AsymmetricCrypto.setPublicKey(publicKey: ByteArray): AsymmetricCrypto { + return setPublicKey(KeyUtil.generatePublicKey(this.algorithm, publicKey)) +} +fun AsymmetricCrypto.setPublicKey(publicKey: ByteArray): AsymmetricCrypto = setPublicKey(publicKey.encodeToByteArray()) + +fun Sign.setPrivateKey(privateKey: ByteArray): Sign { + return setPrivateKey(KeyUtil.generatePrivateKey(this.algorithm, privateKey)) +} + +fun Sign.setPrivateKey(privateKey: ByteArray): Sign = setPrivateKey(privateKey.encodeToByteArray()) + +fun Sign.setPublicKey(publicKey: ByteArray): Sign { + return setPublicKey(KeyUtil.generatePublicKey(this.algorithm, publicKey)) +} + +fun Sign.setPublicKey(publicKey: ByteArray): Sign = setPublicKey(publicKey.encodeToByteArray()) +