package com.example.utils import kotlin.math.pow sealed interface Encryptable { val data: ByteArray val type:Int data class Encrypt( override val data: ByteArray, override val type: Int = 1 ): Encryptable { override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as Encrypt if (type != other.type) return false if (!data.contentEquals(other.data)) return false return true } override fun hashCode(): Int { var result = type result = 31 * result + data.contentHashCode() return result } } data class Decrypt(override val data: ByteArray, override val type:Int = -1): Encryptable { override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as Decrypt if (type != other.type) return false if (!data.contentEquals(other.data)) return false return true } override fun hashCode(): Int { var result = type result = 31 * result + data.contentHashCode() return result } } } private fun Byte.encryption(key: Byte, method: Int): Byte { // key的预处理,处理结果0<=key&&key<8 val msg = this var key = key key = (method * (key % 8)).toByte() key = (if (key >= 0) key else key + 8).toByte() // msg的预处理,避免msg首位为1 var nMsg = msg.toInt() and 255 // 移位掩码,tmp保存低位溢出信息 val mask = 2.0.pow(key.toDouble()).toInt() - 1 var tmp = nMsg and mask // 循环移位 nMsg = nMsg shr key.toInt() tmp = tmp shl 8 - key // 低位溢出信息移至高位 nMsg = nMsg or tmp return (255 and nMsg).toByte() // 取出低8位 } fun ByteArray.encryption(encryptable: Encryptable): ByteArray { val result = ByteArray(encryptable.data.size) encryptable.data.forEachIndexed { index, byte -> result[index] = byte.encryption(this[index % size], encryptable.type) } return result }