CAST加密算法属于称为Feistel结构的加密算法,对于微分密码分析、线性密码分析、密码相关分析具有较好的抵抗力,并符合严格雪崩标准和位独立标准,没有互补属性,也不存在软弱或者半软弱的密钥。因此,对于要求密码强壮、加密算法容易获取的Internet而言,CAST-128是一种能够满足一般应用的很好的选择。

CAST-128算法描述
CAST-128属于称为Feistel加密的一类加密算法,因此所有的操作都类似于数据加密标准(DES)。

完整的加密算法分下面四步给出:
输入:明文m1…m64;密钥K=k1…k128
输出:密文c1…c64

(1)(密钥表)从K计算出16对子钥(Kmi,Kri);
(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节中定义。
(4)c1...c64<--(R16,L16)交换最终得到的L16和R16并连接在一起构成密文。)

解密算法与上述加密算法一致,只不过循环是按照相反的顺序从(R16,L16)计算出(L0,R0)。

循环密钥
对CAST-128在每次循环中使用一对子钥:32位量Km作为“掩码”,5位量Kr用作“旋转码”。

不同的循环
CAST-128使用三种不同的循环函数,如下所示(其中“D”是输入函数f的数据“,Ia”到“Id”分别表示I中从高到低的4个字节)。注意“+”和“-”是以2**32为模的加减法,“^”是位异或,“<<<”表示循环左移操作。

置换箱
CAST-128使用8个置换箱:置换箱(s-box)S1、S2、S3和S4是循环置换箱,S5、S6、S7和S8是密钥表置换箱。尽管8个置换箱总共需要8K字节的内存,但是要注意在实际加密/解密过程中只需要4K字节,因为子钥的产生通常在输入数据之前就完成了。

密钥表
假设128位的密钥是x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF,其中x0是最高位的字节,xF是最低位的字节。

令z0…zF是中间(临时)字节。
令S[i]表示置换箱i“,^”代表异或加。

按照下述公式从密钥x0x1x2x3x4x5x6x7x8x9xAxBxCxDxExF生成子钥:

掩码子钥与旋转子钥令Km1,…,Km16为32位的掩码子钥;

令Kr1,…,Kr16为32位的旋转子钥;
for(i=1;i<=16;i++){Kmi=Ki;Kri=K16+i;}

可变的密钥长度
CAST-128加密算法被设计为密码长度是可变的,从40位到128位,每次递增8位。对于不同的密码长度,分别采用不同的规范:

(1)密码长度从40到80,按照上述算法操作,但是采用12循环而不是16。
(2)如果密码长度大于80位,采用完整的16次循环。
(3)如果密码长度小于128位,则在最低位补0直到128位

尽管CAST-128支持上述12种长度的密码,但在典型的应用中发现40、64、80和128位是最有用的密码长度。因此,只要支持这四种长度的子集对于大多数应用就足够了。为了避免在使用不同的密码长度操作时发生混淆,CAST-128被认为与名CAST5是同义的,这样在后面加上密码长度就不会发生歧义了。这样,比方说使用40位密码的CAST-128就被表示为CAST5-40;如果明确地使用128位密码,应该使用名称CAST5-128。

CAST加密算法安全性分析
由于CAST的设计,CAST免疫已知明文攻击以及选择明文攻击,对于选择密钥攻击以及相关密钥攻击也都有相当高的安全性。在密钥的选择上,CAST不像DES那样,在CAST中,没有弱密钥,也没有半弱密钥,CAST的密钥不存在定点,也没有相等的密钥。CAST加密算法具有相当高的安全性。