中國礦業大學密碼學課程設計
一、古典密碼
1.1 原理
1.1.1 單表代換
使用一個固定的替換表—明文、密文字符一一對應。
-
移位密碼
\[\begin{array}{c} &𝐸_𝑘(𝑖)=(𝑖+𝑘)\;𝑚𝑜𝑑\;𝑞\; =\;𝑗\quad0≤𝑖, 𝑗<𝑞,𝐾= \lbrace 𝑘 | 0≤𝑘<𝑞 \rbrace \\ &𝐷_𝑘(𝑗)=(𝑗-𝑘)\; 𝑚𝑜𝑑\; 𝑞\;=\;𝑖 \end{array} \]- 凱撒密碼
\[\begin{array}{c} 𝐸_𝑘(𝑖)=(𝑖+k)\;𝑚𝑜𝑑\;26\;=\;𝑗\\𝐷_𝑘(𝑗)=(𝑗-𝑘)\;𝑚𝑜𝑑\;26\;=\;𝑖 \end{array} \]
- 凱撒密碼
-
乘數密碼
\[\begin{array}{c} &𝐸_𝑘(𝑖)=(𝑖*k)\;𝑚𝑜𝑑\;q\; =\;𝑗 \quad (k,q)=1\\ &𝐷_𝑘(𝑗)=(𝑗*𝑘^{-1})\; 𝑚𝑜𝑑\; q\;=\;𝑖 \end{array} \] -
仿射密碼
移位密碼和乘數密碼的結合。
\[\begin{array}{c} 𝐸_𝑘(𝑖)=𝑖*k_1+k_2\;𝑚𝑜𝑑\;q\; =\;𝑗 \quad (k_1,q)=1\\ 𝐷_𝑘(𝑗)=(𝑗-𝑘_{2})*k_1^{-1}\; 𝑚𝑜𝑑\; q\;=\;𝑖 \end{array} \]
1.1.2 多表代換
維吉尼亞密碼:實質上是周期多表替換,減少了密鑰量。
置換表:
明文映射到行,密鑰映射到列,通過(明文,密鑰)坐標查表可以輸出密文。
1.2 實現思路及創新點
實現代碼見附錄,原理比較簡單,按照步驟寫代碼即可。
使用了重合指數法對維吉尼亞密碼進行攻擊,以及使用了統計分析的方法對移位密碼進行攻擊,針對長密文攻擊具有良好的攻擊效果。
1.3 安全性分析
① 窮舉分析
移位密碼窮舉只需要\(n-1\)次。
乘數密碼只需要$ \varphi(n)-1 $次。
放射密碼只需要\(n\varphi(n)-1\)次。
② 統計特性分析
英語或者說任何自然語言都有固有的統計特性。可以根據字母頻率進行破譯。
同樣,字母組合也有其統計特性。
可以根據其統計特性猜測置換的密文對應的明文。
單表替換統計分析
- 統計密文的各種統計特征,如果密文量比較多,則完成這步后便可確定出大部分密文字母
- 分析雙字母、三字母密文組,以區分元音和輔音字母
- 分析字母較多的密文,在這一過程中大膽使用猜測的方法,如果猜對一個或幾個詞,就會大大加快破譯過程
多表替換統計分析
多表替換在一定程度上隱藏了明文消息的一些統計特性分析,破譯相對比較困難。
- 主要包括兩個步驟:
- 確定密鑰的長度d(就是確定使用的加密表個數)
- 確定具體的密鑰字
- 確定密鑰的長度兩種方法:
- Kasiski測試法
- 重合指數法
① 確定密鑰字:
Kasiski測試法基本原理
若用給定的d個密鑰表周期地對明文字母加密,則當明文中兩個相同字母組的間隔為d的倍數時,這兩個明文字母組對應的 密文字母組必相同
兩個相同的密文段,對應的明文段不一定相同,但相同的可能性大。將密文中相同的字母組找出來,並找出相同字母組距離的最大公因子,就有可能提取出密鑰的長度d
過程:
搜索長度至少為2的相鄰的一對對相同的密文段,記下它們之間的距離。而密鑰長度d可能就是這些距離的最大公因子。
重合指數法基本原理
重合指數:設\(x=x_1\;x_2\;…\;x_n\)是n個字母的串,x的重合指數是指x中兩個隨機元素相同的概率,記為\(I_c ( x )\)
假定\(y=y_1\;y_2\;…\;y_n\)是Vigenere
密碼的密文串。把\(y\)分成\(d\)個長為\(n/d\)的子串,記為\(Y_1, Y_2,⋯Y_d\)
如果d是密鑰字長度,那么每個\(Y_i\)都可以看作單表置換密碼每個\(I_c(y_i)\;(1≤i≤d)\)都會趨近於0.065
如果不是,那么會更加隨機一點。
② 確定具體密鑰字:
這里已經退化成了凱撒密碼,可以使用窮舉法得到密鑰字。
但是對於非已知密碼算法可以采用重合互指數法。
重合互指數:假定\(x=x_1\;x_2\;…\;x_n\)和\(y=y_1\;y_2\;…\;y_n′\),分別是長為\(n\)和\(n'\)的字母串。\(x\)和\(y\)的重合互指數是指\(x\)的一個隨機元素等於\(y\)的一個隨機元素的概率,記為\(MI_c(x,y)\)
具體步驟:
將\(x\)和\(y\)中的字母\(A,B,C,……,Z\)出現的次數分別表示為\(f_0,f_1,……,f_{25}\)和\(f_0^′, f_1^′,⋯, f_{25}^′\), 那么有
設定密鑰字\(K=(k_1,k_2,k_3,...k_n)\)
\(MI_c (Y_i, Y_j )\)的估計值只依賴於差\((k_i-k_j) mod 26\),我們稱該差為\(Y_i\)和\(Y_j\)的相對移位。
當相對移位不是0,估計值在0.031-0.045之間,是0的時候,估計值是0.065。
可以利用這個計算出任何兩個字串的\(Y_1,Y_2\)相對移位,有了相對移位只需要窮舉26次就可找出密鑰字。
二、序列密碼
2.1原理
2.1.1 LSFR
①密鑰流的要求:
-
極大的周期:隨機序列是非周期的,而按任何算法產生的序列都是周期的,因此應要求密鑰流具有盡可能大的周期
-
良好的統計特性:隨機序列有均勻的游程分布
游程:指序列中相同符號的連續段,其前后均為異種符號。
例如:……0 111 0000 10……
注意:計算游程的時候要首尾相連計算,頭和尾的兩個0合在一起構成長度為2的0游程。
有長為3的1游程、長為4的0游程、長為1的1游程,長為2的0游程。一般要求其在周期內滿足:同樣長度的0游程和1游程的個數相等,或近似相等。
-
很高的線性復雜度:不能用級數較小的線性移位寄存器LFSR近似代替
-
用統計方法由密鑰序列\(k_0k_1k_2…ki…\)提取密鑰生成器結構或種子密鑰在計算上不可行
②反饋移位寄存器:
GF(2)上一個n級反饋移位寄存器由n個二元存儲器與一個反饋函數\(f(a_1a_2 ... a_n)\)組成
-
每個存儲器稱為移位寄存器的一級
-
在任一時刻,這些級的內容構成該FSR的狀態;對應於一個GF(2)上的n維向量,共有\(2^n\)種可能的狀態
-
狀態可用n長序列\(a_1, a_2, a_3, …, a_n\)或n維行向量\((a_1, a_2, a_3, …, a_n)\)表示
-
每一級存儲器\(a_i\)將其內容向下一級\(a_{i-1}\)傳遞,並根據存儲器當前狀態計算\(f(a_1, a_2, a_3, …, a_n)\)作為\(a_n\)下一時間的內容
example:
初始狀態為\((a_1,a_2,a_3)=(1,0,1)\),輸出可由上表求出,其輸出序列為\(10111011101…\),周期為4
如果反饋函數\(f(a_1, a_2, …, a_n)\)是\(a_1, a_2, …, a_n\)的線性函數,則稱為線性反饋移位寄存器(LFSR)
n級LFSR最多有\(2^n\)個不同的狀態
初始狀態為零,則其狀態恆為零
若其初始狀態非0,則其后繼狀態不會為0
因此n級LFSR的狀態周期\(≤2^n-1\)
輸出序列的周期與狀態周期相等,所以$≤2^n-1 $
選擇合適反饋函數可使序列周期達到最大值\(2^n -1\),周期達到最大值的序列稱為m序列
特征多項式表示:
1是必須寫的,\(c_i\)的取值和上面一一對應
-
定理:n級LFSR產生的序列有最大周期\(2^n-1\)的必要條件是其特征多項式為不可約的
-
定義:若n次不可約多項式\(p(x)\)的階為\(2^n-1\),則稱\(p(x)\)是n次本原多項式,使得\(p(x)|(x^p-1)\)的最小p稱為\(p(x)\)的階
-
定理:設\(\{a_i\}∈G(p(x))\),\(\{a_i\}\)為m序列的充要條件是\(p(x)\)為本原多項式
LSFR的優點:
- 非常適合硬件實現
- 能產生大的周期序列
- 能產生統計特性好的序列
- 能夠應用代數方法進行很好的分析
2.1.2 RC4
RC4算法的大小根據參數\(n\)的值而變化,通常\(n=8\),這樣RC4可生成\(256(2^8)\)個元素的數據表\(S:S_0,S_1,S_2,…,S_{255}\)
種子密鑰長度為1~256個字節(8~2048比特)的可變長度,用於初始化256個字節的初始向量S
RC4有兩個主要算法:
-
密鑰調度算法(KSA)
-
偽隨機數生成算法(PRGA)
基本思想:
-
根據種子密鑰,利用密鑰調度算法對數據表S進行重新排列
-
利用偽隨機數生成算法,從重新排列的數據表S中取出一個字節
-
每取出一個字節,數據表S將發生變化
2.2實現思路及創新點
代碼見附錄
功能:給定任意本原多項式以及初始序列,都可以生成周期為\(2^n-1\)的序列。
同時基於LSFR實現了RC4算法。
2.3安全性分析
對於m-序列(周期為\(2^n-1\)),如果攻擊者知道了\(2n\)位明密文對,則可確定反饋多項式的系數,從而確定該LFSR接下來的狀態,也就能得到余下的密鑰序列,具體過程如下:
可以求出一段長為2n的密鑰序列
其中
由此可以推出線性反饋移位寄存器連續的n+1個狀態:
序列\(\{a_i\}\)滿足線性遞推關系:
做矩陣 \(X=(S_1\;S_2...S_n)\)
所以
若X可逆,則
三、分組密碼
3.1原理
① 分組密碼特點:
速度快、安全性較高、易於標准化和便於軟硬件實現
是信息與網絡安全中實現數據保密性的核心機制,在計算機通信和信息系統安全領域有着廣泛應用
也是構造偽隨機數生成器、序列密碼、消息認證碼和Hash函數的方法
② 分組密碼設計要求:
分組長度要足夠大
- 假設n為分組長度,則要使\(2^n\)足夠大,防止明文窮舉攻擊
密鑰量要足夠大
- 防止密鑰窮舉攻擊
密碼變換要足夠復雜
- 使攻擊者除窮舉攻擊外,找不到其他簡潔的數學攻擊方法
加密和解密運算簡單
- 便於軟件和硬件的實現
無數據擴展和壓縮
③ 分組密碼設計思想✨
- 擴散原則
- 密鑰或明文的每一比特變化影響密文的許多比特的變化,以便隱蔽明文的統計特性(雪崩效應)
- 混淆原則
- 混亂原則,指密鑰和明文以及密文之間的依賴關系盡可能的復雜化,以防通過統計分析法進行破譯
3.1.1 DES
明文分組和密文分組均為64比特,有效密鑰56比特
DES基於加密的兩個基本屬性:替換(也稱為混亂)和置換(也稱為擴散)。DES由16個步驟組成,每個步驟稱為一個回合。每輪執行替換和轉位的步驟。現在讓我們討論DES中的廣泛步驟:
- 第一步,將64位純文本塊移交給初始置換(IP)功能。
- 初始置換是對純文本執行的。
- 接下來,初始置換(IP)產生置換塊的兩半;稱為左純文本(LPT)和右純文本(RPT)。
- 現在,每個LPT和RPT都要經過16輪加密過程。
- 最后,重新合並LPT和RPT,並在組合塊上執行最終置換(FP)
- 該過程的結果將產生64位密文。
3.1.2 AES
采用SPN結構的迭代型分組密碼
分組長度和密鑰長度都可變,各自可以為128、192、256比特
AES的加解密過程:
密鑰被擴展成44個32比特字所組成的數組W[i]
AES每輪由4個階段組成:
-
字節代換
-
行移位
-
列混合
-
輪密鑰加
每個階段均可逆,加密和解密算法不相同
加密和解密的最后一個階段均只有3個階段(沒有列混合階段)
3.2實現思路及創新點
DES運算時間的改進:
DES 算法的實現中,要實現 E 擴展功能,從表里逐個取數據來擴展成48 位,這樣計算的工作量較大,從擴展置換 E 表中的數據清楚地反映了置換中的規律:即將\(R_{i-1}\)第1位賦給\(R^`_{i-1}\)的第 2 位,\(R_{i-1}\)的第2位賦給\(R^`_{i-1}\)的第 3 位 ,以此類推.找到這個規律 ,可 以不需要逐個從表里取數據 ,有助於程序實現 的改進並能夠提高計算的速度.這 48 位的擴展的實現將由計算代替查表 ,按照下面的程序段來實現 ,可以提高運行的速度,速度大概提高了 2-3 倍。
for(i=0;i<8;i++)
for(j=O;j<6;j++)
a=i*4+j
實現了ECB,CBC模式的DES,同時針對DES密鑰過短的特點進行改進,實現了3DES。
密鑰長度任意,不夠使用密鑰循環填充到8byte,超出只選取前8byte。
可以支持加密漢字,字母,數字,特殊符號的密文,並進行base64編碼。
3.3安全性分析
普通的DES很容易被窮舉攻擊,存在一些弱密鑰和半弱密鑰,代數結構存在互補對稱性,可以使用3DES或者AES改進。
分組密碼攻擊方法有
-
窮舉攻擊
-
線性分析攻擊
-
差分分析攻擊
-
相關密鑰分析攻擊
-
代數攻擊
-
中間相遇攻擊
四、Hash函數
4.1原理
hash函數基本特征:
-
算法公開,不需要密鑰
-
數據壓縮:可將任意長度的輸入數據變換成一個固定長度的輸出
-
易於計算:對任何給定的m,h(m)易於計算
-
單向性(抗原像性,Pre-image Resistance):給定消息的散列值h(m),要得到消息m在計算上不可行
安全性要求
-
抗弱碰撞性
對任意給定的消息\(m\),尋找與\(m\)不同的消息\(m’\),使得\(h(m)=h(m’)\)在計算上不可行
-
抗強碰撞性
尋找任意兩個不同的消息\(m\)和\(m’\),使得\(h(m)=h(m’)\)在計算上不可行
4.1.1 MD5
結構:
步驟1(填充消息): 使消息長度模512=448
-
如果消息長度模512恰等於448,增加512個填充比特。即填充的個數為1~512
-
填充方法:第1比特為1,其余全部為0
步驟2(補足長度): 將消息長度轉換為64比特的數值
-
如果長度超過64比特所能表示的數據長度,值保留最后64比特
-
添加到填充數據后面,使數據為512比特的整數倍
512比特按32比特分為16組
MD5分組操作
MD5步操作
4.1.2 SHA-1
第一步:填充消息
-
使消息長度模512=448。如果消息長度模512正好=448,增加512個填充比特,即填充個數為1~512
-
填充方法:第1個比特為1,其余全部為0
-
計算公式:補零的個數\(d=447-(|x| mod 512) (|x|: 消息長度)\)
第二步:補足長度
-
將數據長度轉換為64bit的數值
-
每個512bit按每組32bit進行分組,分為16組
4.2實現思路及創新點
MD5比較簡單,按照步驟,實現了針對字節進行處理,可以處理漢字,字母,數字,以及特殊符號的MD5算法。
4.3安全性分析
對Hash函數的基本攻擊方法:
-
窮舉攻擊:能對任何類型的Hash函數進行攻擊
- 最典型方法是“生日攻擊”:給定初值\(H_0\),尋找\(M’≠ M\),使\(h(M’)= H_0\)
-
密碼分析法:依賴於對Hash函數的結構和代數性質分析,采用針對Hash函數弱性質的方法進行攻擊。這類攻擊方法有中間相遇攻擊、修正分組攻擊和差分分析等
五、公鑰密碼及數字簽名
5.1原理
每個用戶都分別擁有兩個密鑰:加密密鑰(公鑰)與解密密鑰(私鑰) ,兩者並不相同,且由加密密鑰得到解密密鑰在計算上不可行。加密密鑰是公開的。
關鍵是尋找單向陷門函數
-
給出\(f\)定義域中的任意元素\(x\),計算\(f(x)\)是容易的
-
給出\(y=f(x)\)中的\(y\),計算\(x\):
-
若知道設計函數f時結合進去的某種信息(稱為陷門),則\(x\)容易計算;
-
若不知道該陷門信息,則\(x\)難以計算
單項陷門函數依賴於數學困難問題
-
大整數因子分解問題(如公鑰密碼體制
RSA
)- 給定兩個素數\(p,q,\)計算乘積\(n=pq\)很容易,但給定整數\(n\),求\(n\)的素因子\(p,q\)使得\(n=pq\)是困難的
-
有限域上的離散對數問題(如公鑰密碼體制
ElGamal
)- 已知有限循環群\(G=<g>={g^k|k=0,1,2,…}\)及其生成元\(g\)和階\(|G|=n.\)給定整數\(a\),求\(h=g^a\)很容易;但是給定元素\(h\),計算整數\(x\),使得\(h=g^x\)非常困難
-
橢圓曲線上的離散對數問題(如公鑰密碼體制
ECC
) -
背包問題(背包算法)
-
基於身份的密碼體制(
IBE
)
5.1.1 RSA
安全性基於大整數因子分解的困難性
-
密鑰的生成
- 選擇兩個大素數 \(p\)和\(q\),(\(p≠q\),需要保密)
- 計算\(n=p×q\), \(\varphi(n)=(p-1)×(q-1)\)
- 選擇整數 \(e\)使$ (\varphi(n),e) =1, 1<e< \varphi(n) $
- 計算\(d\),使\(d=e^{-1} mod \varphi(n)\),
- 得到:公鑰為\({e, n}\); 私鑰為\({d}\)
-
加密\((e,n)\): 明文\(M<n\), 密文\(C=M^e (mod n)\)
-
解密\((d,n)\): 密文\(C\), 明文\(M =C^d (mod n)\)
正確性驗證
大素數的生成與檢驗
先隨機生成一個適當大小的奇數n,再檢測其素性;如果不是,則選取后繼的隨機數直到找到通過檢驗的素數為止
概率素性檢測
這里使用Miller-Rabin算法
引理:
(1)費馬小定理:當\(p\)為質數,有\(a^{p-1}≡1(mod\;p)\),不過反過來不一定成立,也就是說,如果\(a,p\)互質,且\(a^{p-1}≡1(mod\;p)\),不能推出\(p\)是質數,比如\(Carmichael\)數
(2)二次探測:如果\(p\)是一個素數,\(0<x<p\), 則方程\(x^2≡1(mod\;p)\)的解為\(x=1\)或\(x=p-1\)
算法流程
(1)對於偶數和 $0,1,2 $可以直接判斷。
(2)設要測試的數為 \(x\),我們取一個較小的質數\(a\) ,設\(s,t\)滿足\(2^st=x-1\)(其中\(t\)是奇數)。
(3)我們先算出\(a^t\),然后不斷地平方並且進行二次探測(進行\(s\)次)。
(4)最后我們根據費馬小定律,如果最后\(a^{x-1}≠1(mod\;x)\),則說明\(x\)為合數。
(5)多次取不同的\(a\)進行\(Miller-Rabin\)素數測試,這樣可以使正確性更高
快速冪算法
常見的快速冪算法是模平方計算法,但是對於大整數,計算機進行取模運算效率是很低的,所以對此進行了優化。
代碼如下:
public static BigInteger expMod(int base, BigInteger exp, BigInteger n) {
if (exp.equals(BigInteger.ZERO)) {
return BigInteger.ONE;
}
if (!exp.testBit(0)) {//如果為偶數
return expMod(base, exp.divide(BigInteger.valueOf(2)), n).pow(2).remainder(n);
} else {
return (expMod(base, exp.subtract(BigInteger.ONE).divide(BigInteger.valueOf(2)), n).pow(2).multiply(BigInteger.valueOf(base))).remainder(n);
}
}
沒有進行取模運算,可以說幾乎做到了Java
代碼層最快了。
Miller-Rabin
算法代碼實現:
public static boolean passesMillerRabin(BigInteger n) {
int base = 0;
if (n.compareTo(BigInteger.valueOf(Integer.MAX_VALUE)) < 0) {
base = ran.nextInt(n.intValue() - 1) + 1;
} else {
base = ran.nextInt(Integer.MAX_VALUE - 1) + 1;
}
BigInteger thisMinusOne = n.subtract(BigInteger.ONE);
BigInteger m = thisMinusOne;
while (!m.testBit(0)) {
m = m.shiftRight(1);
BigInteger z = BigInteger.valueOf(base).modPow(m, n);
//BigInteger z = expMod(base, m, n);
if (z.equals(thisMinusOne)) {
break;
} else if (z.equals(BigInteger.ONE)) {
} else {
return false;
}
}
return true;
}
根據標准 ANSI X9.80, "PRIME NUMBER GENERATION, PRIMALITY TESTING, AND PRIMALITY CERTIFICATES". n的bit數越多, 需要的檢測次數就越少。
public static boolean isPrime(BigInteger n) {
int sizeInBits = n.bitLength();
int tryTime = 0;
if (sizeInBits < 100) {
tryTime = 50;
return isPrime(n, tryTime);
}
if (sizeInBits < 256) {
tryTime = 27;
} else if (sizeInBits < 512) {
tryTime = 15;
} else if (sizeInBits < 768) {
tryTime = 8;
} else if (sizeInBits < 1024) {
tryTime = 4;
} else {
tryTime = 2;
}
return isPrime(n, tryTime);
}
5.1.2 Elgamal
安全性基於離散對數問題
離散對數問題:設\(p\)至少是150位的十進制素數,\(p-1\)有大素因子。\(Z_p\)為有限域,若\(g\)為\(Z_p\)中的本原元/生成元/原根,有
$ β∈{Z_p}^∗=Zp{0}\(,求唯一的整數\)a(0≤a≤p-2)$,滿足
記為$a=log_gβ $
一般來說,求解\(a\)在計算上是困難的
算法特點:
-
非確定性:由於密文依賴於加密過程中用戶A選擇的隨機數r ,所以加密相同的明文可能會產生不同的密文—概率加密
-
密文空間大於明文空間:明文空間為\({Z_p}^∗\),而密文空間為\({Z_p}^∗×{Z_p}^*\)∗
5.2實現思路及創新點
RSA使用Miller-Rabin
算法檢驗素數,根據ANSI X9.80標准進行檢驗次數的選擇。
改進快速冪算法,由於計算機對大整數取模運算效率很低,所以對此進行了優化,沒有進行取模運算,效率提高到和標准庫幾乎一樣。
密鑰按照X.509標准進行編碼,密文進行base64編碼,提高傳輸效率。
實現了RSA簽名算法。
5.3安全性分析
針對RSA的攻擊方式主要有
-
針對n分解的攻擊
-
循環攻擊
-
同模攻擊
-
選擇密文攻擊
-
低加密指數攻擊
-
時間攻擊
運用RSA需要注意
-
選擇素數\(p\)和\(q\)時,應使其歐拉函數\(\varphi(p)\)和\(\varphi(q)\)的最小公倍數盡可能大\((\varphi(p)\)和\(\varphi(q)\)有大的素因子)。最小公倍數越大,冪剩余函數的周期就越長—避免循環攻擊
-
密鑰中的各項參數應選得足夠大—避免窮舉攻擊
-
在同一個通信網絡中,不同的用戶不應該使用共同的模數—避免同模攻擊
六、混合加密
6.1 架構設計
程序主框架
安全套接字socket實現流程
6.2 創新點
采用B/S
架構進行設計,服務端采用多線程,可以支持多客戶端同時並發連接,具有良好的工程性。
通過對稱密鑰加密數據,公鑰加密密鑰,提高了加密速度。
實現了數字簽名。
不足:因為時間原因,對稱加密使用了DES算法,存在不安全的隱患,可以使用AES進行改進。
6.3 安全性分析
對稱加密使用了DES,可以換用安全性更好的AES,RSA也可以換成ECC橢圓曲線算法。
附錄
源碼:
鏈接:https://pan.baidu.com/s/1ZCJAwJwCHhwEwEpvkxmSmA
提取碼:cumt
復制這段內容后打開百度網盤手機App,操作更方便哦–來自百度網盤超級會員V3的分享