摘 要:σ-線性反饋移位寄存器(σ-LFSR)是一類適合軟件快速實現的新型反饋移位寄存器。結合第二代單指令多數據流擴展指令集SSE2,設計了一類基于SIMD技術的σ-LFSR。這類σ-LFSR充分利用SSE2提供的128 bit整數數據結構及其操作,獲得了非常高的軟件實現效率,同時其輸出序列達到了最大周期并具有良好的隨機性。所得結論表明這類基于SIMD技術的σ-LFSR可以作為適合軟件實現的高速序列密碼驅動部分。
關鍵詞:σ-線性反饋移位寄存器; 單指令多數據技術;第二代單指令多數據流擴展指令集;序列密碼;快速軟件加密
中圖分類號:TP309.7 文獻標志碼:A 文章編號:1001-3695(2008)08-2434-04
σ-LFSR based on SIMD technique
ZENG Guang, WANG Zheng, HAN Wen-bao
(Dept. of Information Research, School of Information Engineering,PLA Information Engineering University, Zhengzhou 450002, China)
Abstract:σ-linear feedback shift register (σ-LFSR) is a new type of feedback shift register suitable for fast implementation in software. Associated with streaming SIMD extensions 2 (SSE2) instructions process,this paper presented one type of σ-LFSR based on SIMD technique . This type of σ-LFSR made full use of 128-bit integer data structure and operations provided by the SSE2 instructions process to obtain extremely high performance in software implementation. Meanwhile its output sequence achieved the maximal period and had desirable pseudo randomness. Hence, the presented σ-LFSR can be a new optional fast component in the design of modern high efficiency software-oriented stream ciphers.
Key words: σ-linear feedback shift register;single-istruction multiple-data;streaming single-istruction multiple-data extensons 2;stream cipher;fast software encryption
0 引言
序列密碼是對稱密碼體制中一類重要的密碼算法,具有運算速度快、密文傳輸中沒有或只有有限傳播錯誤等優點。目前被應用于政府、外交、軍方等國家部門對數據流進行加密保護,如高速無線通信加密、存儲卡加密、電視會議等。序列密碼可分為兩類,即基于比特的和基于字的序列密碼。前者通常是由一組正常的或鐘控的線性反饋移位寄存器(LFSR)[1]和濾波或組合函數組成。這種基于比特的序列密碼非常適合硬件實現,然而由于其天然的比特性導致其軟件實現效率非常低。為了彌補這個缺點,最近許多基于字的序列密碼紛紛提出,如SOBER[2]、SNOW[3,4]、ABC[5]、Turing[6]等。其中大部分基于字的序列密碼都使用了基于字的LFSR作為偽隨機源提供部分。這種基于字的設計不僅大大提高了軟件實現效率,同時也可以引入更多的操作,豐富序列密碼的可選擇部件。
近年來,隨著分組密碼的逐步發展,特別是美國分組密碼標準DES和AES的制定,使得序列密碼的生存環境逐步縮小。例如歐洲的GSM數據加密標準由序列密碼算法A5/1變成了分組密碼算法A5/3;IEEE 802.11的標準由RC4變成了AES;藍牙的加密標準算法E0也發現了嚴重的安全漏洞。造成這樣的變化有多種原因。其中對序列密碼的安全性理解不如分組密碼透徹和序列密碼的速度優勢沒有得到充分挖掘是兩個較為主要的原因。但是歐洲的ECRYPT[7]計劃又重新恢復了序列密碼研究者的信心,它指出序列密碼可以在較高軟件速率要求下或者有限硬件資源條件下發揮重要作用。由于軟件實現密碼算法具有硬件不可比擬的廉價性、易維護性,同時通用計算機已經廣泛普及,設計適合軟件高速實現的序列密碼成為了目前研究的熱點。
設計適合軟件實現的序列密碼就要設計適合通用CPU運行的密碼算法。以前的CPU提供了極少的并行指令,所以為了使密碼算法具有更快速度,要求密碼算法所用的操作越少越好。RC4序列密碼算法就是因為其操作少,軟件實現速度快而被廣泛應用。然而現代CPU除了提供較高的主頻之外,還提供了更多的優化操作。例如更長的流水線和單指令多數據 (SIMD) 技術[8]。其中,SIMD指令可以在一個時鐘周期內同時操作多個數據元素,一次性獲得操作結果,從而具有更高的性能。這就要求設計者在設計面向軟件的序列密碼算法時,除了遵循已有的設計標準外,還要考慮如何充分利用SIMD技術以獲得更高的效率。這種針對底層平臺的特點,設計高效運行的密碼算法的設計思想也逐漸成為一種設計原則。國外著名學者Bart Preneel在1994年的快速加密軟件會議(FSE)上就提出如下問題:如何結合并行技術與現代處理器特點,設計基于字的高效安全的序列密碼。歐洲正在進行的ECRYPT序列密碼算法征集計劃明確指出了適合軟件實現的序列密碼算法作為其兩類設計目標之一,由此可見平臺化的設計思想對于高效密碼算法的設計至關重要。
本文將基于字的設計思想與平臺化的優化方式相結合,以高效率和高安全性為設計目標,在研究CPU提供的SSE2指令集的基礎上,給出了σ-LFSR的設計原則,并設計了兩類適合用SIMD技術實現的σ-LFSR。這類基于SIMD技術的σ-LFSR不僅具有較高的軟件實現效率,同時還具有較好的密碼學性質。
1 σ-LFSR簡介
σ-LFSR[9,10]是一類新型的反饋移位寄存器,它以字結構作為基本運算單元,能夠充分利用現代處理器提供的操作,具有結構簡單、實現快速的特點。σ-LFSR是字LFSR的推廣,SOBER、SNOW、Turing和ABC中的字LFSR均可以看成是σ-LFSR的特例。這里只列出一些有用的結論,細節詳見文獻[9,10]。
設F2m為2m元有限域,α0,α1,…, αm-1是F2m在F2上的一組基。令Mm(F2)是F2上m×m級矩陣環,GLm(F2)為一般線性群。σ-LFSR定義如下:
定義1 設n是正整數,C0,C1,…,Cn-1∈Mm(F2),如果F2m上的序列s∞=s0s1…滿足關系
si+n=C0si+C1si+1+…+Cn-1si+n-1(1)
則s∞為F2m上n級σ-線性遞歸序列,多項式 f(x) = xn+Cn-1xn-1 +…+C1x+C0稱為σ-多項式。圖1是σ-LFSR。
定理1 設s∞為F2m上n級σ-線性遞歸序列,則s∞是周期序列當且僅當系數C0是Mm(F2)中的可逆元。
定義2 如果F2m上n級σ-LFSR產生的序列周期為2mn-1,則稱為本原σ-LFSR,其多項式稱為本原σ-多項式。
定理2 設F2m上n級σ-LFSR的σ-多項式為f(x)=xn+ Cn-1xn-1+…+C1x+C0。其中C0∈Mm(F2)。設F(x)是f(x)的多項式矩陣表示,則n級σ-LFSR為本原的充要條件是|F(x)|是F2上mn次本原多項式。
定理3 若F2m上n級σ-LFSR為本原的,則其m個分量序列為F2上的m-序列,且極小多項式為|F(x)|∈F2[x]。
σ-LFSR可以從理論上保證有以下性質:σ-LFSR的輸出序列可以達到最大周期;輸出序列是平衡序列;輸出序列具有良好的偽隨機性;分量序列都是m-序列,因此具有良好的自相關性。可以看出,σ-LFSR是傳統的比特的LFSR到字的推廣。然而,這并不是筆者提出σ-LFSR的真正目的。基于字的σ-LFSR讓人們在系數選擇時不必局限于有限域中的元素,而是可以選擇任意的線性變換,這樣人們就有更為廣泛的選擇空間。σ-LFSR的意義就在于提供了另外一種途徑可以快速地構造密碼學性質良好且軟件實現效率高的LFSR。在軟件實現時,線性變換一般均由矩陣的乘法來實現,較為耗時。為了追求軟件效率,筆者考慮五種特殊的線性變換。令α,γ∈F2m,α=m-1i=0aiαi,γ=m-1i=0ciαi。其中ai, ci∈F2。
a)與操作,α∧γ=m-1i=0aiciαi ;
b)循環移位操作,σk(α)=∑m-1i=0ai+k(mod m)αi;
c)左移操作,L(α)=∑m-2i=0aiαi;
d)右移操作, R(α)=∑m-1i=1aiαi;
e)移位組合操作,s,t=Ls+Rt 。
事實上,容易驗證上述操作都是線性空間F2m/F2上的線性變換,而且這五種線性變換都非常易于軟件實現,都是現代CPU提供的基本指令。因此本文的目標就是如何利用這五種操作構造出密碼學性質良好的σ-LFSR。
2 基于SIMD技術的σ-LFSR設計原則
設計適合軟件高速實現的σ-LFSR要求從效率和安全性兩方面考慮。以往的設計只注重安全性而忽略了效率,都是在設計完成后再針對程序優化,很多情形下由于自身結構不合理或不容易優化,使得底層平臺的性能不能充分發揮。然而在平臺化的設計思想指導下,這兩方面應擁有同等重要的地位。
LFSR主要為序列密碼提供一個偽隨機源,其理論較為成熟[1],主要的安全性衡量指標如下:
a)平衡性。它是指輸出字頻次的平衡性,如果序列不平衡則很容易被辨別。
b)周期性。序列的周期越長,不同密鑰輸出的原始序列存在重疊的概率越小,攻擊者分析序列結構越困難。
c)自相關性。它是造成通信中多徑干擾的根源,良好的自相關性能極大地降低密文在傳輸過程中的誤碼率。
d)偽隨機性。隨機性是阻止攻擊者使用復制、預測序列的一種度量指標,初始序列如果具有良好的隨機性可以使整個序列密碼的設計大幅度簡化。
e)可選數量。可選的數量多意味著允許設計者選擇的范圍越廣泛,從而可以進一步提高密碼的抗攻擊能力;如果可選數量少,則非常容易被攻擊者利用。
f)生成多項式的重量。重量輕的生成多項式,如三項式或五項式,對相關攻擊的抵抗能力較弱。為了達到最大的混亂和擴散,一般要求重量達到生成多項式次數的一半。
g)沒有重量輕或低次數的多項式倍式。如果極小多項式的倍式存在較大弱點,也能被相關攻擊利用。
從實現效率角度考慮,有兩種設計方式:一是針對已經設計好的安全性達到要求的LFSR進行程序優化;二是充分利用CPU的特性設計高效的LFSR,再在其中尋找出安全性符合要求的設計。前者是針對設計而優化,而后者是針對高效而設計。筆者認為后者更容易達到高效,但需要兼顧以下幾點設計原則:
a)減少操作個數。在針對設計優化時就要考慮如何用較少的操作完成同樣的功能,這仍是重要的設計目標。
b)避免有限域乘法。目前的字LFSR幾乎都有限域上的乘法運算,而無論選擇何種基表示有限域,該運算軟件實現都相當耗時。
c)減少查表操作。通常認為只要表的大小可以放在CPU的cache中,查表操作就不是耗時操作。對于現代具有較長流水線的CPU來說,這樣的查表操作具有比單個算術運算或者邏輯運算更長的延時。
d)減少循環移位操作。雖然循環移位操作可以使數據進行擴散,但是在通用的SIMD指令中,并沒有指令支持直接對多個數據進行循環移位,必須用兩次移位和一個與來實現,這樣就要花費三個指令來實現一個循環移位。
e)利用并行指令。SIMD可以在一條指令內同時對多個不同的數據進行相同的處理。SSE指令是Intel在Pentium 3處理器中首先推出的,它只支持64 bit的整數運算。SSE2指令系統是第二代單指令多數據流擴展指令系統,在Pentium 4中首次采用128 bit浮點雙精度運算和整數運算,每個128 bit的數據可以作為16個字節、8個字、4個雙字或2個四字類型的數被同時處理。SSE2的128 bit整數運算為密碼算法的高效實現提供了強有力的支持。
效率和安全性是設計σ-LFSR的兩大矛盾問題。由于在支持SSE2指令的CPU中可以用一個SSE2指令同時執行四個32 bit整數或者兩個64 bit整數甚至一個128 bit整數的算術運算和邏輯運算,可以利用SSE2指令得到較為理想的效率。若要兼顧效率和安全性,就必須設計特殊形式的σ-LFSR,讓這類形式的σ-LFSR總體上具有較好的密碼學性質并且具有較高的軟件實現效率。在實際的研究中發現,這樣的σ-LFSR是大量存在的。
3 基于SIMD技術的σ-LFSR的設計
目前,提升LFSR速度的最有效途徑就是利用SIMD技術實現并行運算。MMX指令集,在Intel的x86體系結構的微處理器上首次實現了整數SIMD運算,之后又相繼推出了SSE、SSE2和SSE3指令集,對SIMD指令進行了進一步的擴展。同時,AMD公司也在其生產的CPU中加入了支持SIMD運算的3DNOW指令集。目前,Intel和AMD生產的CPU都全面支持MMX、SSE、SSE2和SSE3,可見構造基于SIMD技術的σ-LFSR已經有了廣泛的應用平臺。
本文首先給出一個原始的搜索算法,該算法的思想就是先構造某些特殊形式的實現效率高的σ-LFSR,然后再在其中挑選密碼學性質良好的。
算法1 簡單本原σ-LFSR搜索算法。令W和V如下:
W={∧γ,Lk,Rk′,s,t|γ≠0,∑m-1i=0,αi,0<k,k′,S,t<m}
V={s,t|0<s,t<m,(s+t)|m}
a)選取σ-多項式系數。確定級數和非零項系數的個數,非零項個數一般從三項開始。非零項的系數可以任意選擇,常數項在V中選擇,其他項在W∪V中選擇。
b)計算行列式。計算g(x)=|F(x)|∈F2[x]。其中:F(x)是σ-多項式的多項式矩陣表出形式。
c)判別本原。判別g(x)是否為F2上的mn次本原多項式,若不是則返回a)。
d)判別密碼性質優劣。計算g(x)的重量,若重量偏離mn/2太遠,則返回a)。
上述算法是一個簡單的搜索算法,算法的設計嚴格遵循安全性和效率設計原則。集合W和V的選取非常適合CPU高效實現。a)從三項式開始選擇σ-多項式也是為了減少操作,與安全性設計原則的第六條并不矛盾,因為σ-三項式對應的極小多項式重量也可能較大。一般選取mn≤512,對于更大的mn遇到的一個問題就是在c)中判別本原時要用到2mn-1的標準分解形式,部分標準分解式可以從Cunningham計劃[11]中得到。
σ-LFSR是一種基于字的LFSR,按照字長可以分為兩種類型,即主流的32、64 bit和超寬的128 bit。利用SIMD提供的并行操作,本文分兩類討論基于SIMD的σ-LFSR。
3.1 符合CPU字長的σ-LFSR
機器字長一般為32 bit或64 bit,可以選取m=32或64。SSE2提供了4個32 bit或2個64 bit整數的邏輯運算和算術運算。其中,移位運算要求每個數據單元移動相同的位置,不支持不同移位數的移位操作。假設4個32 bit整數A、B、C、D為4級σ-LFSR的初態,若利用SSE2提供的移位操作(>>32)進行反饋,則反饋邏輯可以表示為
(A,B,C,D)>>32 =t;NEW=ABCD
然而上述操作和NEW=(ABCD)>>t操作等價,因此SSE2提供的移位操作不適用,但是與操作不受限制。經過大量的實驗測試,筆者發現圖2所示的σ-LFSR具有較高的效率同時也具有較好的密碼學性質。
圖2中σ-LFSR的級數要求至少是6級,這樣利用并行指令和基本的移位指令不會發生數據沖突。加粗的箭頭表示SSE2提供的128 bit與指令,表示將128 bit數據(A,B,C,D)進行逐級異或操作,即(A,B,C,D)=ABCD。若s∞=s0s1…為此σ-LFSR輸出的字長為m的序列,則其遞推關系為
si+n=1,1(si)(si+k,si+k+1,si+k+2,si+k+3)∧κ(2)
其中:κ為一個128 bit參數;k為與操作的位置。由式(2)可知,其實現僅需要一個SSE2的與指令,兩個移位指令和三個異或指令,其軟件效率較高。作者隨機地搜索了10 M個此類σ-LFSR (n=8),發現其重量都接近次數的一半,均值為124.95,且有良好的重量分布。下例即是其中的一個。
例1 設m=32,σ-LFSR的級數為8,其σ-多項式為1(x)=x
3.2 128 bit字長的σ-LFSR
SSE2提供了128 bit整數的操作,利用這些SIMD指令可以得到字長更長的σ-LFSR。如果選取m=128,可以用較少的級數就獲得較大的周期。同時由于多是SIMD指令來完成σ-LFSR的反饋,其反饋邏輯簡單,更重要的是每個時鐘周期輸出的是128 bit,而不是32或64 bit,這使得σ-LFSR的吞吐率大幅提高。此種類型的σ-LFSR可選種類較多,可以充分利用與運算,移位運算來搭建性質優良的σ-LFSR。通過大量的測試發現,如圖3所示的σ-LFSR在實現效率和安全性方面均有較好表現。
圖3中σ-LFSR的級數至少是4級,每一級128 bit。共利用九個SSE2提供的128 bit SIMD指令就可以完成反饋。其中一個與、四個移位和四個異或。移位和與的位置不固定,也可以互換,只要操作數不是來源于同一個狀態即可。最后一個位置是直接異或,確保輸出序列是周期的。若s∞=s0s1…為此σ-LFSR輸出的字長為128 bit的序列,則其遞推關系為
si+n=(si+k1∧ω)8,8(si+k2)B(si+k3)si(3)
其中:ω為一個128 bit確定的參數,B為先將128 bit的整數x分成兩個64 bit數,對每個64 bit整數分別左移1 bit,得到(x<<641),同理可以得到(x>>641),再將這兩個結果異或。在安全性方面,此種σ-LFSR要好于上一種,其重量的均值為256.24。
,重量為260,接近次數的一半。
本節給出了一個設計簡單高效σ-LFSR的通用方法,再以上節的設計原則為標準,具體給出了兩類基于SIMD指令的σ-LFSR。從這兩類σ-LFSR的形式來看,都能夠利用SSE2的SIMD指令高效實現,尤其是第二種類型,可以充分利用SIMD指令。同時這兩種類型的σ-LFSR具有較好的重量分布,其安全性可以得到保證。
4 性能和安全性比較分析
性能和安全性是衡量任何密碼算法的根本標準,本章用實驗數據對如上兩類σ-LFSR的性能和安全性進行分析。為了便于分析,選取SNOW2.0的字LFSR與本文設計的兩類σ-LFSR的代表f1(x)和f2(x)進行比較。SNOW2.0[4]是ISO/IEC 18033-4:2005序列密碼算法標準之一[12],其安全性和實現效率得到了密碼學界的廣泛認可。
SNOW2.0使用的是有限域F232上的16級的LFSR,反饋多項式為f3(x)=x16+α-1x11+x2+α∈F232[x]。其中α為多項式x4+β23x3+β245x2+β48x+β239在F28上的一個根,而β是F2[x]中不可約多項式x8+x7+x5+x3+1的根。其圖形如圖4所示。
SNOW2.0將有限域F232分成F2上的一個8次擴張及其上的一個4次擴張,目的是利用查表操作來提高LFSR中有限域的乘法運算,提高軟件實現效率,Turing中也采用了這種設計方式。在多項式f3(x)中系數不僅有α,還有α-1,這樣的設計可以避免較低次數且重量輕的多項式倍式的存在。可見,SNOW2.0中LFSR部分的設計也充分考慮了效率和安全性。事實上,這個字LFSR也是一種特殊形式的σ-LFSR,與f1(x)、 f2(x)最大的差別就在于SNOW2.0中的LFSR的反饋是通過算術運算來完成的,而本文給出的兩類σ-LFSR的反饋都是通過邏輯運算實現的。
只要σ-LFSR的輸出序列達到最大周期,就可以在理論上保證安全性設計要求的前四點。由于f1(x)、 f2(x)、 f3(x)的σ-LFSR都達到最大周期,只需要比較它們的重量和倍式。至于速度測試,本文選取CPU為AMD 4400+主頻為2.3 GHz,內存為1 GB的測試環境,用Visual C++ 2005使用SSE2指令編程進行測試。上述三種不同類型的σ-LFSR對比數據如表1所示。
表1 性能和安全性比較
類型速度/Gbps周期重量倍式f1(x)12.862256-1129不存在f2(x)24.742512-1255不存在f3(x)10.152512-1250不存在其中,速度采用LFSR的快速實現方式來測試。以SNOW2.0為例,設R[0],…,R[15]是其字LFSR的初態,實現方式為
R[0] = (R[0] *α)R[2](R[11] *α-1);
R[1] = (R[1] *α)R[3](R[12] *α-1);
……
R[15] = (R[15] *α)R[1](R[10] *α-1);
這種方式不采用指針和狀態移位來實現,其特點是運行速度快,代碼量大。速度是以吞吐量來衡量的,LFSR每運動一步輸出m比特,快速方式速度計算公式為
速度=迭代次數×m×寄存器級數/消耗時間
為了準確測量速度,本文選取的迭代次數為230,這樣隨機波動對速度產生的影響可忽略不計。
從表1可以看出,在多項式倍式方面f1(x)、f2(x)和f3(x)都不存在弱點,由于f1(x)和f2(x)是矩陣多項式,尋找其倍式的難度更大。在重量方面,這三者相當,幾乎達到了次數的一半。但速度方面,兩個基于SIMD技術的σ-LFSR明顯快于SNOW2.0的LFSR,特別由于f2(x)完全采用SIMD指令并且是128 bit輸出,其吞吐率超過其他兩個一倍還多,在速度方面具有不可比擬的優勢。通過對比可以看出,這類σ-LFSR效率超越已有的LFSR,同時保持了良好的安全性。
5 結束語
本文主要設計了適合軟件實現的基于SIMD并行指令的兩類σ-LFSR。基于字的LFSR是大多數面向軟件設計的序列密碼的驅動部分。然而已有的字LFSR幾乎都涉及有限域中的乘法運算,其軟件實現效率受到限制,更難以利用現代CPU提供的優化技術來提高效率。本文設計的兩種基于SIMD技術的σ-LFSR,能最大限度地利用SIMD指令,從而得到更高的效率。在安全性方面,這兩類σ-LFSR具有良好的重量分布,同時不存在較低次數或較輕重量的倍式,其安全性有所提升。從理論和實際結果來看,此類基于SIMD技術的σ-LFSR可以應用在現代序列密碼的設計中。
參考文獻:
[1]LIDL R, NIEDERREITER H. Finite Fields[M]//Encyclopedia of Mathematics and Its Applications 20.[S.l.]:Addison-Wesley,1983.
[2]HAWKES P, ROSE G. Primitive specification and supporting documentation for SOBER-t32 submission to NESSIE[C]//Proc of the 1st Open NESSIE Workshop.2000.
[3]EKDAHL P, JOHANSSON T. SNOW:a new stream cipher[C]//Proc of the 1st NESSIE Workshop.2000.
[4]EKDAHL P, JOHANSSON T. A new version of the stream cipher SNOW[C]//Proc of the 7ed Areas in Cryptography 2002 Workshop. LNCS,vol 2595. Berlin Heidelberg: Springer-Verlag, 2003: 47-61.
[5]VLADIMIR A, ANDREY B, ILYA K,et al. ABC:a new fast flexible stream cipher[R].[S.l.]:ECRYPT Stream Cipher Project,2005.
[6]HAWKES P, ROSE G. Turing: a fast stream cipher[C]//Proc of Fast Software Encryption 2003 Workshop.Berlin Heiderberg: Sprin-ger-Verlag, 2003: 290-306.
[7]ECRYPT, eSTREAM: ECRYPT stream cipher project[EB/OL].(2002). http://www.ecrypt.eu.org/stream/.
[8]Intel Corporation. Intel 64 and IA-32 architectures software developer’s manual volume 1,2,3[EB/OL]. http://www.intel.com/ products/processor/manuals/index.htm.
[9]ZENG Guang, HAN Wen-bao,HE Kai-cheng. High efficiency feedback Shift register:σ-LFSR. Cryptology eprint archive, Report 2007/114.[EB/OL].(2007). http://eprint.iacr.org/.
[10]曾光, 何開成, 韓文報. 一類三項式形式適合軟件實現的σ-LFSR[J]. 中國科學E輯:信息科學,2007,37(2): 209-222.
[11]JOHN B, LEHMER D H, SELFRIDGE J L,et al. Factorizations of Bn, Bb2,3,5,6,7,10,11,12 Up to High Powers[M].v22.[S.l.]:Contemporary Mathematics,American Mathematical Society, 2002.
[12]ISO/IEC 18033-4—2005,ISO/IEC,Information technology-security techniques-encryption algorithms-part 4:stream ciphers[S]. Geneva:2005.
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文