{"repo": "ahasasjeb/deepseek-jiankong", "files": {"app/src/main/java/fun/lzy/data/ApiKeyManager.kt": {"c171e455cc914eabb89a1245ad6e3b49e7e97dfc": {"t": 1785745712.6694293, "n": 4797, "h": "4b19637e7c60b380", "c": "package `fun`.lzy.data\n\nimport android.content.Context\nimport android.security.keystore.KeyGenParameterSpec\nimport android.security.keystore.KeyProperties\nimport android.util.Base64\nimport java.security.KeyStore\nimport javax.crypto.Cipher\nimport javax.crypto.KeyGenerator\nimport javax.crypto.SecretKey\nimport javax.crypto.spec.GCMParameterSpec\n\nclass ApiKeyManager(context: Context) {\n private val prefs = context.getSharedPreferences(\"deepseek_secure_prefs\", Context.MODE_PRIVATE)\n\n companion object {\n private const val KEY_DEEPSEEK_API_KEY = \"encrypted_api_key\"\n private const val KEY_LEGACY_DEEPSEEK_API_KEY = \"obscured_api_key\"\n private const val KEY_CHECK_INTERVAL_SEC = \"check_interval_sec\"\n private const val KEYSTORE_ALIAS = \"deepseek_monitor_api_key\"\n private const val ANDROID_KEYSTORE = \"AndroidKeyStore\"\n private const val TRANSFORMATION = \"AES/GCM/NoPadding\"\n private const val GCM_TAG_LENGTH_BITS = 128\n private val LEGACY_OBFUSCATION_KEY = byteArrayOf(57, 118, 92, 19, 73, 112, 12, 34)\n }\n\n fun getApiKey(): String {\n prefs.getString(KEY_DEEPSEEK_API_KEY, null)?.let { encryptedBase64 ->\n return decryptWithKeystore(encryptedBase64)\n }\n\n return migrateLegacyApiKey()\n }\n\n fun saveApiKey(apiKey: String) {\n val trimmed = apiKey.trim()\n val editor = prefs.edit().remove(KEY_LEGACY_DEEPSEEK_API_KEY)\n if (trimmed.isEmpty()) {\n editor.remove(KEY_DEEPSEEK_API_KEY).apply()\n return\n }\n\n encryptWithKeystore(trimmed)?.let { encryptedBase64 ->\n editor.putString(KEY_DEEPSEEK_API_KEY, encryptedBase64).apply()\n }\n }\n\n fun clearApiKey() {\n prefs.edit()\n .remove(KEY_DEEPSEEK_API_KEY)\n .remove(KEY_LEGACY_DEEPSEEK_API_KEY)\n .apply()\n }\n\n fun getCheckInterval(): Int {\n return prefs.getInt(KEY_CHECK_INTERVAL_SEC, 53) // Default to 53 seconds\n }\n\n fun saveCheckInterval(seconds: Int) {\n prefs.edit().putInt(KEY_CHECK_INTERVAL_SEC, seconds).apply()\n }\n\n private fun encryptWithKeystore(value: String): String? {\n return try {\n val cipher = Cipher.getInstance(TRANSFORMATION)\n cipher.init(Cipher.ENCRYPT_MODE, getOrCreateSecretKey())\n val cipherText = cipher.doFinal(value.toByteArray(Charsets.UTF_8))\n val payload = cipher.iv + cipherText\n Base64.encodeToString(payload, Base64.NO_WRAP)\n } catch (e: Exception) {\n null\n }\n }\n\n private fun decryptWithKeystore(base64Str: String): String {\n return try {\n val payload = Base64.decode(base64Str, Base64.NO_WRAP)\n if (payload.size <= 12) return \"\"\n val iv = payload.copyOfRange(0, 12)\n val cipherText = payload.copyOfRange(12, payload.size)\n val cipher = Cipher.getInstance(TRANSFORMATION)\n cipher.init(Cipher.DECRYPT_MODE, getOrCreateSecretKey(), GCMParameterSpec(GCM_TAG_LENGTH_BITS, iv))\n String(cipher.doFinal(cipherText), Charsets.UTF_8)\n } catch (e: Exception) {\n \"\"\n }\n }\n\n private fun getOrCreateSecretKey(): SecretKey {\n val keyStore = KeyStore.getInstance(ANDROID_KEYSTORE).apply { load(null) }\n (keyStore.getEntry(KEYSTORE_ALIAS, null) as? KeyStore.SecretKeyEntry)?.let {\n return it.secretKey\n }\n\n val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEYSTORE)\n val keySpec = KeyGenParameterSpec.Builder(\n KEYSTORE_ALIAS,\n KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT\n )\n .setBlockModes(KeyProperties.BLOCK_MODE_GCM)\n .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)\n .setKeySize(256)\n .build()\n keyGenerator.init(keySpec)\n return keyGenerator.generateKey()\n }\n\n private fun migrateLegacyApiKey(): String {\n val legacyBase64 = prefs.getString(KEY_LEGACY_DEEPSEEK_API_KEY, null) ?: return \"\"\n val legacyApiKey = try {\n String(xorDecryptLegacy(legacyBase64), Charsets.UTF_8).trim()\n } catch (e: Exception) {\n \"\"\n }\n\n if (legacyApiKey.isNotEmpty()) {\n saveApiKey(legacyApiKey)\n } else {\n prefs.edit().remove(KEY_LEGACY_DEEPSEEK_API_KEY).apply()\n }\n return legacyApiKey\n }\n\n private fun xorDecryptLegacy(base64Str: String): ByteArray {\n val bytes = Base64.decode(base64Str, Base64.NO_WRAP)\n return ByteArray(bytes.size) { i ->\n (bytes[i].toInt() xor LEGACY_OBFUSCATION_KEY[i % LEGACY_OBFUSCATION_KEY.size].toInt()).toByte()\n }\n }\n}\n"}, "d5bce874ba00f37342ccc97a55b05e0d320b11ce": {"t": 1785755821.7109966, "n": 4797, "h": "4b19637e7c60b380", "c": "package `fun`.lzy.data\n\nimport android.content.Context\nimport android.security.keystore.KeyGenParameterSpec\nimport android.security.keystore.KeyProperties\nimport android.util.Base64\nimport java.security.KeyStore\nimport javax.crypto.Cipher\nimport javax.crypto.KeyGenerator\nimport javax.crypto.SecretKey\nimport javax.crypto.spec.GCMParameterSpec\n\nclass ApiKeyManager(context: Context) {\n private val prefs = context.getSharedPreferences(\"deepseek_secure_prefs\", Context.MODE_PRIVATE)\n\n companion object {\n private const val KEY_DEEPSEEK_API_KEY = \"encrypted_api_key\"\n private const val KEY_LEGACY_DEEPSEEK_API_KEY = \"obscured_api_key\"\n private const val KEY_CHECK_INTERVAL_SEC = \"check_interval_sec\"\n private const val KEYSTORE_ALIAS = \"deepseek_monitor_api_key\"\n private const val ANDROID_KEYSTORE = \"AndroidKeyStore\"\n private const val TRANSFORMATION = \"AES/GCM/NoPadding\"\n private const val GCM_TAG_LENGTH_BITS = 128\n private val LEGACY_OBFUSCATION_KEY = byteArrayOf(57, 118, 92, 19, 73, 112, 12, 34)\n }\n\n fun getApiKey(): String {\n prefs.getString(KEY_DEEPSEEK_API_KEY, null)?.let { encryptedBase64 ->\n return decryptWithKeystore(encryptedBase64)\n }\n\n return migrateLegacyApiKey()\n }\n\n fun saveApiKey(apiKey: String) {\n val trimmed = apiKey.trim()\n val editor = prefs.edit().remove(KEY_LEGACY_DEEPSEEK_API_KEY)\n if (trimmed.isEmpty()) {\n editor.remove(KEY_DEEPSEEK_API_KEY).apply()\n return\n }\n\n encryptWithKeystore(trimmed)?.let { encryptedBase64 ->\n editor.putString(KEY_DEEPSEEK_API_KEY, encryptedBase64).apply()\n }\n }\n\n fun clearApiKey() {\n prefs.edit()\n .remove(KEY_DEEPSEEK_API_KEY)\n .remove(KEY_LEGACY_DEEPSEEK_API_KEY)\n .apply()\n }\n\n fun getCheckInterval(): Int {\n return prefs.getInt(KEY_CHECK_INTERVAL_SEC, 53) // Default to 53 seconds\n }\n\n fun saveCheckInterval(seconds: Int) {\n prefs.edit().putInt(KEY_CHECK_INTERVAL_SEC, seconds).apply()\n }\n\n private fun encryptWithKeystore(value: String): String? {\n return try {\n val cipher = Cipher.getInstance(TRANSFORMATION)\n cipher.init(Cipher.ENCRYPT_MODE, getOrCreateSecretKey())\n val cipherText = cipher.doFinal(value.toByteArray(Charsets.UTF_8))\n val payload = cipher.iv + cipherText\n Base64.encodeToString(payload, Base64.NO_WRAP)\n } catch (e: Exception) {\n null\n }\n }\n\n private fun decryptWithKeystore(base64Str: String): String {\n return try {\n val payload = Base64.decode(base64Str, Base64.NO_WRAP)\n if (payload.size <= 12) return \"\"\n val iv = payload.copyOfRange(0, 12)\n val cipherText = payload.copyOfRange(12, payload.size)\n val cipher = Cipher.getInstance(TRANSFORMATION)\n cipher.init(Cipher.DECRYPT_MODE, getOrCreateSecretKey(), GCMParameterSpec(GCM_TAG_LENGTH_BITS, iv))\n String(cipher.doFinal(cipherText), Charsets.UTF_8)\n } catch (e: Exception) {\n \"\"\n }\n }\n\n private fun getOrCreateSecretKey(): SecretKey {\n val keyStore = KeyStore.getInstance(ANDROID_KEYSTORE).apply { load(null) }\n (keyStore.getEntry(KEYSTORE_ALIAS, null) as? KeyStore.SecretKeyEntry)?.let {\n return it.secretKey\n }\n\n val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEYSTORE)\n val keySpec = KeyGenParameterSpec.Builder(\n KEYSTORE_ALIAS,\n KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT\n )\n .setBlockModes(KeyProperties.BLOCK_MODE_GCM)\n .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)\n .setKeySize(256)\n .build()\n keyGenerator.init(keySpec)\n return keyGenerator.generateKey()\n }\n\n private fun migrateLegacyApiKey(): String {\n val legacyBase64 = prefs.getString(KEY_LEGACY_DEEPSEEK_API_KEY, null) ?: return \"\"\n val legacyApiKey = try {\n String(xorDecryptLegacy(legacyBase64), Charsets.UTF_8).trim()\n } catch (e: Exception) {\n \"\"\n }\n\n if (legacyApiKey.isNotEmpty()) {\n saveApiKey(legacyApiKey)\n } else {\n prefs.edit().remove(KEY_LEGACY_DEEPSEEK_API_KEY).apply()\n }\n return legacyApiKey\n }\n\n private fun xorDecryptLegacy(base64Str: String): ByteArray {\n val bytes = Base64.decode(base64Str, Base64.NO_WRAP)\n return ByteArray(bytes.size) { i ->\n (bytes[i].toInt() xor LEGACY_OBFUSCATION_KEY[i % LEGACY_OBFUSCATION_KEY.size].toInt()).toByte()\n }\n }\n}\n"}, "36a462d4055fdadbe0d57adf2f526b69ce68117f": {"t": 1785755823.9377515, "n": 2101, "h": "8636d04bbfeb9df5", "c": "package fun.lzy.data\n\nimport android.content.Context\nimport android.util.Base64\n\nclass ApiKeyManager(context: Context) {\n private val prefs = context.getSharedPreferences(\"deepseek_secure_prefs\", Context.MODE_PRIVATE)\n\n companion object {\n private const val KEY_DEEPSEEK_API_KEY = \"obscured_api_key\"\n private const val KEY_CHECK_INTERVAL_SEC = \"check_interval_sec\"\n private val OBFUSCATION_KEY = byteArrayOf(57, 118, 92, 19, 73, 112, 12, 34) // XOR Obfuscation Key\n }\n\n fun getApiKey(): String {\n val encryptedBase64 = prefs.getString(KEY_DEEPSEEK_API_KEY, null) ?: return \"\"\n return try {\n val decryptedBytes = xorDecrypt(encryptedBase64)\n String(decryptedBytes, Charsets.UTF_8)\n } catch (e: Exception) {\n \"\"\n }\n }\n\n fun saveApiKey(apiKey: String) {\n try {\n val encryptedBase64 = xorEncrypt(apiKey.trim().toByteArray(Charsets.UTF_8))\n prefs.edit().putString(KEY_DEEPSEEK_API_KEY, encryptedBase64).apply()\n } catch (e: Exception) {\n // Log/Ignore\n }\n }\n\n fun clearApiKey() {\n prefs.edit().remove(KEY_DEEPSEEK_API_KEY).apply()\n }\n\n fun getCheckInterval(): Int {\n return prefs.getInt(KEY_CHECK_INTERVAL_SEC, 53) // Default to 53 seconds\n }\n\n fun saveCheckInterval(seconds: Int) {\n prefs.edit().putInt(KEY_CHECK_INTERVAL_SEC, seconds).apply()\n }\n\n private fun xorEncrypt(bytes: ByteArray): String {\n val result = ByteArray(bytes.size)\n for (i in bytes.indices) {\n result[i] = (bytes[i].toInt() xor OBFUSCATION_KEY[i % OBFUSCATION_KEY.size].toInt()).toByte()\n }\n return Base64.encodeToString(result, Base64.NO_WRAP)\n }\n\n private fun xorDecrypt(base64Str: String): ByteArray {\n val bytes = Base64.decode(base64Str, Base64.NO_WRAP)\n val result = ByteArray(bytes.size)\n for (i in bytes.indices) {\n result[i] = (bytes[i].toInt() xor OBFUSCATION_KEY[i % OBFUSCATION_KEY.size].toInt()).toByte()\n }\n return result\n }\n}\n"}}}}