From 5950c1c1d14d90bc14ddb5f06b3868b60d022055 Mon Sep 17 00:00:00 2001 From: jmir1 Date: Wed, 14 Jul 2021 17:09:55 +0200 Subject: [PATCH] idk how to decrypt shit ;((( --- .../animeextension/en/twistmoe/AESDecrypt.kt | 53 +++++++++++++++++++ .../animeextension/en/twistmoe/TwistMoe.kt | 17 ++++++ 2 files changed, 70 insertions(+) create mode 100644 src/en/twistmoe/src/eu/kanade/tachiyomi/animeextension/en/twistmoe/AESDecrypt.kt diff --git a/src/en/twistmoe/src/eu/kanade/tachiyomi/animeextension/en/twistmoe/AESDecrypt.kt b/src/en/twistmoe/src/eu/kanade/tachiyomi/animeextension/en/twistmoe/AESDecrypt.kt new file mode 100644 index 000000000..84cfffd12 --- /dev/null +++ b/src/en/twistmoe/src/eu/kanade/tachiyomi/animeextension/en/twistmoe/AESDecrypt.kt @@ -0,0 +1,53 @@ +package eu.kanade.tachiyomi.animeextension.en.twistmoe +import android.annotation.TargetApi +import android.os.Build +import android.util.Log +import java.security.MessageDigest +import java.util.Base64 +import javax.crypto.Cipher +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec + +@TargetApi(Build.VERSION_CODES.O) +class AESDecrypt { + private val decoder = Base64.getDecoder() + private val encoder = Base64.getEncoder() + fun aesEncrypt(v: String, secretKey: ByteArray, initializationVector: ByteArray) = encrypt(v, secretKey, initializationVector) + fun aesDecrypt(v: ByteArray, secretKey: ByteArray, initializationVector: ByteArray) = decrypt(v, secretKey, initializationVector) + fun getIvAndKey(v: String): ByteArray { + val byteStr = decoder.decode(v.toByteArray(Charsets.UTF_8)) + val md5 = MessageDigest.getInstance("MD5") + assert(byteStr.decodeToString(0, 8) == "Salted__") + val salt = byteStr.sliceArray(8..15) + val secretStr = "267041df55ca2b36f2e322d05ee2c9cf" + val secret = secretStr + .map { it.toByte() } + .toByteArray() + val step1 = md5.digest(salt) + val step2 = step1 + md5.digest(step1 + secret) + val step3 = step2 + md5.digest(step2 + secret) + Log.i("lol", step3.decodeToString()) + assert(step3.lastIndex == 47) + return step3 + } + fun getToDecode(v: String): ByteArray { + val byteStr = decoder.decode(v.toByteArray(Charsets.UTF_8)) + assert(byteStr.decodeToString(0, 8) == "Salted__") + return byteStr.sliceArray(16..byteStr.lastIndex) + } + private fun cipher(opmode: Int, secretKey: ByteArray, initializationVector: ByteArray): Cipher { + if (secretKey.lastIndex != 31) throw RuntimeException("SecretKey length is not 32 chars") + val c = Cipher.getInstance("AES/CBC/NoPadding") + val sk = SecretKeySpec(secretKey, "AES") + val iv = IvParameterSpec(initializationVector) + c.init(opmode, sk, iv) + return c + } + private fun encrypt(str: String, secretKey: ByteArray, iv: ByteArray): String { + val encrypted = cipher(Cipher.ENCRYPT_MODE, secretKey, iv).doFinal(str.toByteArray(Charsets.UTF_8)) + return String(encoder.encode(encrypted)) + } + private fun decrypt(str: ByteArray, secretKey: ByteArray, iv: ByteArray): String { + return String(cipher(Cipher.DECRYPT_MODE, secretKey, iv).doFinal(str)) + } +} diff --git a/src/en/twistmoe/src/eu/kanade/tachiyomi/animeextension/en/twistmoe/TwistMoe.kt b/src/en/twistmoe/src/eu/kanade/tachiyomi/animeextension/en/twistmoe/TwistMoe.kt index 416e8e7cc..c42a8363f 100644 --- a/src/en/twistmoe/src/eu/kanade/tachiyomi/animeextension/en/twistmoe/TwistMoe.kt +++ b/src/en/twistmoe/src/eu/kanade/tachiyomi/animeextension/en/twistmoe/TwistMoe.kt @@ -1,5 +1,6 @@ package eu.kanade.tachiyomi.animeextension.en.twistmoe +import android.util.Log import com.google.gson.JsonArray import com.google.gson.JsonElement import com.google.gson.JsonObject @@ -54,6 +55,8 @@ class TwistMoe : AnimeHttpSource() { 1 -> SAnime.ONGOING else -> SAnime.UNKNOWN } + anime.thumbnail_url = "https://homepages.cae.wisc.edu/~ece533/images/cat.png" + anime.initialized = true animeList.add(anime) } return AnimesPage(animeList, false) @@ -89,12 +92,20 @@ class TwistMoe : AnimeHttpSource() { return anime } + override fun videoListRequest(episode: SEpisode): Request { + return super.videoListRequest(episode) + } + override fun videoListParse(response: Response): List