?? rfc2144.txt
字號:
組織:中國互動出版網(http://www.china-pub.com/)
RFC文檔中文翻譯計劃(http://www.china-pub.com/compters/emook/aboutemook.htm)
E-mail:ouyang@china-pub.com
譯者:王安鵬(anpengwang anpengwang@263.net)
譯文發布時間:2001-8-22
版權:本中文翻譯文檔版權歸中國互動出版網所有。可以用于非商業用途自由轉載,但必須
保留本文檔的翻譯及版權信息。
Network Working Group C. Adams
Request for Comments: 2144 Entrust Technologies
Category: Informational May 1997
CAST-128加密算法
(RFC2144——The CAST-128 Encryption Algorithm )
本備忘錄的狀態
本備忘錄為Internet社區提供信息,但沒有定義任何類型的Internet標準。本備忘錄的
發布沒有限制。
摘要
Internet社區需要一種不受限制的加密算法,這種算法的密碼長度應該允許在較大范圍
內變動,以便用于各種不同的加密應用程序和協議中提供安全性。
本文檔描述了一種已經存在的算法,可以滿足這些要求。內容包括:密碼和密鑰安排算
法(第二節)的描述,置換箱(附錄A)以及一組測試向量(附錄B)。
目錄
1 簡介 1
2 算法的描述 2
2.1 循環密鑰對 2
2.2 不同的循環 2
2.3 置換箱(Substitution Boxes) 3
2.4 密鑰表 3
2.4.1. 掩碼子鑰與旋轉子鑰 4
2.5 可變的密鑰長度 5
2.6 CAST5對象標識符 5
2.7 討論 6
3 知識產權的問題 6
4 安全性的問題 6
5 參考 6
6 作者地址 7
7 附錄A 置換箱(S-Boxes) 7
8 附錄B. 測試向量 13
1 簡介
本文檔描述了CAST-128加密算法,這是一種類似于DES的置換組合網路
(Substitution-Permutation Network,SPN)加密系統,對于微分密碼分析、線性密碼分析、
密碼相關分析具有較好的抵抗力。這種加密還有其他的幾個理想的特點,包括雪崩、嚴格的
雪崩標準(SAC)、位獨立標準(BIC)、沒有互補屬性也不存在軟弱或者半軟弱的密鑰。因
此對于整個Internet社區——要求密碼強壯、容易獲取的加密算法——而言,這是一種能夠
滿足一般應用的很好的選擇。
Adams[Adams]詳細地討論了CAST設計過程,對于這種算法的分析也可以在網上找到
(比如,[Web1]或[Web2])。
2 算法的描述
CAST-128屬于稱為Feistel加密的一類加密算法,因此所有的操作都類似于數據加密標
準(DES)。完整的加密算法分下面四步給出。
輸入:明文m1...m64; 密鑰 K = k1...k128
輸出:密文c1...c64
1)(密鑰表)從K計算出16對子鑰(Kmi, Kri)(參見2.1到2.4節);
2)(L0,R0) <-- (m1...m64)(把明文分為左右兩半,L0=m1…m32,R0=m33…m64);
3)(循環16次)對于i從1到16,按下述方法計算Li和Ri:
Li = Ri-1;
Ri = Li-1 ^ f(Ri-1,Kmi,Kri), 其中f在第2.2節中定義。(f根據i的不同,可以是
Type 1、Type 2或者Type 3)
4)c1...c64 <-- (R16,L16) (交換最終得到的L16和R16并連接在一起構成密文。)
解密算法與上述加密算法一致,只不過循環(因此還有子鑰對)是按照相反的順序從
(R16,L16)計算出(L0,R0)。
可以使用附錄B中的測試向量驗證該算法的正確性。
2.1 循環密鑰對
CAST-128在每次循環中使用以對子鑰:32位量Km作為“掩碼”,5位量Kr用作“旋
轉碼”。
2.2 不同的循環
CAST-128使用三種不同的循環函數,如下所示(其中“D”是輸入函數f的數據,“Ia”
到“Id”分別表示I中從高到低的4個字節)。注意“+”和“-”是以2**32為模的加減法,
“^”是位異或,“<<<”表示循環左移操作。
Type 1: I = ((Kmi + D) <<< Kri)
f = ((S1[Ia] ^ S2[Ib]) - S3[Ic]) + S4[Id]
Type 2: I = ((Kmi ^ D) <<< Kri)
f = ((S1[Ia] - S2[Ib]) + S3[Ic]) ^ S4[Id]
Type 3: I = ((Kmi - D) <<< Kri)
f = ((S1[Ia] + S2[Ib]) ^ S3[Ic]) - S4[Id]
循環1、4、7、10、13和16 使用f 函數Type 1;
循環2、5、8、11和14 使用f函數Type 2;
循環3、6、9、12和15使用f 函數Type 3。
2.3 置換箱(Substitution Boxes)
CAST-128使用8個置換箱:置換箱(s-box)S1、S2、S3和S4是循環置換箱,S5、S6、
S7和S8是密鑰表置換箱。盡管8個置換箱總共需要8K字節的內存,但是要注意在實際加
密/解密過程中只需要4K字節,因為子鑰的產生通常在輸入數據之前就完成了。
置換箱S1-S8的內容參見附錄A。
2.4 密鑰表
假設128位的密鑰是x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF,其中x0是最高位的字節,
xF是最低位的字節。
令z0…zF是中間(臨時)字節。
令S[i]表示置換箱i,“^”代表異或加。
按照下述公式從密鑰x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF生成子鑰:
z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8]
z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA]
z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]
zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB]
K1 = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2]
K2 = S5[zA] ^ S6[zB] ^ S7[z5] ^ S8[z4] ^ S6[z6]
K3 = S5[zC] ^ S6[zD] ^ S7[z3] ^ S8[z2] ^ S7[z9]
K4 = S5[zE] ^ S6[zF] ^ S7[z1] ^ S8[z0] ^ S8[zC]
x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]
x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]
x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]
xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3]
K5 = S5[x3] ^ S6[x2] ^ S7[xC] ^ S8[xD] ^ S5[x8]
K6 = S5[x1] ^ S6[x0] ^ S7[xE] ^ S8[xF] ^ S6[xD]
K7 = S5[x7] ^ S6[x6] ^ S7[x8] ^ S8[x9] ^ S7[x3]
K8 = S5[x5] ^ S6[x4] ^ S7[xA] ^ S8[xB] ^ S8[x7]
z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8]
z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA]
z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]
zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB]
K9 = S5[z3] ^ S6[z2] ^ S7[zC] ^ S8[zD] ^ S5[z9]
K10 = S5[z1] ^ S6[z0] ^ S7[zE] ^ S8[zF] ^ S6[zC]
K11 = S5[z7] ^ S6[z6] ^ S7[z8] ^ S8[z9] ^ S7[z2]
K12 = S5[z5] ^ S6[z4] ^ S7[zA] ^ S8[zB] ^ S8[z6]
x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]
x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]
x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]
xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3]
K13 = S5[x8] ^ S6[x9] ^ S7[x7] ^ S8[x6] ^ S5[x3]
K14 = S5[xA] ^ S6[xB] ^ S7[x5] ^ S8[x4] ^ S6[x7]
K15 = S5[xC] ^ S6[xD] ^ S7[x3] ^ S8[x2] ^ S7[x8]
K16 = S5[xE] ^ S6[xF] ^ S7[x1] ^ S8[x0] ^ S8[xD]
[剩下的一半與上面給出的一樣,從最后生成的x0..xF產生密鑰 K17 - K32。]
z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8]
z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA]
z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]
zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB]
K17 = S5[z8] ^ S6[z9] ^ S7[z7] ^ S8[z6] ^ S5[z2]
K18 = S5[zA] ^ S6[zB] ^ S7[z5] ^ S8[z4] ^ S6[z6]
K19 = S5[zC] ^ S6[zD] ^ S7[z3] ^ S8[z2] ^ S7[z9]
K20 = S5[zE] ^ S6[zF] ^ S7[z1] ^ S8[z0] ^ S8[zC]
x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]
x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]
x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]
xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3]
K21 = S5[x3] ^ S6[x2] ^ S7[xC] ^ S8[xD] ^ S5[x8]
K22 = S5[x1] ^ S6[x0] ^ S7[xE] ^ S8[xF] ^ S6[xD]
K23 = S5[x7] ^ S6[x6] ^ S7[x8] ^ S8[x9] ^ S7[x3]
K24 = S5[x5] ^ S6[x4] ^ S7[xA] ^ S8[xB] ^ S8[x7]
z0z1z2z3 = x0x1x2x3 ^ S5[xD] ^ S6[xF] ^ S7[xC] ^ S8[xE] ^ S7[x8]
z4z5z6z7 = x8x9xAxB ^ S5[z0] ^ S6[z2] ^ S7[z1] ^ S8[z3] ^ S8[xA]
z8z9zAzB = xCxDxExF ^ S5[z7] ^ S6[z6] ^ S7[z5] ^ S8[z4] ^ S5[x9]
zCzDzEzF = x4x5x6x7 ^ S5[zA] ^ S6[z9] ^ S7[zB] ^ S8[z8] ^ S6[xB]
K25 = S5[z3] ^ S6[z2] ^ S7[zC] ^ S8[zD] ^ S5[z9]
K26 = S5[z1] ^ S6[z0] ^ S7[zE] ^ S8[zF] ^ S6[zC]
K27 = S5[z7] ^ S6[z6] ^ S7[z8] ^ S8[z9] ^ S7[z2]
K28 = S5[z5] ^ S6[z4] ^ S7[zA] ^ S8[zB] ^ S8[z6]
x0x1x2x3 = z8z9zAzB ^ S5[z5] ^ S6[z7] ^ S7[z4] ^ S8[z6] ^ S7[z0]
x4x5x6x7 = z0z1z2z3 ^ S5[x0] ^ S6[x2] ^ S7[x1] ^ S8[x3] ^ S8[z2]
x8x9xAxB = z4z5z6z7 ^ S5[x7] ^ S6[x6] ^ S7[x5] ^ S8[x4] ^ S5[z1]
xCxDxExF = zCzDzEzF ^ S5[xA] ^ S6[x9] ^ S7[xB] ^ S8[x8] ^ S6[z3]
K29 = S5[x8] ^ S6[x9] ^ S7[x7] ^ S8[x6] ^ S5[x3]
K30 = S5[xA] ^ S6[xB] ^ S7[x5] ^ S8[x4] ^ S6[x7]
K31 = S5[xC] ^ S6[xD] ^ S7[x3] ^ S8[x2] ^ S7[x8]
K32 = S5[xE] ^ S6[xF] ^ S7[x1] ^ S8[x0] ^ S8[xD]
2.4.1. 掩碼子鑰與旋轉子鑰
令Km1, ..., Km16為32位的掩碼子鑰(每次循環使用一個);
令Kr1, … , Kr16為32位的旋轉子鑰(每次循環使用一個,只是用最低的5位);
for (i=1; i<=16; i++) { Kmi = Ki; Kri = K16+i; }
2.5 可變的密鑰長度
CAST-128加密算法被設計為密碼長度是可變的,從40位到128位,每次遞增8位(就
是說,密碼長度可以是40、48、56、64…112、120、128位)。對于不同的密碼長度,分別
采用不同的規范:
1) 密碼長度從40到80(含80),按照上述算法操作,但是采用12循環而不是16。
2) 如果密碼長度大于80位,采用完整的16次循環。
3) 如果密碼長度小于128位,則在最低位補0直到128位(因為CAST-128密鑰表假
定輸入的密碼是128位的。)
盡管CAST-128支持上述12種長度的密碼,但在典型的應用中發現40、64、80和128
位是最有用的密碼長度。因此,只要支持這四種長度的子集對于大多數應用就足夠了。
為了避免在使用不同的密碼長度操作時發生混淆,CAST-128被認為與名CAST5是同
義的,這樣在后面加上密碼長度就不會發生歧義了。這樣,比方說使用40位密碼的CAST-128
就被表示為CAST5-40;如果明確地使用128位密碼,應該使用名稱CAST5-128。
2.6 CAST5對象標識符
如果需要在協議中的算法協商中,或者其它需要使用對象標識符的上下文中使用
CAST,可以使用以下定義的OID。
algorithms OBJECT IDENTIFIER ::=
{ iso(1) memberBody(2) usa(840) nt(113533) nsn(7) algorithms(66) }
cast5CBC OBJECT IDENTIFIER ::= { algorithms cast5CBC(10) }
Parameters ::= SEQUENCE {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -