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 96c0848b8..a98b6441f 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,11 @@ 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.* import cn.hutool.crypto.symmetric.SymmetricCrypto +import io.legado.app.help.crypto.AsymmetricCrypto +import io.legado.app.help.crypto.Sign import io.legado.app.utils.MD5Utils -import io.legado.app.utils.* + /** * js加解密扩展类, 在js中通过java变量调用 diff --git a/app/src/main/java/io/legado/app/help/crypto/AsymmetricCrypto.kt b/app/src/main/java/io/legado/app/help/crypto/AsymmetricCrypto.kt new file mode 100644 index 000000000..9512f7b96 --- /dev/null +++ b/app/src/main/java/io/legado/app/help/crypto/AsymmetricCrypto.kt @@ -0,0 +1,52 @@ +package io.legado.app.help + +import cn.hutool.crypto.asymmetric.AsymmetricCrypto as HutoolAsymmetricCrypto +import cn.hutool.crypto.asymmetric.KeyType +import cn.hutool.crypto.KeyUtil +import java.io.InputStream + +class AsymmetricCrypto(algorithm: String) : HutoolAsymmetricCrypto(algorithm) { + + fun setPrivateKey(key: ByteArray): AsymmetricCrypto { + return setPrivateKey( + KeyUtil.generatePrivateKey(this.algorithm, key) + ) + } + fun setPublicKey(key: String): AsymmetricCrypto = setPrivateKey(key.encodeToByteArray()) + + fun setPublicKey(key: ByteArray): AsymmetricCrypto { + return setPublicKey( + KeyUtil.generatePublicKey(this.algorithm, key) + ) + } + fun setPrivateKey(key: String): AsymmetricCrypto = setPrivateKey(key.encodeToByteArray()) + + private fun getKeyType(): KeyType { + return when { + this.publicKey != null -> KeyType.PublicKey + this.privateKey != null -> KeyType.PrivateKey + else -> KeyType.SecretKey + } + } + + private fun cryptoDelegate( + data: Any, + func: (Any, KeyType) -> T + ): T { + val keyType = getKeyType() + return when { + data is ByteArray -> func.invoke(data, keyType) + data is String -> func.invoke(data, keyType) + data is InputStream -> func.invoke(data, keyType) + else -> null + } + } + + fun decrypt(data: Any): ByteArray? = cryptoDelegate(data, decrypt) + fun decryptStr(data: Any): String? = cryptoDelegate(data, decryptStr) + + fun encrypt(data: Any): ByteArray? = cryptoDelegate(data, encrypt) + fun encryptHex(data: Any): String? = cryptoDelegate(data, encryptHex) + fun encryptBase64(data: Any): String? =cryptoDelegate(data, encryptBase64) + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/crypto/README.md b/app/src/main/java/io/legado/app/help/crypto/README.md new file mode 100644 index 000000000..13c6380fd --- /dev/null +++ b/app/src/main/java/io/legado/app/help/crypto/README.md @@ -0,0 +1,17 @@ +https://github.com/gedoor/legado/pull/2880 + +非对称加密一般只能知道其中一个密钥,而RhinoJs调用java方法不能传入null, 因此提供以下重载函数 +```kotlin +fun setPublicKey(key: ByteArray): T +fun setPublicKey(key: String): T +fun setPrivateKey(key: ByteArray): T +fun setPrivateKey(key: String): T + +//自动从公钥开始尝试 +fun decrypt(data: Any): ByteArray? +fun decryptStr(data: Any): String? + +fun encrypt(data: Any): ByteArray? +fun encryptHex(data: Any): String? +fun encryptBase64(data: Any): String? +``` \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/crypto/Sign.kt b/app/src/main/java/io/legado/app/help/crypto/Sign.kt new file mode 100644 index 000000000..a63606cf0 --- /dev/null +++ b/app/src/main/java/io/legado/app/help/crypto/Sign.kt @@ -0,0 +1,23 @@ +package io.legado.app.help + +import cn.hutool.crypto.asymmetric.Sign as HutoolSign +import cn.hutool.crypto.KeyUtil + +class Sign(algorithm: String): HutoolSign(algorithm) { + + fun setPrivateKey(key: ByteArray): Sign { + return setPrivateKey( + KeyUtil.generatePrivateKey(this.algorithm, key) + ) + } + fun setPublicKey(key: String): Sign = setPrivateKey(key.encodeToByteArray()) + + fun setPublicKey(key: ByteArray): Sign { + return setPublicKey( + KeyUtil.generatePublicKey(this.algorithm, key) + ) + } + fun setPrivateKey(key: String): Sign = setPrivateKey(key.encodeToByteArray()) + +} +