字符編碼發展史和密碼算法那些事兒


從《易經》開始:

宇宙萬物,道法陰陽,陰陽未分為混沌,混沌即無極,演而有序,化為太極。

易有太極,是生兩儀,兩儀生四象,四象演八卦,八卦演萬物。

陰陽術創造了一個世界,炊煙裊裊,鳥語花香。

二進制創造了另一個世界,有一個小男孩,已經醒來。

0×01 編碼的故事

ASCII

一個神秘組織為了融入人類的語言符號,將二進制的單元八位一組,建立了一套符號對應關系表(例如 A => 01000001),即 ascii 表,它是符號表的始祖。PS:標准 ascii 表的第一位都是 0,因此只有128 個字符。

一句話總結:所有編碼的爸爸。

gb2312/gbk/gb18030

聰明的天朝人民也想融入自己的文字。由於標准 ascii 字符首位為 0,他們用兩個首位為 1 的字節(我=> 1100111011010010)組合來表示漢字。為了慶祝這種機智的做法,命名為 gb2312;加入繁體字后,發現還是不夠用。讓后面一個字節的首位也可以為 0 ,這樣又可以多編碼一倍的漢字,這種方案叫 gbk;再后來,加入少數民族文字,就有了 gb18030。

天朝另一個小區域一直在用繁體字,他們發明了 Big5 漢字編碼。

一句話總結:中國特色的編碼。

Unicode

“你們不可能每個人都這么亂搞一套編碼吧?你們互不相懂,唧唧歪歪,互相傷害,還能好好做朋友嗎?”另一個神秘組織終於忍不住了,“你們不是嫌 ascii 編碼不了你們的文字么?那簡單,我用 2個字節,把全世界所有的符號都統一編碼起來。”這樣就出現了 Unicode。最初用 2 個字節想表示所有字符的方案,叫做 UCS-2,這樣最多能表示 65536個字符。突然有一天,這位小哥發現 2 個字節根本不可能編碼世界上所有的字符,就有了后面的 UCS-4,用 4 個字節來統一編碼總夠了吧……

一句話總結:別鬧了都聽哥的。

utf-7/8/16/32

這樣編碼是好,然而傳輸呢?按照 UCS-2 方案,所有字符都需要兩個字節來傳輸,例如要發送一個A,就要發送 0000000001000001 這么多位,很浪費有木有?而且在實際傳輸中,數字和字母這樣的字符占絕大多數。機智的人們又想搞事情了,引用哈弗曼編碼的思想,出現頻率越高的字符用更短的編碼傳輸,頻率低的字符就用多一點的編碼傳輸。

utf-8,即每次傳輸 8 位一組。

所以發送 A,傳輸時一組就夠了,實際傳輸 01000001。

而發送“漢”,則需要三組才行, 實際傳輸 111001101011000110001001。其中藍色 8 位是 Unicode編碼的第一個字節,綠色 8 位是第二個字節。

utf-7,utf-16,utf-32 也是一樣的道理。utf-7 期初是用於電子郵件,郵件以字母為主,ascii 實質也是7 位一組。后面 16 和 32 這兩種分組沒有流行起來。

PS:utf-8 傳輸簡體漢字時,是按照 3 個字節傳輸的,這就有了 utf-8 是 3 個字節這樣的說法。實際上在 UCS-2 下 utf-8 傳輸字符,用 1-3 都是有可能的哦^_^

另外經常寫和字符有關程序的小伙伴,一定有這樣一個經驗,想要讓 gbk 和 utf-8互轉,都是先要轉到 Unicode 哦。

一句話總結:按頻率傳輸,節省流量。

0×02 更少的編碼

前面這一小段故事講完了,我們先休息一下,馬上進入更有意思的話題。

話說天下大勢,分久必合,合久必分。字符的編碼由簡入繁,勢必也會化繁為簡。那么如何用更少的字符去表示所有編碼呢?

Quoted-printable 編碼

ascii 有 127 個字符,而且很多符號甚至是不可打印的,那怎么才能讓他們都能顯示呢?這個簡單,對於不可打印字符,就用“=XX”表示,其中 XX 是該字符的 ascii 編碼。例如換頁符(ascii 為 0C),就可以表示成 =0C。只需要 =和0-F 這17個字符哦^_^

一句話總結:即使不可打印,也要可見。

Base64/32/16 編解碼

Base 家族原理類似,就是用少量字符表示更多字符,但是也不像二進制那么少。Base64 即用64 個字符來表示所有ascii,怎么做到的呢?

大寫字母集 W = {A,B,C…Z} 共 26 個

小寫字母集 w = {a,b,c…z} 共 26 個

數字集 d = {0,1,2…9} 共 10 個

符號集 s = {+,/}

這 64 個字符對應數字 0-63,轉化成二進制則是 6 位。而 ascii 是用 8 位,6 和 8 的最小公倍數是 24 = 3 * 8 = 4 * 6,所以將個ascii 字符就能轉化成4 個base64 字符

ascii 的 ABC-> 010000010100001001000011 ->010000010100001001000011 ->QUJD

同理 base32 是用 32 個字符即 5 位表示,5 * 8= 8 * 5,所以 base32 會把 5 個 ascii 字符變成 8 字符哦。

PS:如果字符數不是3 的倍數,怎么辦?看一下操作你就知道了。

A -> 01000001-> 010000010000-> QQ== 所以你會看到 base64 串后面有1或2個=

另外有些不專業的銷售,會說他們的產品是用base64 加密的,客戶就會立刻質疑他的產品!base64只是一種編碼,它的實質還是明文,你說用它來加密,不是掩耳盜鈴??

另外依照這種理論,那么我們的二進制是不是可以理解成 base2?ascii 就是base128 嘛。

一句話總結:用我們常用的字符表示所有字符。

XX 編碼,UU 編碼

它們實質跟 base64 是一樣的,也是用 64 個字符來表示,只是選取的字符和編排方式不同罷了,其實它們才是base64 的前身,慢慢演進,漸漸被base64 取代了。

一句話總結:長江后浪推前浪。

URL,HTML 編碼

URL編碼

采用“%+ascii”的方式對字符進行編碼,比如:

http://www.wr.com?file=../../passwd ->http://www.wr.com?file=%2e%2e%2f%2e%2e%2fpasswd

HTML編碼

采用“&#+十進制數字”或“&#x+十六進制數字”的方式對字符進行編碼,比如:

<p>ab</p> -> <p>&#97;&#x63;</p>

一句話總結:新瓶裝舊酒。

說了這么多,下面畫個編碼家族的家譜圖:

<img width="690"height="873.719512195122" alt="編碼家譜圖.png"src="http://image.3001.net/images/20170704/1499152317552.png!small"></p>

0×03 古典密碼

從這些編解碼演化的過程中,相信各位看官也會感受到勞動人民的智慧。前面的只是熱身,下面將進入今天的重頭戲,密碼學。

還是回到開頭那句話,任何一種思想或者想法,都一定是為了解決實際問題而設計的。字符編碼的故事,是為了解決字符的表示、顯示和傳輸的問題。那么密碼學是為了啥子呢?

相信 Bob,Alice 和 Ted 斗智斗勇的故事大家都看過,沒有看過的可以百度一下,挺有意思的。數據傳輸的安全性包括以下三個性質:

機密性:數據被偷了,小偷不知道是啥。

完整性:數據被改了,接受方能夠發現。

可用性:純屬廢話,不能用還要你何用?

下面主要介紹密碼學在前兩條性質中的作用。

先來幾個不算是密碼的密碼算法。為啥這樣說呢,因為這些算法剛發明時,別人不知道是怎么計算的,因此無法根據“密文”還原出原來的信息,可以算作加密。后來被普及了,大家就都會算了,這時候你還說你加密了,你是不是當我傻?

凱撒密碼

引用一句話 I came,Isaw, I conquered. 多么霸氣啊。這個以帝國霸主名字命名的密碼學確實如此朴素。凱撒密碼有兩種模式:

(1)位移密碼,就是講明文每位都移動特定位數,例如 AbC 右移 4 位就變成 Efg.

那么我(I)想對你說:M pszi csy.

(2)查表密碼,指定一張明文和密文對應的關系表,然后對着這個表進行加解密。例如:

<img width="558" height="72"alt="明文與密文對照表.png"src="http://image.3001.net/images/20170704/1499152330466.png!small"></p>

Hello加密之后就變成 Axeeh,那么Ixkyxvm.

維吉尼亞密碼

我理解它是一種升級版的凱撒密碼,它引入一張 26*26 的密碼表盤,可以設定一個密鑰,然后按照查表的方式進行加解密。由於操作簡單,不過多敘述。

ROT5/13/18/47

ROT13 就是右移 13 位的凱撒密碼,后面的數字是移動位數,這種加密方法不限定在數字或字母上,也可以拓展到所有 ascii。

摩爾斯密碼

.. … – .. .-.. .-.. .-.. — …- . -.—– ..-

當鋪密碼

這種密碼感覺還是很有意思的,就是看漢字露出的筆畫數,決定這個數字是幾,例如“十”,上下左右四處漏出,所有他就是數字 4 

告訴你一句表白:大中口由人甲工

豬圈密碼,柵欄密碼等,其原理差不多,就是通過一張事先約定好的密碼表,然后將明文進行查表加解密

PS :這些密碼算法實現簡單,只是對原始字符做了一種替換編碼,想到即解決。因此這些算法深受考腦洞的 CTF 賽友的青睞,也只適合出現在比賽和游戲中。

 0×04 現代密碼算法

好了終於把這一段朴素的古典密碼啰嗦完了,下面這一段介紹現代密碼學。還是從機密性和完整性這兩條性質展開,來介紹一下密碼學算法是如何解決這些問題的。

先來說說機密性,密碼學的機密性算法,都是含有密鑰的理論上來講,一份數據在網絡上傳播,被誰獲取都是有可能的,如果它的主人只希望“對的人”才能理解它,所以必須有密鑰機制才能保障。

含有密鑰的加密算法有兩類,對稱加密和非對稱加密。

對稱加密算法

加解密的雙方使用同一個密鑰,一般是加解密雙方以一種不可告人的方式偷偷約定好一個密鑰。所有需要傳遞的消息都用這個密鑰加密成暗號,接收方用這個密鑰解密得到原始消息。

目前的對稱加密有“流加密”和“分組加密”。

流密碼算法:將明文按字符逐位(逐比特)地、對應地進行加密的一類對稱密碼算法。

分組密碼算法:將明文分成固定長度的分組,如64bit 或 128bit 一組,用同一密鑰和算法對每一個分組加密,輸出也是固定長度的密文。

流加密算法相對簡單,你可以把明文串和密鑰串看成兩條長長的水管,遇到對齊的位就做一個約定好的運算。目前有代表性的算法有RC4和 GSM

舉個栗子,一個異或的流加密過程如下:

<img width="558" height="52"alt="異或的流加密過程.png"src="http://image.3001.net/images/20170704/14991523729686.png!small"></p>

 知道了加密過程,解密也自然思路清晰:

<img width="558" height="71"alt="解密過程.png"src="http://image.3001.net/images/20170704/14991523807132.png!small"></p>

由於流加密原理簡單,其算法結構存在着弱點,另外密鑰流有一般會多次重用,泄露局部的明文就可能讓攻擊者嗅探出密鑰。另外,由於流加密是按位進行加密的,攻擊者如果只是修改了密文中幾個bit,不會破壞原消息的結構,這樣接受者就會接受錯誤的信息。

PS 目前所有的流機密算法,都被認為是不安全的,重要消息不要用流加密哦^_^

分組加密算法內部實現復雜,每一塊加密,都有幾十輪運算,這里我不打算過多地介紹其實現過程。其代表算法有DES 和 AES

目前 DES 已經被證明是不安全的,但是 3 重 DES 當三次的密鑰都不相等時,是安全的。AES 密鑰長度在 128 以上的算法,目前都是安全的

分組模式其實還有很多,我主要介紹一下 ECB 和 CBC 模式。

ECB 模式:每組是獨立和密鑰進行運算的:

<img width="690"height="200.32258064516128" alt="ECB分組模式.png"src="http://image.3001.net/images/20170704/14991523981983.png!small"></p>

CBC 模式:每組先和上一組密文運算后,再跟密鑰運算:

<img width="690"height="265.86021505376345" alt="CBC分組模式.png"src="http://image.3001.net/images/20170704/14991524044266.png!small"></p>

我們拍拍腦袋想想就知道CBC 模式更加安全,因此強烈建議使用 CBC 模式,下面再來張圖,看看兩種模式加密之后的效果:

<img width="690"height="343.128390596745" alt="加密結果.png"src="http://image.3001.net/images/20170704/14991524116711.png!small"></p>

一句話總結:對稱加密就是用同一把密鑰進行加解密。 

非對稱加密算法

座山雕:天王蓋地虎!

楊子榮:寶塔鎮河妖!

眾金剛:么哈?么哈?

楊子榮:正晌午時說話,誰也沒有家!

座山雕:臉紅什么?

楊子榮:精神煥發!

座山雕:怎么又黃啦?

眾匪持刀槍逼近楊子榮。

楊子榮(鎮靜地):哈哈哈哈!防冷塗的蠟!

這個故事就用到了多組非對稱密鑰,環環相扣,一組密鑰錯誤,就會丟了小命。

非對稱加密相比對稱加密就都要復雜的多,雖然對稱加密背后也有一套數學理論,但是非對稱加密背后的數學理論就更加深厚。小編不才,只能請了一個密碼學專業的童鞋用一句描述了兩個算法背后的數學難題:

RSA:大數分解問題。

ECC:橢圓曲線上的離散對數問題。

言多必失,為了不誤導大家,我就不分析具體算法了。我只講講這兩個算法的效果。

經過一系列復雜運算后,非對稱密碼算法會產生一對密鑰:

公鑰:一般較短,可以公開。

私鑰:一般較長,作者保留。

這兩個密鑰有如下性質:

(1)       公鑰和私鑰都能進行加密和解密。

(2)       用公鑰加密后的內容,只有用對應的私鑰才能解開。

(3)       用私鑰加密后的內容,也只有用對應的公鑰才能解開。

(4)       以上三條其實都是廢話。

除了用在加解密用來保證數據的機密性,那么這種非對稱密碼算法,還有什么作用呢?

簽名:用私鑰加密一條消息發出去,證明是我。

數字證書(CA:將簽名和公鑰一起打包發出去,任何人都可以通過公鑰解密簽名的方式來證明是我。

PS :一般非對稱加密算法速度慢,對於大文件或長消息的加密都用對稱加密

一句話總結:非對稱加密有兩把不同的鑰匙哦。

哈希算法

以上加密算法,主要是保證消息的機密性,那如果消息被修改了,該怎么辦呢?

下面再介紹幾個算法,使得消息一旦被篡改,接受者就能察覺到。

這時你可能會想到幾個名詞:

消息摘要,數字指紋,單向散列

額,他們的實質都是一樣的,他們用到的技術,都是密碼學中的 Hash 算法。Hash 算法有以下幾個美好的特性:

(1)       固定長:不管你輸入多長,輸出都是固定的,而且很短

(2)       唯一性:對於不同的輸入,基本可以認為輸出是不同的

(3)       不可逆:正向運算可行,反向運算不可能

上面這些名詞只是對 Hash算法某個特性的偏重。消息摘要,就是利用固定長的性質;數字指紋用到的是唯一性,單向散列則用到不可逆性。不管一個人長得啥樣,都可以用一個小小的指紋來代表他,消息的摘要也是一樣,這就是 Hash 算法的魅力。目前用的最多的hash 算法是 MD5,SHA-1 和 SHA-2。

盡管 MD5 和 SHA-1 已經被碰撞了,證明是不安全的,但是這幾年他們還不會消失;SHA-2 其實不是某一種算法,它是一個大家族,SHA224/256/384/512 全部屬於 SHA-2。當你下載軟件時,是不是經常會看到以下信息?它們就是該軟件的指紋。

MD5 指紋:

<img width="690"height="117.90291262135922" alt="MD5 指紋.png"src="http://image.3001.net/images/20170704/14991524313204.png!small"></p>

SHA-1 指紋:

<img width="690"height="154.01785714285714" alt="SHA-1 指紋.png"src="http://image.3001.net/images/20170704/14991524417317.png!small"></p>

SHA-2 指紋:

<img width="690"height="137.25806451612902" alt="SHA-2 指紋.png"src="http://image.3001.net/images/20170704/14991524524150.png!small"></p>

Hash 算法里的“唯一性”並不是真正唯一的,找到兩條不同的消息,使得他們有相同的指紋,叫做碰撞。Hash 算法之所以管用,是因為它們碰撞的概率極低的。現在的科技也說明人類的指紋也存在碰撞,所以要引入虹膜。其實虹膜也存在碰撞,只是它碰撞的概率比指紋要更低。

Hash 算法里的“不可逆”是真正的不可逆。從算法本身的數學原理來講,通過 Hash 值來直接倒推原始輸入,是不可能的。要分清兩個概念,碰撞和可逆是不一樣的哦。既然不可逆,那么我們有沒有方法來復原明文呢?

方法有是有,不過這是概率性的,就跟之前一些公司宣傳“概率性”恢復被加密的文件是一個概念,下面我介紹完,大家自然就明白“概率性”是啥意思了。

第一種方案是爆破,通過循環來構造不同字符的組合,然后正向計算 Hash 值,如果發現跟目標值一樣,就認為找到了。這種方法對於那些簡單且很短字符串 Hash 值的爆破是非常有效的,因此設置密碼要長一點,且多弄幾種奇奇怪怪的字符哦。

另一種方案就是彩虹表,它的實質跟第一種方案是一樣的。它會實現計算好很多“常規”字符串的Hash 值,然后建立一張很大的表把它們存起來,這種表就叫做“彩虹表”,對於要破解的目標值,只需要查一下表就可以了。它的特點是速度快,有則有,無則無,不啰嗦,不掙扎。

那么怎么應對這些蠻不講理的破解呢?還是有兩種方法,我只說說它們是怎么做的,相信大家就知道防爆破的原理了。

加鹽:計算 Hash 值時,加入一個隨機數,叫做鹽值。

PBKDF2迭代多來幾輪 Hash,味道不好也可以加點鹽。

當然為了防止被消息被篡改,還有一部分較弱的校驗算法,它們一般把校驗碼直接放到消息中,它們的保護能力很弱,攻擊者只需要跟着把校驗位修改,即可繞過

Luhn 校驗算法

我們知道,公民的身份證是18 位,而最后一位就是校驗位。喜歡玩游戲的小伙伴一定都有這樣的經歷,游戲需要實名認證,而有時候也不想泄露自己的身份證信息。有時候就會隨便輸入一個身份證,系統就能馬上判斷出你的身份證是無效的。怎么做到的呢?

把前 17 位分別乘上以下系數,然后相加:

<img width="690"height="89.03225806451613" alt="校驗系數.png"src="http://image.3001.net/images/20170704/14991524617043.png!small"></p>

然后把相加的結果模除 11,得到的余數只可能是0-10。余數再按照下表做一次變換,就可以得到最后一位:

<img width="690"height="89.03225806451613" alt="校驗結果.png"src="http://image.3001.net/images/20170704/14991524725187.png!small"></span></p>

當余數是2時,經過上面變換后就是X,這也說明了為什么有些人的身份證最后一位是 X。如果當時是模除 10,是不是就能避免出現 X 這樣的數字了呢^_^

一些銀行卡、社保卡等也都是用的 Luhn算法,只是系數表不一樣而已。

CRC 校驗(BCC,LRC)

當然身份證校驗碼相對簡單,系數也都是固定的。CRC 校驗碼原理其實也相似,只是去乘以一個多項式而已,在此就不過多敘述。

一句話總結:你可以改,但我也可以拒收。

MAC 算法(帶密鑰的摘要算法)

看到這里,消息的機密性和完整性,也算是差不多說完了。聰明的小伙伴可能會有這樣的想法:如果攻擊者在修改了密文消息的同時,把后面的消息摘要也相應修改了。那么接受方是不是還是無法判斷?

沒錯,想法很好,實際這種做法之前就發生了,為了解決這個問題,就又要引入下一個更加牛逼的完整性算法。有問題就總有對策,技術就是在解決問題的基礎上發展的。

回憶一下我們怎么保證機密性的?就是通過密鑰嘛。那么我在做消息摘要時,也帶上一個密鑰,這樣攻擊者就沒辦法修改消息摘要了嘛。基於這種思想實現的算法,就是MAC 算法。當然,如果其中的摘要算法是用 Hash 函數實現的,那么就叫 HMAC 啦。 HMAC 算法一般是采用對稱密鑰,事先約定好。至於摘要那種算法倒是可選的,所有就有了 HMAC-MD5,HMAC-SHA1 等等。

一句話總結:密鑰 + 指紋,更安全。

DH,ECDH(密鑰協商算法)

最后一個問題了,說到消息傳輸,可以用密鑰來加密,那么問題來了,密鑰怎么傳輸呢?你可能會想到用另一個密鑰加密,那么另一個密鑰怎么傳輸呢?如果是周圍的朋友,你可以直接去他家里,然后告訴他。既然你都可以去他家里了,消息你也可以直接告訴他,干嘛還要通過網絡呢,呵呵。

所以最后一個算法是關於密鑰協商的,這跟密鑰傳輸還不是一個概念。

以前看了一篇小說,里面有個情節:在一個小玻璃瓶里,有一根比瓶口粗得多的樹干,大家都不明白這根樹干是怎么放進去的。小伙伴也可以想想哦。

其實在剛開始的時候,在玻璃瓶里種了一棵樹種子,里面有水有土壤,種子就一直在玻璃瓶里生長。當它長出樹枝時,小主人就把剪刀伸入瓶口剪掉樹枝,移出瓶外。就這樣當樹干長到一定粗度,小主人就倒出水和土壤,讓樹木干死。就形成了如今這個局。這是一篇不錯的推理小說,這個謎的原理就跟我們今天的主角 DH 算法有點類似。DH 算法並非事先產生一個密鑰,而是在雙方的對話中,根據對方的信息,來生成密鑰。密鑰期初是一棵種子,在雙方的交互中不斷生長。即使攻擊者收集了雙方所有的對話內容,也無法知道密鑰是啥

通過兩個人說一堆奇奇怪怪的話,然后密鑰就在這些奇怪的暗語中產生了,怎么做到的呢?

一次密鑰協商,涉及到 2 個人和 7 個數據

人物:男主角1,女主角2

公開數據:質數a,質數p,y1,y2

私密數據:x1,x2

密鑰:Key

場景1

質數 a,p 是公開的,可以隨便確定,p 需要是大質數。

場景2

然后男1和女2 各想一個幸運數字 x1和x2。

男1計算 y1 = a^x1 mod p,並把 y1 告訴女2;

女2計算 y2 = a^x2 mod p,並把 y2 告訴男1;

場景3

男1計算 Key = y2^x1 mod p

女2計算 Key = y1^x2 mod p

下面簡單證明一下男1計算得到 Key1 和女2計算得到的 Key2 是相等的。

Key1 =y2^x1 mod p = (a^x2)^x1 mod p = a^(x2*x1)mod p

Key2 = y1^x2mod p = (a^x1)^x2 mod p = a^(x1*x2) mod p:

這個算法的神奇之處在於,即使對方也無法知道自己手里的幸運數字,但能計算出共同的密鑰。它的數學原理是基於離散對數問題和求模公式,也涉及到一些質數的性質。

ECDH 算法就是將 ECC 算法和 DH 算法一起使用協商密鑰。

一句話總結:談笑間,密鑰應運而生。

加密的最佳實踐—信封加密:

<img width="643" height="317"alt="信封加密.png"src="http://image.3001.net/images/20170704/14991525114653.png!small"></p>

將對稱密鑰加密后放到消息中,一起發生。是不是與 WannaCry 勒索病毒加密方式類似?

0×05 結語

終於可以長吁一口氣了,辛苦各位看官了。下面總結一下都講了啥:

(1)編碼的故事講了字符編碼的發展史

ASCII捏造了常規字符;

gb系列融入了漢字;

Unicode統一編碼;

UTF進行省流量傳輸;

XXUU,Base定義更少字符編碼

(2)密碼學系列介紹了密碼算法的作用:

古典密碼算法思路簡單,以查表加解密為主,安全性弱。

現代密碼學旨在保證數據的機密性完整性

機密性算法涉及到密鑰,對稱首選AES,非對稱有RSA和 ECC

完整性算法優選是哈希,定長唯一不可逆,MD5,SHA-1不安全,SHA-2家族杠杠的。

校驗算法計算簡單,校驗位存留在信息自身,Luhn和 CRC應用廣泛。

為防止數字指紋被修改,引入帶密鑰的哈希算法HMAC,帶密碼的指紋更安全。

高冷的簡短的對話,密鑰應運而生,密鑰協商我只認DH

 ****轉載自http://www.freebuf.com/articles/others-articles/136742.html


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com