kotlin AES辐棒、DES、RSA、MD5漾根、SHA1泰涂、SHA256對(duì)稱加密非對(duì)稱加密簡(jiǎn)單實(shí)現(xiàn)(工具類)

一 : 對(duì)稱加密(DES、AES)

1.DES

object Des {

    //學(xué)習(xí)查看api

    //算法/工作模式/填充模式

//    val transformation  = "DES/ECB/PKCS5Padding"

    val transformation  = "DES/CBC/PKCS5Padding"

    val algorithm  = "DES"

    fun encrypt(input:String,password:String):String{

//        val input = "歡迎來(lái)到花花世界"

//        var password = "12345678"

        val cipher = Cipher.getInstance(transformation)

        val instance = SecretKeyFactory.getInstance(algorithm)

        var keySpec = DESKeySpec(password.toByteArray())

        val key: Key? = instance.generateSecret(keySpec)

        val  iv = IvParameterSpec(password.toByteArray())

        cipher.init(Cipher.ENCRYPT_MODE,key,iv)//需要額外的參數(shù)

        val doFinal = cipher.doFinal(input.toByteArray())

        println("加密后字節(jié)數(shù)據(jù)長(zhǎng)度 :" + doFinal.size)

        //base64編碼

       return Base64.encode(doFinal)

    }

    fun descrypt(input:String,password:String):ByteArray{

//        val input = "歡迎來(lái)到花花世界"

//        var password = "12345678"

        val cipher = Cipher.getInstance(transformation)

        val instance = SecretKeyFactory.getInstance(algorithm)

        var keySpec = DESKeySpec(password.toByteArray())

        val key: Key? = instance.generateSecret(keySpec)

        val  iv = IvParameterSpec(password.toByteArray())

        cipher.init(Cipher.DECRYPT_MODE,key,iv)

        val doFinal = cipher.doFinal(Base64.decode(input))

        return doFinal

    }

}

fun main(args: Array<String>) {

    val input = "歡迎"

var password = "12345678"http://密碼必須是8位

    val toByteArray = input.toByteArray()

    println(toByteArray.size)

    toByteArray.forEach {

        println(it)

    }

    val encrypt = Des.encrypt(input, password)

    println(encrypt)//加密后變長(zhǎng)啦

    val descrypt = Des.descrypt(encrypt, password)

    println(String(descrypt))

}

2 : AES

fun main(args: Array<String>) {

val password ="1234567812345678"http://密碼必須是16位

    val input ="歡迎"

    val encrypt = Aes.encrypt(input, password)

println(encrypt)

val decrypt = Aes.Decrypt(encrypt, password)

println(decrypt)

}

object Aes{

fun encrypt(input:String,password:String): String {

val instance = Cipher.getInstance("AES")

val keySpec:SecretKeySpec? = SecretKeySpec(password.toByteArray(),"AES")

instance.init(Cipher.ENCRYPT_MODE,keySpec)

val doFinal = instance.doFinal(input.toByteArray())

return Base64.encode(doFinal)

}

fun Decrypt(input:String,password:String):String {

val instance = Cipher.getInstance("AES")

val keySpec:SecretKeySpec? = SecretKeySpec(password.toByteArray(),"AES")

instance.init(Cipher.DECRYPT_MODE,keySpec)

val doFinal = instance.doFinal(Base64.decode(input))

return String(doFinal)

}

}

二 : 非對(duì)稱加密(RSA)

object RSACrypt {

val transformation ="RSA"

    val ENCYPT_SISE =117

    val ENCYPT_MAX_SISE =128

    fun encryptBrPrivateKey(intput:String,privateKey:PrivateKey): String {

val inputArray = intput.toByteArray()

var temp:ByteArray? =null

        var offset =0//偏一

        val byteArrayOutputStream = ByteArrayOutputStream()

val cipher = Cipher.getInstance(transformation)

cipher.init(Cipher.ENCRYPT_MODE,privateKey)

//拆成幾個(gè)部分

        while (inputArray.size - offset >0){

if (inputArray.size - offset >=ENCYPT_SISE){

temp = cipher.doFinal(inputArray,offset,ENCYPT_SISE)

offset +=ENCYPT_SISE

            }else{

temp = cipher.doFinal(inputArray,offset,inputArray.size - offset)

offset = inputArray.size

            }

byteArrayOutputStream.write(temp)

}

byteArrayOutputStream.close()

return Base64.encode( byteArrayOutputStream.toByteArray())

}

fun encryptBrPublicKey(intput:String,privateKey:PublicKey): String {

val inputArray = intput.toByteArray()

var temp:ByteArray? =null

        var offset =0//偏一

        val byteArrayOutputStream = ByteArrayOutputStream()

val cipher = Cipher.getInstance(transformation)

cipher.init(Cipher.ENCRYPT_MODE,privateKey)

//拆成幾個(gè)部分

        while (inputArray.size - offset >0){

if (inputArray.size - offset >=ENCYPT_SISE){

temp = cipher.doFinal(inputArray,offset,ENCYPT_SISE)

offset +=ENCYPT_SISE

            }else{

temp = cipher.doFinal(inputArray,offset,inputArray.size - offset)

offset = inputArray.size

            }

byteArrayOutputStream.write(temp)

}

byteArrayOutputStream.close()

return Base64.encode( byteArrayOutputStream.toByteArray())

}

fun decryptBrPublicKey(intput:String,privateKey:PublicKey): String {

val inputArray = Base64.decode(intput)

var temp:ByteArray? =null

        var offset =0//偏一

        val byteArrayOutputStream = ByteArrayOutputStream()

val cipher = Cipher.getInstance(transformation)

cipher.init(Cipher.DECRYPT_MODE,privateKey)

//拆成幾個(gè)部分

        while (inputArray.size - offset >0){

if (inputArray.size - offset >=ENCYPT_MAX_SISE){

temp = cipher.doFinal(inputArray,offset,ENCYPT_MAX_SISE)

offset +=ENCYPT_MAX_SISE

            }else{

temp = cipher.doFinal(inputArray,offset,inputArray.size - offset)

offset = inputArray.size

            }

byteArrayOutputStream.write(temp)

}

byteArrayOutputStream.close()

return String( byteArrayOutputStream.toByteArray())

}

fun desryptBrPrivateKey(intput:String,privateKey:PrivateKey): String {

val inputArray = Base64.decode(intput)

var temp:ByteArray? =null

        var offset =0//偏一

        val byteArrayOutputStream = ByteArrayOutputStream()

val cipher = Cipher.getInstance(transformation)

cipher.init(Cipher.DECRYPT_MODE,privateKey)

//拆成幾個(gè)部分

        while (inputArray.size - offset >0){

if (inputArray.size - offset >=ENCYPT_MAX_SISE){

temp = cipher.doFinal(inputArray,offset,ENCYPT_MAX_SISE)

offset +=ENCYPT_MAX_SISE

            }else{

temp = cipher.doFinal(inputArray,offset,inputArray.size - offset)

offset = inputArray.size

            }

byteArrayOutputStream.write(temp)

}

byteArrayOutputStream.close()

return String( byteArrayOutputStream.toByteArray())

}

}

fun main(args: Array<String>) {

//生成密鑰對(duì):密鑰對(duì)

    val instance = KeyPairGenerator.getInstance("RSA")//密鑰生成器

    val genKeyPair = instance.genKeyPair()

val publicKey = genKeyPair.public

    val privateKey = genKeyPair.private

    println("公鑰 : " + Base64.encode(publicKey.encoded))

println("私鑰 : " + Base64.encode(privateKey.encoded))

var publicKeyStr ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbS0YjpJWh/IOwe40IY61FNyUBn2PYbDp0Oi5cvMTAgNtOfstrxlJrMV/A206IrpXB6Lm/eUZov4n42gjW2PbqfG6Prew3+r/u2ZjG5AUJPh/sTGln0kFr4zqykvy8qdeqpnJawkuhDfos+CAGDv8uibYCi+gvARS8HGEnbv6nPQIDAQAB"

    var privateKeyStr ="MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJtLRiOklaH8g7B7jQhjrUU3JQGfY9hsOnQ6Lly8xMCA205+y2vGUmsxX8DbToiulcHoub95Rmi/ifjaCNbY9up8bo+t7Df6v+7ZmMbkBQk+H+xMaWfSQWvjOrKS/Lyp16qmclrCS6EN+iz4IAYO/y6JtgKL6C8BFLwcYSdu/qc9AgMBAAECgYA2DozayWbg3UKGA2wDeJcPGfQCzZX29y2d2cbbt0YR8IjmmRJ8cKut7qDzRCPhRkyRFE7cTP3qZopDmroq95lzV5psAJJUXWG/0ZQifZuI2F1toeAzGRdIuuZDClSF4J9xDA/WH9wg/quHKqwbD2sOkayBAIOY1xXGhrZ1s2uhTQJBAOvIoy35HKjkfXFl10cToAQS7PbLJVCoUkdStu1lZydb9pBASIqlVSf4A++dYSe2lfUCx3qFK61DtF2ImcnaVtMCQQCom+skXag+p9fvjif7fxz847w/dRC5QNUWYS1/gntY+H3+Gp2jiwppOpLOdSLiHsuhmq5tLz5SxBiVcCdIR1+vAkBqDqLP4BjzI2wFoQCXuQ0mJ/ks/a24PS5dZKhh2lXvD1+1/SRkMQA/7UCf/JOiEHAdeHWP9+zwj97Gn9ZFRI//AkBz71n9FGUmR/TDpIS7eojtHo6HN7B7ISgkDkfhoE++OocvnQ99r5JGDt95FLQatUAha6G6M7zv3iRlRMvN+D3DAkAxY6zV4Lwy/OyIsO/LfnN5c833Y9O4lQuvDqsUzYw2oOiZwepvxnqovOPhL+PjssZfVinkRLKRS86TPjQUFbVr"

    val instance1 = KeyFactory.getInstance("RSA")

val privateKeyS:PrivateKey = instance1.generatePrivate(PKCS8EncodedKeySpec(Base64.decode(privateKeyStr)))

val publicKeyS:PublicKey = instance1.generatePublic(X509EncodedKeySpec(Base64.decode(publicKeyStr)))

val input ="你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好"

    println("字符串長(zhǎng)度 :" + input.length)

println("字符串字節(jié)長(zhǎng)度 :" + input.toByteArray().size)//RSE不能超過(guò)117個(gè)字節(jié)

    val encryptBrPrivateKey = RSACrypt.encryptBrPrivateKey(input, privateKeyS)

println("私鑰加密 : " + encryptBrPrivateKey)

val encryptBrPublicKey = RSACrypt.encryptBrPublicKey(input, publicKeyS)

println("公鑰加密 : " + encryptBrPublicKey)

val desryptBrPrivateKey = RSACrypt.desryptBrPrivateKey(encryptBrPublicKey, privateKeyS)

println("私鑰解密 : " + desryptBrPrivateKey)

val decryptBrPublicKey = RSACrypt.decryptBrPublicKey(encryptBrPrivateKey, publicKeyS)

println("公鑰解密 : " + decryptBrPublicKey)

//******************************************

//    val input = "你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好"

//    println("字符串長(zhǎng)度 :" + input.length)

//    println("字符串字節(jié)長(zhǎng)度 :" + input.toByteArray().size)//RSE不能超過(guò)117個(gè)字節(jié)

//    val encryptBrPrivateKey = RSACrypt.encryptBrPrivateKey(input, privateKey)

//    println("私鑰加密 :" + encryptBrPrivateKey)

//    val encryptBrPublicKey = RSACrypt.encryptBrPublicKey(input, publicKey)

//    println("公鑰加密 :" + encryptBrPublicKey)

//    val desryptBrPrivateKey = RSACrypt.desryptBrPrivateKey(encryptBrPublicKey, privateKey)

//    println("私鑰解密 :" + desryptBrPrivateKey)

//

//    val decryptBrPublicKey = RSACrypt.decryptBrPublicKey(encryptBrPrivateKey, publicKey)

//    println("公鑰解密 :" + decryptBrPublicKey)

}

三 :MD5辐怕、SHA1逼蒙、SHA256

object MessageDigetUtils {

/**

    * 轉(zhuǎn)為16進(jìn)制

    */

    fun toHex(byteArray:ByteArray): String {

var str =with(StringBuilder()){

            //轉(zhuǎn)為字符串

            byteArray.forEach {

                //        println(it)

                var value =it

                var hex = value.toInt() and  (0xFF)

val toHexString = Integer.toHexString(hex)

if (toHexString.length ==1){

this.append("0" + toHexString)

}else{

this.append(toHexString)

}

}

            println(this.length)

return this.toString()

}

        return str

}

fun md5(input:String): String {

val md = MessageDigest.getInstance("MD5")

val digest = md.digest(input.toByteArray())

println("MD5加密前 : " + digest.size)

return toHex(digest)

}

fun sha1(intput:String): String {

val instance = MessageDigest.getInstance("SHA-1")

val digest = instance.digest(intput.toByteArray())

println("SHA-1加密前 : " + digest.size)

return toHex(digest)

}

fun sha256(intput:String): String {

val instance = MessageDigest.getInstance("SHA-256")

val digest = instance.digest(intput.toByteArray())

println("SHA-256加密前 : " + digest.size)

return toHex(digest)

}

}

fun main(args: Array<String>) {

var mChar:String ="你好不開(kāi)心"

    val md5 = MessageDigetUtils.md5(mChar)

println(md5)

println(md5.toByteArray().size)

val sha1 = MessageDigetUtils.sha1(mChar)

println(sha1)

println(sha1.toByteArray().size)

val sha256 = MessageDigetUtils.sha256(mChar)

println(sha256)

println(sha256.toByteArray().size)

}

四 :數(shù)字簽名

object SignatureDemo {

fun sign(input:String,privateKey:PrivateKey): String {

val instance = Signature.getInstance("SHA256withRSA")

instance.initSign(privateKey)

instance.update(input.toByteArray())

val sign = instance.sign()

return Base64.encode(sign)

}

fun verify(input: String,publicKey:PublicKey,sign:String): Boolean {

val instance = Signature.getInstance("SHA256withRSA")

instance.initVerify(publicKey)

instance.update(input.toByteArray())

//校驗(yàn)

        val verify = instance.verify(Base64.decode(sign))

return verify

}

}

fun main(args: Array<String>) {

val input:String ="你好不開(kāi)心呢"

    val privateKey = RSACrypt.getPrivateKey()

val sign = SignatureDemo.sign(input, privateKey)

println(sign)

//***************jiaoyan************************

    val verify = SignatureDemo.verify(input, RSACrypt.getPublicKey(), sign)

println(verify)

}

注意Base64類在此:

object Base64 {

private val base64EncodeChars =charArrayOf('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/')

private val base64DecodeChars =byteArrayOf(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1)

fun encode(data: ByteArray): String {

val sb = StringBuffer()

val len = data.size

        var i =0

        var b1: Int

var b2: Int

var b3: Int

while (i < len) {

b1 = ((data[i++]).toInt() and0xff).toInt()

if (i == len) {

sb.append(base64EncodeChars[b1.ushr(2)])

sb.append(base64EncodeChars[b1 and0x3 shl4])

sb.append("==")

break

            }

b2 = (data[i++]).toInt() and0xff

            if (i == len) {

sb.append(base64EncodeChars[b1.ushr(2)])

sb.append(base64EncodeChars[b1 and0x03 shl4 or (b2 and0xf0).ushr(4)])

sb.append(base64EncodeChars[b2 and0x0f shl2])

sb.append("=")

break

            }

b3 = (data[i++]).toInt() and0xff

            sb.append(base64EncodeChars[b1.ushr(2)])

sb.append(base64EncodeChars[b1 and0x03 shl4 or (b2 and0xf0).ushr(4)])

sb.append(base64EncodeChars[b2 and0x0f shl2 or (b3 and0xc0).ushr(6)])

sb.append(base64EncodeChars[b3 and0x3f])

}

return sb.toString()

}

@Throws(UnsupportedEncodingException::class)

fun decode(str: String): ByteArray {

val sb = StringBuffer()

val data = str.toByteArray(charset("US-ASCII"))

val len = data.size

        var i =0

        var b1: Int

var b2: Int

var b3: Int

var b4: Int

while (i < len) {

/* b1 */

            do {

b1 =base64DecodeChars[(data[i++]).toInt()].toInt()

}while (i < len && b1 == -1)

if (b1 == -1)break

            /* b2 */

            do {

b2 =base64DecodeChars[(data[i++]).toInt()].toInt()

}while (i < len && b2 == -1)

if (b2 == -1)break

            sb.append((b1 shl2 or (b2 and0x30).ushr(4)).toChar())

/* b3 */

            do {

b3 = data[i++].toInt()

if (b3 ==61)return sb.toString().toByteArray(charset("ISO-8859-1"))

b3 =base64DecodeChars[b3].toInt()

}while (i < len && b3 == -1)

if (b3 == -1)break

            sb.append((b2 and0x0f shl4 or (b3 and0x3c).ushr(2)).toChar())

/* b4 */

            do {

b4 = data[i++].toInt()

if (b4 ==61)return sb.toString().toByteArray(charset("ISO-8859-1"))

b4 =base64DecodeChars[b4].toInt()

}while (i < len && b4 == -1)

if (b4 == -1)break

            sb.append((b3 and0x03 shl6 or b4).toChar())

}

return sb.toString().toByteArray(charset("ISO-8859-1"))

}

}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市寄疏,隨后出現(xiàn)的幾起案子是牢,更是在濱河造成了極大的恐慌,老刑警劉巖陕截,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驳棱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡农曲,警方通過(guò)查閱死者的電腦和手機(jī)社搅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乳规,“玉大人形葬,你說(shuō)我怎么就攤上這事⊙蓖” “怎么了荷并?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵合砂,是天一觀的道長(zhǎng)青扔。 經(jīng)常有香客問(wèn)我,道長(zhǎng)翩伪,這世上最難降的妖魔是什么微猖? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮缘屹,結(jié)果婚禮上凛剥,老公的妹妹穿的比我還像新娘。我一直安慰自己轻姿,他們只是感情好犁珠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著互亮,像睡著了一般犁享。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上豹休,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天炊昆,我揣著相機(jī)與錄音,去河邊找鬼。 笑死凤巨,一個(gè)胖子當(dāng)著我的面吹牛视乐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敢茁,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼佑淀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了卷要?” 一聲冷哼從身側(cè)響起渣聚,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎僧叉,沒(méi)想到半個(gè)月后奕枝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓶堕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年隘道,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郎笆。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谭梗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宛蚓,到底是詐尸還是另有隱情激捏,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布凄吏,位于F島的核電站远舅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏痕钢。R本人自食惡果不足惜图柏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望任连。 院中可真熱鬧蚤吹,春花似錦、人聲如沸随抠。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拱她。三九已至二驰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椭懊,已是汗流浹背诸蚕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工步势, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人背犯。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓坏瘩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親漠魏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子倔矾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容