密码学基础实验讲义

常熟理工学院 计算机科学与工程系

《密码学基础》实验指导书

网络工程系

2009年7月

实验一、熟悉CAP4

一、实验目的与要求

通过实验,使学生对密码学有一定的感性认识;学会正确使用CAP(Cryptographic Analysis Program v4)软件,验证课堂中所学的古典密码算法;为学习现代密码算法及其应用奠定基础。

二、实验内容

1、熟悉使用CAP4软件

2、使用CAP4,验证课本中的一些加密算法,如凯撒密码、仿射密码等。

三、实验指导

CAP是由Dr. Richard Spillman专门为教学而研制的密码制作和分析的工具(CAP is a general purpose tool for making and breaking ciphers. It is intended for educational purposes only. Dr. Richard Spillman is not responsible for any lost data or errors in the software.),已经在美国的很多高校得到了广泛地使用,受到了密码学习者的普遍欢迎。

CAP4的软件界面如下:

基本涵盖了经典密码学和现代密码学中的算法,主要包括:Simple Shift,ADFGVX,Affine,AutoKey,Bazeries Cylinder,Celluler Automata 1d,Celluler Automata 2d,Column Trasposition,DES, DES Stream,Elgamal,Four Square,Hill,KeyWord,Knapsack,MultiLiteral,Nihilist,Permutation,Playfair,RC4,Rotor,RSA,Vigenere等等。

下面以仿射密码为例,介绍CAP的使用。在CAP的主菜单中选取“Ciphers”ΓAffine”,出现如下图所示的弹出框。

注意:菜单“Encipher”和“Decipher”是灰色的。

输入a和b的值后,点击“Create Key”设置仿射函数。此时菜单“Encipher”和“Decipher”变为黑色的(可以使用了)。此时可以“Plaintext”编辑框中输入明文,点击“Encipher”加密。

Affine算法的联机帮助。点击上图中的“Help”,进入下图。

选取“Presentation”,可以打开该算法所对应的课件,详细了解该算法的使用。

实验二、Playfair密码算法

一、实验目的与要求

掌握古典密码算法的实现技术,加强编程能力的训练与程序的调试能力。 实现Playfair密码算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现Playfair密码算法

三、实验指导

Playfair是一个手工的对称加密技术,而且也是第一个文献记载的多表代替密码技术。该密码算法是由Charles Wheatstone在1854年发明的,经Load Playfair推广而得名。

该算法主要描述如下:

Playfair密码是一种著名的双字母单表替代密码,实际上Playfair密码属于一种多字母替代密码,它将明文中的双字母作为一个单元对待,并将这些单元转换为密文字母组合。

替代时基于一个5×5的字母矩阵。字母矩阵构造方法同密钥短语密码类似,即选用一个英文短语或单词串作为密钥,去掉其中重复的字母得到一个无重复字母的字符串,然后再将字母表中剩下的字母依次从左到右、从上往下填入矩阵中,字母i,j占同一个位置。

例如,密钥K=playfair is a digram cipher,去除重复字母后,K=playfirsdgmche

,可得字母矩阵:

对每一对明文字母对(P1、P2)的加密方法如下:

(1)若P1、P2在同一行,密文C1、C2分别是紧靠P1、P2右端的字母; (2)若P1、P2在同一列,密文C1、C2分别是紧靠P1、P2下方的字母;

(3)若P1、P2不在同一行,也不在同一列,则C1、C2是由P1、P2确定的矩形其它两角的字母,且C1和P1在同一行,C2和P2在同一行;

(4)若P1=P2,则两个字母间插入一个预先约定的字母,如q,并用前述方法处理;如balloon,则以ba lq lo on 来加密;

(5)若明文字母数为奇数,则在明文尾填充约定字母。

参考文献:

1.http://www.simonsingh.net/The_Black_Chamber/playfaircipher.htm

实验三、Vigenere密码算法

一、实验目的与要求

掌握古典密码算法的实现技术,加强编程能力的训练与程序的调试能力。 实现Vigenere密码算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现Vigenere密码算法

三、实验指导

Vigenère密码是一个运用多个不同的凯撒(Caesar)密码算法的字母加密算法,凯撒密码的密钥依赖于用户给定的密钥(keyword)。Vigenere密码曾被多次发明出来,最早出现在1553年Giovan Battista Bellaso的著作中,但是在19世纪被误认为是Blaise Vigenere所发明,而得现名。

Vigenere是一种公认的易懂又易于实现、而且也是一种不易被攻击的密码技术,为它赢得了“不可攻破的密码”美誉。

维吉尼亚密码是最古老而且最著名的多表替代密码体制之一,与位移密码体制相似,但维吉尼亚密码的密钥是动态周期变化的。

该密码体制有一个参数n。在加解密时,同样把英文字母映射为0-25的数字再进行运算,并按n个字母一组进行变换。明文空间、密文空间及密钥空间都是长度为n的英文字母串的集合,因此可表示密变换定义如下:

设密钥k=(k1,k2,…,kn), 明文m=(m1,m2,…,mn), 加密变换为: Ek(m)=(c1,c2,…,cn),

其中ci(mi + ki)(mod26),i =1,2,…,n 对密文 c=(c1,c2,…,cn), 解密变换为:

Dk(c)=(m1,m2,…,mn), 其中 mi=(ci - ki)(mod 26),i =1,2,…,n 所对应的密钥表如下:

参考文献:

1.http://www.simonsingh.net/The_Black_Chamber/cracking_tool.html

实验四、Affine密码算法

一、实验目的与要求

掌握古典密码算法的实现技术,加强编程能力的训练与程序的调试能力。 实现Affine密码算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现Affine密码算法

三、实验指导

仿射密码也是一般单表替代密码的一个特例,是一种线性变换。仿射密码的明文空间和

gcd(k1,26)=1},密文空间与移位密码相同,但密钥空间为K={(k1,k2)| k1,k2∈Z26,

因此K1的取值只能是1,3,5,7,9,11,15,17,19,21,23,25。

对任意m∈M,c∈C,k = (k1,k2)∈K,定义加密变换为

c = Ek(m) = k1 m + k2 (mod 26)

相应解密变换为:

m = Dk(c) = k11 (c-k2) (mod 26)

该算法的关键在于如何求K1的逆元K1-1,可采用下面算法: int inverse( int a, int MOD )

{ // 求a在MOD上的逆元,在该算法中MOD取26。 int i = 0;

while( i * k % MOD != 1 ) i++; return i; }

例如,用仿射函数E(x)=(5x+8)mod26对明文“AFFINE CIPHER”进行加解密。 密码表为:

明文字母表 HIJKLMNOPQRSZ002数字

121密文映射表 RWBGLQVAFKPUD

加密过程为: Plaintext x 5x+8

Ciphertext

解密过程为:(5的乘法逆元为21,8的加法逆元为-8。)

Ciphertext Y 21(y-8)

21

18

22

15

147

17

-21294273

21(y-8) mod 8 48

7321

28

18

4822

83

(5x+8)mod -126210294-63

Plaintext

参考文献:

1.http://en.wikipedia.org/wiki/Affine_cipher2、http://en.wikipedia.org/wiki/Affine_function

实验五、DES密码算法

一、实验目的与要求

掌握现代分组密码算法的实现技术,加强编程能力的训练与程序的调试能力。 实现DES算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现DES算法

三、实验指导

1976年,DES(Data Encryption Standard)是以正式的美国FIPS(Federal Information Processing Standard)而被NBS(National Bureau of Standards)所采纳的,随后在国际上引起了广泛的兴趣。DES是一种使用56位密钥长度的对称密钥算法。

1秘密的设计元素(classified design DES在提出之初,就备受人们的质疑,主要在于:○

2相对较短的密钥长度;○3怀疑为NSA(National Security Agency)留elements);○

有后门。因此,DES激发了学术界对分组密码及其密码分析的强烈兴趣。

DES是分组加密算法,以64位为分组对数据加密。同时DES也是一个对称算法:加密和解密用的是同一个算法。它的密匙长度是56位,密匙可以是任意的56位的数,而且可以任意时候改变。所以保密性依赖于密钥。

DES对64位的明文分组M进行操作,M经过一个初始置换IP置换成m0,将m0明文分成左半部分和右半部分m0=(L0,R0),各32位长。然后进行16轮完全相同的运算,这些运算被称为函数f,在运算过程中数据与密匙结合。经过16轮后,左、右半部分合在一起经过一个末置换。

在每一轮中,密匙位移位,然后再从密匙的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的32位数据,在将其置换换一次。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次,就实现了。

DES密码算法中的加密函数变换(F)

Feistel结构

密钥变换结构

DES加密算法总体结构

参考文献:

1、http://orlingrabbe.com/des.htm

2.http://en.wikipedia.org/wiki/DES_supplementary_material 3、http://en.wikipedia.org/wiki/Data_Encryption_Standard

实验六、AES密码算法

一、实验目的与要求

掌握现代分组密码算法的实现技术,加强编程能力的训练与程序的调试能力。

实现AES加密算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现AES算法

三、实验指导

经过长达5年的标准化过程,Rindeal被确定位15个候选算法的最后获胜者,被美国政府确定为新的加密标准算法AES(Advanced Encryption Standard)。这个标准包括了3个源自于Rindeal算法的分组密码算法:AES-128,AES-192,AES-256。而美国政府却采用了加密分组长度位128位,密钥可以分别是128位,192位或256位。

2001年11月16日,美国国家标准与技术局(National Institute of Standards and Technology)颁布了AES(FIPS 197),于2002年5月26日正式成为新的加密标准,更名为AES。截至2009年,AES是最流行的对称密钥算法之一。AES有许多不同的加密包。AES公司是第一个对公众开放,开放的国家安全局批准的绝密资料加密。

AES密码算法描述如下:

使用Rijndeal的密钥生成算法扩展密钥。

第一轮:

AddRoundKey;

中间每一轮:

SubBytes;

ShiftRows;

MixColumns;

AddRoundKey;

最后一轮:

SubBytes;

ShiftRows;

AddRoundKey;

S盒变换SubBytes函数

行移位变换ShiftRows函数

列混合变换MixColumn函数

轮密钥加变换AddRoundKey函数

测试用例:

假定测试时使用输入:

初始时的向量:

1AES-128 key:

密文输出:

解密输出:

2AES-192 ○key:

解密输出:

3AES-256 key:○

密文输出:

解密输出:

参考文献:

http://www.hoozi.com/post/829n1/advanced-encryption-standard-aes-implementation-in-c-c-with-comments-part-1-encryption

http://en.wikipedia.org/wiki/AES_implementations

http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf

实验七、IDEA密码算法

一、实验目的与要求

掌握现代分组密码算法的实现技术,加强编程能力的训练与程序的调试能力。

实现DES算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现IDEA算法

三、实验指导

IDEA(International Data Encryption Algorithm)是1991年由瑞士联邦技术学院Xuejia Lai(来学嘉)和苏黎世联邦理工学院的James Massey提出的建议标准,是作为DES的替代密码而产生的。IDEA仅对PES(Proposed Encryption Standard)做了小修改,最初被叫做IPES(Improved PES)。

IDEA是在Hasler Foundation资助下完成的,现成为Ascom-Tech AG的一部分,获得了多国专利,但对非商业用途是免费的。来学嘉和Massey在1992年进行了改进强化了抗差分分析的能力,改称为IDEA。

IDEA是对64位大小的数据块加密的分组

加密算法,密钥长度为128位,它基于“相异

代数群上的混合运算”设计思想,算法用硬件和

软件实现都很容易,且比DES在实现上快的多。

IDEA自问世以来,已经经历了大量的详细审查,

对密码分析具有很强的抵抗能力,在多种商业产

品中被使用。

输入的64位数据分组被分成4个16位子

分组:xl,X2,x3和x4。这4个子分组成为

算法的第一轮的输入,总共有8轮。在每一轮

中,这4个子分组相互相异或、相加、相乘,

且与6个16位子密钥相异或、相加、相乘。在

轮与轮间,第二和第三个子分组交换。最后在输

出变换中4个子分组与4个子密钥进行运算。

如右图所示。

8轮运算之后,再经过一个最终的输出变换,得到密文。如下图。

子密钥的产生。用了52个子密钥(8轮中的每一轮需要6个,其他4个用与输出变换)。首先,将128-位密钥分成8个16-位子密钥。这些是算法的第一批8个子密钥(第一轮六个,第二轮的头两个)。然后,密钥向左环移x位后再分成8个子密钥。开始4个用在第二轮,后面4个用在第三轮。密钥再次向左环移25位产生另外8个子密钥,如此进行直到算法结束。

IDEA算法的密钥长度为128位。设计者尽最大努力使该算法不受差分密码分析的影响,数学家已证明IDEA算法在其8圈迭代的第4圈之后便不受差分密码分析的影响了。假定穷举法攻击有效的话,那么即使设计一种每秒种可以试验10亿个密钥的专用芯片,并将10亿片这样的芯片用于此项工作,仍需1013年才能解决问题;另一方面,若用1024片这样的芯片,有可能在一天内找到密钥,不过人们还无法找到足够的硅原子来制造这样一台机器。目前,尚无一片公开发表的试图对IDEA进行密码分析的文章。因此,就现在来看应当说IDEA是非常安全的。

参考文献:

1. http://en.wikipedia.org/wiki/International_Data_Encryption_Algo

rithm

2. Xuejia Lai, James L.Massey, A Proposal for a New Block Encryption

Standard, Springer-Verlag, 1998

实验八、公开密钥密码

一、实验目的与要求

通过实验,使学生掌握RSA密码算法的设计与实现。

二、实验内容

1、实现大数的加、减、乘、除、乘方和模运算;

2、实现RSA算法。

三、实验指导

1997年解密的绝密分类(top-secret classification)文件显示,早在1973年英国数学家Clifford Cocks在英国政府通讯总部的一份内部文件中描述了一个相同的系统,由于当时的计算机的计算能力十分有限,被人们认为是出于好奇心的构想。因此,认为Ron Rivest,Adi Shamir和Leonard Adleman的工作是独立于Cocks的工作。

1978年,Ron Rivest,Adi Shamir和Leonard Adleman在MIT联合发表了以他们的姓首字母命名的RSA。算法的描述如下:

(1)选择两个大素数,p和q。

(2)计算:n=p*q

(3)计算ϕ(n)=(p−1)(q−1)

(4)随机选择加密密钥e,要求1

(5)利用Euclid算法计算解密密钥d,使得de≡1modϕ(n)

(6)加密运算:C=Mmodn

(7)解密运算:M=Cmodn

1、RSA算法的实现

RSA算法的实现分为:生成密钥,加密,解密。

RSA密码系统的安全性依赖于大数分解的难度,一般建议用户选择的素数p和q至少为100位,则n=pq是至少为200位的十进制数。因此实现RSA算法有必要定义大数的数据结构。

typedef struct

{

unsigned long int bn[MAX_LENGTH];

unsigned int size;

}BigNum

密钥生成,加密和解密涉及到一些大数的基本运算。定义大数的基本运算库,包括加,减,乘,除,取模运算等,其中最重要的模乘运算和模幂运算。

模幂算法是加密解密的核心算法。计算模幂的一种有效算法是“平方-乘”方法,通过对指数的二进制化来实现。

2、密钥的生成

根据文档PKCS#1定义RSA公钥和私钥。

de

typedef struct {

unsigned int bits; /* 公钥n的位数 */

unsigned char modulus[MAX_RSA_ LEN]; /*公钥n*/

unsigned char exponent[MAX_RSA_LEN]; /*公钥e*/

} RSA_PUBLIC_KEY;

typedef struct {

unsigned int bits; /*公钥n的长度*/

unsigned char modulus[MAX_RSA_LEN]; /*公钥n */

unsigned char publicExponent[MAX_RSA_ LEN]; /*公钥e */

unsigned char exponent[MAX_RSA_LEN]; /*私钥d*/

unsigned char prime[2][MAX_RSA_ LEN]; /*两个素数因子*/

unsigned char primeExponent[2][MAX_RSA_PRIME_LEN];

unsigned char coefficient[MAX_RSA_PRIME_LEN];

} RSA_PRIVATE_KEY;

理论上讲,RSA私钥只需包括解密模数和解密指数。但是为加快RSA解密计算的效率,采用中国剩余定理算法,因此RSA私钥包含p,q,d mod (p-1),d mod (q-1),q-1 mod p,其中p,q为大素数,d mod (p-1), d mod (q-1),q-1 mod p由计算过程生成。

按前述RSA原理,分别计算n,e,d等数,将n,e放入RSA公钥;将n,e,d mod (p-1),d mod (q-1) q-1 mod p放入RSA私钥。

参考文献:

1.www.di-mgt.com.au/rsa_alg.html

2.en.wikipedia.org/wiki/rsa

实验九、数字签名算法

一、实验目的与要求

通过实验,使学生掌握利用RSA实现数字签名方法。

二、实验内容

1、RSA数字签名算法的签名算法;

2、RSA数字签名算法的验证算法。

三、实验指导

1991年8月,NIST(National Institute of Standards and Technology)提出了数字签名,并在1993年采纳了FIPS 186作为数字签名标准(Digital Signature Standard)。

RSA数字签名算法,包括签名算法和验证签名算法。首先用MD5算法对信息作散列计算。签名的过程需用户的私钥,验证过程需用户的公钥。A用签名算法将字符串形式的消息处理成签名;B用验证签名算法验证签名是否是A对消息的签名,确认是A发送的消息;消息没有被攥改过;A一定发送过消息。

1、签名算法

签名算法包括二步:消息摘要计算,RSA加密。

消息摘要计算。消息在签名前首先通过MD5计算,生成128位的消息摘要digest。 对摘要作RSA计算。用加密算法,采用签名者的私钥加密消息摘要,得到加密后的字符串。加密算法中使用的加密块为01类型。

2、验证签名算法

验证签名算法包括两步:RSA解密得签名者的消息摘要,验证者对原消息计算摘要,比较两个消息摘要。验证签名的过程输入为消息,签名者的公钥,签名;输出为验证的结果,即是否是正确的签名。

RSA解密。签名实际是加密的字符串。用3。5所述的解密算法,采用签名者的公钥对这个加密的字符串解密。解密的结果应为128位的消息摘要。在解密过程中,若出现得到的加密块的类型不是01,则解密失败。签名不正确。

消息摘要计算和比较。 验证者对消息用MD5算法重新计算,得到验证者自己的消息摘要。验证者比较解密得到的消息摘要和自己的消息摘要,如果两者相同,则验证成功,可以确认消息的完整性及签名确实为签名者的;否则,验证失败。

3、算法描述如下:

DSS中选用SHA(Secure Hash Algorithm)。p, q, g可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。签名过程如下:

1 P产生随机数k,k

2 P计算 r = ( g^k mod p ) mod q ○

s = ( k^(-1) (H(m) + xr)) mod q

验证过程: 签名结果是( m, r, s )。

3 验证时计算 w = s^(-1)mod q ○

u1 = ( H( m ) * w ) mod q

u2 = ( r * w ) mod q

v = (( g^u1 * y^u2 ) mod p ) mod q

若v = r,则认为签名有效。

参考文献:

1、en.wikipedia.org/wiki/modular_arithmetic

2、http://en.wikipedia.org/wiki/Digital_Signature_Algorithm

实验十、RC4序列密码

一、实验目的与要求

通过实验,使学生掌握利用RC4实现序列密码的加(解)密方法。

二、实验内容

编程实现RC4的加(解)密算法

三、实验指导

unsigned char S[256];

unsigned int i, j;

void swap(unsigned char *s, unsigned int i, unsigned int j) { unsigned char temp = s[i];

s[i] = s[j];

s[j] = temp;

}

/* KSA */

void rc4_init(unsigned char *key, unsigned int key_length) { for (i = 0; i

S[i] = i;

for (i = j = 0; i

j = (j + key[i % key_length] + S[i]) & 255;

swap(S, i, j);

}

i = j = 0;

}

/* PRGA */

unsigned char rc4_output() {

i = (i + 1) & 255;

j = (j + S[i]) & 255;

swap(S, i, j);

return S[(S[i] + S[j]) & 255];

}

#include

#include

《网络应用程序设计》实验指导书

#include

#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))

int main() {

unsigned char *test_vectors[][2] =

{

{

{

{

};

int x;

for (x = 0; x

int y;

rc4_init(test_vectors[x][0],

strlen((char*)test_vectors[x][0]));

for (y = 0; y

}

return 0;

}

Test vectors

These test vectors are not official, but convenient for anyone testing their own RC4 program. The keys and plaintext are ASCII, the ciphertext is in hexadecimal.

Key Keystream Plaintext Ciphertext

Key eb9f7781b734ca72a719...PlaintextBBF316E8D940AF0AD3

pedia 1021BF0420

Attack at 45A01F645FC35B383552544B9BF5dawn Wiki 6044db6d41b7... Secret 04d46b053ca87b59...

- 20 -

常熟理工学院 计算机科学与工程系

《密码学基础》实验指导书

网络工程系

2009年7月

实验一、熟悉CAP4

一、实验目的与要求

通过实验,使学生对密码学有一定的感性认识;学会正确使用CAP(Cryptographic Analysis Program v4)软件,验证课堂中所学的古典密码算法;为学习现代密码算法及其应用奠定基础。

二、实验内容

1、熟悉使用CAP4软件

2、使用CAP4,验证课本中的一些加密算法,如凯撒密码、仿射密码等。

三、实验指导

CAP是由Dr. Richard Spillman专门为教学而研制的密码制作和分析的工具(CAP is a general purpose tool for making and breaking ciphers. It is intended for educational purposes only. Dr. Richard Spillman is not responsible for any lost data or errors in the software.),已经在美国的很多高校得到了广泛地使用,受到了密码学习者的普遍欢迎。

CAP4的软件界面如下:

基本涵盖了经典密码学和现代密码学中的算法,主要包括:Simple Shift,ADFGVX,Affine,AutoKey,Bazeries Cylinder,Celluler Automata 1d,Celluler Automata 2d,Column Trasposition,DES, DES Stream,Elgamal,Four Square,Hill,KeyWord,Knapsack,MultiLiteral,Nihilist,Permutation,Playfair,RC4,Rotor,RSA,Vigenere等等。

下面以仿射密码为例,介绍CAP的使用。在CAP的主菜单中选取“Ciphers”ΓAffine”,出现如下图所示的弹出框。

注意:菜单“Encipher”和“Decipher”是灰色的。

输入a和b的值后,点击“Create Key”设置仿射函数。此时菜单“Encipher”和“Decipher”变为黑色的(可以使用了)。此时可以“Plaintext”编辑框中输入明文,点击“Encipher”加密。

Affine算法的联机帮助。点击上图中的“Help”,进入下图。

选取“Presentation”,可以打开该算法所对应的课件,详细了解该算法的使用。

实验二、Playfair密码算法

一、实验目的与要求

掌握古典密码算法的实现技术,加强编程能力的训练与程序的调试能力。 实现Playfair密码算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现Playfair密码算法

三、实验指导

Playfair是一个手工的对称加密技术,而且也是第一个文献记载的多表代替密码技术。该密码算法是由Charles Wheatstone在1854年发明的,经Load Playfair推广而得名。

该算法主要描述如下:

Playfair密码是一种著名的双字母单表替代密码,实际上Playfair密码属于一种多字母替代密码,它将明文中的双字母作为一个单元对待,并将这些单元转换为密文字母组合。

替代时基于一个5×5的字母矩阵。字母矩阵构造方法同密钥短语密码类似,即选用一个英文短语或单词串作为密钥,去掉其中重复的字母得到一个无重复字母的字符串,然后再将字母表中剩下的字母依次从左到右、从上往下填入矩阵中,字母i,j占同一个位置。

例如,密钥K=playfair is a digram cipher,去除重复字母后,K=playfirsdgmche

,可得字母矩阵:

对每一对明文字母对(P1、P2)的加密方法如下:

(1)若P1、P2在同一行,密文C1、C2分别是紧靠P1、P2右端的字母; (2)若P1、P2在同一列,密文C1、C2分别是紧靠P1、P2下方的字母;

(3)若P1、P2不在同一行,也不在同一列,则C1、C2是由P1、P2确定的矩形其它两角的字母,且C1和P1在同一行,C2和P2在同一行;

(4)若P1=P2,则两个字母间插入一个预先约定的字母,如q,并用前述方法处理;如balloon,则以ba lq lo on 来加密;

(5)若明文字母数为奇数,则在明文尾填充约定字母。

参考文献:

1.http://www.simonsingh.net/The_Black_Chamber/playfaircipher.htm

实验三、Vigenere密码算法

一、实验目的与要求

掌握古典密码算法的实现技术,加强编程能力的训练与程序的调试能力。 实现Vigenere密码算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现Vigenere密码算法

三、实验指导

Vigenère密码是一个运用多个不同的凯撒(Caesar)密码算法的字母加密算法,凯撒密码的密钥依赖于用户给定的密钥(keyword)。Vigenere密码曾被多次发明出来,最早出现在1553年Giovan Battista Bellaso的著作中,但是在19世纪被误认为是Blaise Vigenere所发明,而得现名。

Vigenere是一种公认的易懂又易于实现、而且也是一种不易被攻击的密码技术,为它赢得了“不可攻破的密码”美誉。

维吉尼亚密码是最古老而且最著名的多表替代密码体制之一,与位移密码体制相似,但维吉尼亚密码的密钥是动态周期变化的。

该密码体制有一个参数n。在加解密时,同样把英文字母映射为0-25的数字再进行运算,并按n个字母一组进行变换。明文空间、密文空间及密钥空间都是长度为n的英文字母串的集合,因此可表示密变换定义如下:

设密钥k=(k1,k2,…,kn), 明文m=(m1,m2,…,mn), 加密变换为: Ek(m)=(c1,c2,…,cn),

其中ci(mi + ki)(mod26),i =1,2,…,n 对密文 c=(c1,c2,…,cn), 解密变换为:

Dk(c)=(m1,m2,…,mn), 其中 mi=(ci - ki)(mod 26),i =1,2,…,n 所对应的密钥表如下:

参考文献:

1.http://www.simonsingh.net/The_Black_Chamber/cracking_tool.html

实验四、Affine密码算法

一、实验目的与要求

掌握古典密码算法的实现技术,加强编程能力的训练与程序的调试能力。 实现Affine密码算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现Affine密码算法

三、实验指导

仿射密码也是一般单表替代密码的一个特例,是一种线性变换。仿射密码的明文空间和

gcd(k1,26)=1},密文空间与移位密码相同,但密钥空间为K={(k1,k2)| k1,k2∈Z26,

因此K1的取值只能是1,3,5,7,9,11,15,17,19,21,23,25。

对任意m∈M,c∈C,k = (k1,k2)∈K,定义加密变换为

c = Ek(m) = k1 m + k2 (mod 26)

相应解密变换为:

m = Dk(c) = k11 (c-k2) (mod 26)

该算法的关键在于如何求K1的逆元K1-1,可采用下面算法: int inverse( int a, int MOD )

{ // 求a在MOD上的逆元,在该算法中MOD取26。 int i = 0;

while( i * k % MOD != 1 ) i++; return i; }

例如,用仿射函数E(x)=(5x+8)mod26对明文“AFFINE CIPHER”进行加解密。 密码表为:

明文字母表 HIJKLMNOPQRSZ002数字

121密文映射表 RWBGLQVAFKPUD

加密过程为: Plaintext x 5x+8

Ciphertext

解密过程为:(5的乘法逆元为21,8的加法逆元为-8。)

Ciphertext Y 21(y-8)

21

18

22

15

147

17

-21294273

21(y-8) mod 8 48

7321

28

18

4822

83

(5x+8)mod -126210294-63

Plaintext

参考文献:

1.http://en.wikipedia.org/wiki/Affine_cipher2、http://en.wikipedia.org/wiki/Affine_function

实验五、DES密码算法

一、实验目的与要求

掌握现代分组密码算法的实现技术,加强编程能力的训练与程序的调试能力。 实现DES算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现DES算法

三、实验指导

1976年,DES(Data Encryption Standard)是以正式的美国FIPS(Federal Information Processing Standard)而被NBS(National Bureau of Standards)所采纳的,随后在国际上引起了广泛的兴趣。DES是一种使用56位密钥长度的对称密钥算法。

1秘密的设计元素(classified design DES在提出之初,就备受人们的质疑,主要在于:○

2相对较短的密钥长度;○3怀疑为NSA(National Security Agency)留elements);○

有后门。因此,DES激发了学术界对分组密码及其密码分析的强烈兴趣。

DES是分组加密算法,以64位为分组对数据加密。同时DES也是一个对称算法:加密和解密用的是同一个算法。它的密匙长度是56位,密匙可以是任意的56位的数,而且可以任意时候改变。所以保密性依赖于密钥。

DES对64位的明文分组M进行操作,M经过一个初始置换IP置换成m0,将m0明文分成左半部分和右半部分m0=(L0,R0),各32位长。然后进行16轮完全相同的运算,这些运算被称为函数f,在运算过程中数据与密匙结合。经过16轮后,左、右半部分合在一起经过一个末置换。

在每一轮中,密匙位移位,然后再从密匙的56位中选出48位。通过一个扩展置换将数据的右半部分扩展成48位,并通过一个异或操作替代成新的32位数据,在将其置换换一次。这四步运算构成了函数f。然后,通过另一个异或运算,函数f的输出与左半部分结合,其结果成为新的右半部分,原来的右半部分成为新的左半部分。将该操作重复16次,就实现了。

DES密码算法中的加密函数变换(F)

Feistel结构

密钥变换结构

DES加密算法总体结构

参考文献:

1、http://orlingrabbe.com/des.htm

2.http://en.wikipedia.org/wiki/DES_supplementary_material 3、http://en.wikipedia.org/wiki/Data_Encryption_Standard

实验六、AES密码算法

一、实验目的与要求

掌握现代分组密码算法的实现技术,加强编程能力的训练与程序的调试能力。

实现AES加密算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现AES算法

三、实验指导

经过长达5年的标准化过程,Rindeal被确定位15个候选算法的最后获胜者,被美国政府确定为新的加密标准算法AES(Advanced Encryption Standard)。这个标准包括了3个源自于Rindeal算法的分组密码算法:AES-128,AES-192,AES-256。而美国政府却采用了加密分组长度位128位,密钥可以分别是128位,192位或256位。

2001年11月16日,美国国家标准与技术局(National Institute of Standards and Technology)颁布了AES(FIPS 197),于2002年5月26日正式成为新的加密标准,更名为AES。截至2009年,AES是最流行的对称密钥算法之一。AES有许多不同的加密包。AES公司是第一个对公众开放,开放的国家安全局批准的绝密资料加密。

AES密码算法描述如下:

使用Rijndeal的密钥生成算法扩展密钥。

第一轮:

AddRoundKey;

中间每一轮:

SubBytes;

ShiftRows;

MixColumns;

AddRoundKey;

最后一轮:

SubBytes;

ShiftRows;

AddRoundKey;

S盒变换SubBytes函数

行移位变换ShiftRows函数

列混合变换MixColumn函数

轮密钥加变换AddRoundKey函数

测试用例:

假定测试时使用输入:

初始时的向量:

1AES-128 key:

密文输出:

解密输出:

2AES-192 ○key:

解密输出:

3AES-256 key:○

密文输出:

解密输出:

参考文献:

http://www.hoozi.com/post/829n1/advanced-encryption-standard-aes-implementation-in-c-c-with-comments-part-1-encryption

http://en.wikipedia.org/wiki/AES_implementations

http://www.csrc.nist.gov/publications/fips/fips197/fips-197.pdf

实验七、IDEA密码算法

一、实验目的与要求

掌握现代分组密码算法的实现技术,加强编程能力的训练与程序的调试能力。

实现DES算法。程序的运行结果与CAP进行对比分析。

二、实验内容

编程实现IDEA算法

三、实验指导

IDEA(International Data Encryption Algorithm)是1991年由瑞士联邦技术学院Xuejia Lai(来学嘉)和苏黎世联邦理工学院的James Massey提出的建议标准,是作为DES的替代密码而产生的。IDEA仅对PES(Proposed Encryption Standard)做了小修改,最初被叫做IPES(Improved PES)。

IDEA是在Hasler Foundation资助下完成的,现成为Ascom-Tech AG的一部分,获得了多国专利,但对非商业用途是免费的。来学嘉和Massey在1992年进行了改进强化了抗差分分析的能力,改称为IDEA。

IDEA是对64位大小的数据块加密的分组

加密算法,密钥长度为128位,它基于“相异

代数群上的混合运算”设计思想,算法用硬件和

软件实现都很容易,且比DES在实现上快的多。

IDEA自问世以来,已经经历了大量的详细审查,

对密码分析具有很强的抵抗能力,在多种商业产

品中被使用。

输入的64位数据分组被分成4个16位子

分组:xl,X2,x3和x4。这4个子分组成为

算法的第一轮的输入,总共有8轮。在每一轮

中,这4个子分组相互相异或、相加、相乘,

且与6个16位子密钥相异或、相加、相乘。在

轮与轮间,第二和第三个子分组交换。最后在输

出变换中4个子分组与4个子密钥进行运算。

如右图所示。

8轮运算之后,再经过一个最终的输出变换,得到密文。如下图。

子密钥的产生。用了52个子密钥(8轮中的每一轮需要6个,其他4个用与输出变换)。首先,将128-位密钥分成8个16-位子密钥。这些是算法的第一批8个子密钥(第一轮六个,第二轮的头两个)。然后,密钥向左环移x位后再分成8个子密钥。开始4个用在第二轮,后面4个用在第三轮。密钥再次向左环移25位产生另外8个子密钥,如此进行直到算法结束。

IDEA算法的密钥长度为128位。设计者尽最大努力使该算法不受差分密码分析的影响,数学家已证明IDEA算法在其8圈迭代的第4圈之后便不受差分密码分析的影响了。假定穷举法攻击有效的话,那么即使设计一种每秒种可以试验10亿个密钥的专用芯片,并将10亿片这样的芯片用于此项工作,仍需1013年才能解决问题;另一方面,若用1024片这样的芯片,有可能在一天内找到密钥,不过人们还无法找到足够的硅原子来制造这样一台机器。目前,尚无一片公开发表的试图对IDEA进行密码分析的文章。因此,就现在来看应当说IDEA是非常安全的。

参考文献:

1. http://en.wikipedia.org/wiki/International_Data_Encryption_Algo

rithm

2. Xuejia Lai, James L.Massey, A Proposal for a New Block Encryption

Standard, Springer-Verlag, 1998

实验八、公开密钥密码

一、实验目的与要求

通过实验,使学生掌握RSA密码算法的设计与实现。

二、实验内容

1、实现大数的加、减、乘、除、乘方和模运算;

2、实现RSA算法。

三、实验指导

1997年解密的绝密分类(top-secret classification)文件显示,早在1973年英国数学家Clifford Cocks在英国政府通讯总部的一份内部文件中描述了一个相同的系统,由于当时的计算机的计算能力十分有限,被人们认为是出于好奇心的构想。因此,认为Ron Rivest,Adi Shamir和Leonard Adleman的工作是独立于Cocks的工作。

1978年,Ron Rivest,Adi Shamir和Leonard Adleman在MIT联合发表了以他们的姓首字母命名的RSA。算法的描述如下:

(1)选择两个大素数,p和q。

(2)计算:n=p*q

(3)计算ϕ(n)=(p−1)(q−1)

(4)随机选择加密密钥e,要求1

(5)利用Euclid算法计算解密密钥d,使得de≡1modϕ(n)

(6)加密运算:C=Mmodn

(7)解密运算:M=Cmodn

1、RSA算法的实现

RSA算法的实现分为:生成密钥,加密,解密。

RSA密码系统的安全性依赖于大数分解的难度,一般建议用户选择的素数p和q至少为100位,则n=pq是至少为200位的十进制数。因此实现RSA算法有必要定义大数的数据结构。

typedef struct

{

unsigned long int bn[MAX_LENGTH];

unsigned int size;

}BigNum

密钥生成,加密和解密涉及到一些大数的基本运算。定义大数的基本运算库,包括加,减,乘,除,取模运算等,其中最重要的模乘运算和模幂运算。

模幂算法是加密解密的核心算法。计算模幂的一种有效算法是“平方-乘”方法,通过对指数的二进制化来实现。

2、密钥的生成

根据文档PKCS#1定义RSA公钥和私钥。

de

typedef struct {

unsigned int bits; /* 公钥n的位数 */

unsigned char modulus[MAX_RSA_ LEN]; /*公钥n*/

unsigned char exponent[MAX_RSA_LEN]; /*公钥e*/

} RSA_PUBLIC_KEY;

typedef struct {

unsigned int bits; /*公钥n的长度*/

unsigned char modulus[MAX_RSA_LEN]; /*公钥n */

unsigned char publicExponent[MAX_RSA_ LEN]; /*公钥e */

unsigned char exponent[MAX_RSA_LEN]; /*私钥d*/

unsigned char prime[2][MAX_RSA_ LEN]; /*两个素数因子*/

unsigned char primeExponent[2][MAX_RSA_PRIME_LEN];

unsigned char coefficient[MAX_RSA_PRIME_LEN];

} RSA_PRIVATE_KEY;

理论上讲,RSA私钥只需包括解密模数和解密指数。但是为加快RSA解密计算的效率,采用中国剩余定理算法,因此RSA私钥包含p,q,d mod (p-1),d mod (q-1),q-1 mod p,其中p,q为大素数,d mod (p-1), d mod (q-1),q-1 mod p由计算过程生成。

按前述RSA原理,分别计算n,e,d等数,将n,e放入RSA公钥;将n,e,d mod (p-1),d mod (q-1) q-1 mod p放入RSA私钥。

参考文献:

1.www.di-mgt.com.au/rsa_alg.html

2.en.wikipedia.org/wiki/rsa

实验九、数字签名算法

一、实验目的与要求

通过实验,使学生掌握利用RSA实现数字签名方法。

二、实验内容

1、RSA数字签名算法的签名算法;

2、RSA数字签名算法的验证算法。

三、实验指导

1991年8月,NIST(National Institute of Standards and Technology)提出了数字签名,并在1993年采纳了FIPS 186作为数字签名标准(Digital Signature Standard)。

RSA数字签名算法,包括签名算法和验证签名算法。首先用MD5算法对信息作散列计算。签名的过程需用户的私钥,验证过程需用户的公钥。A用签名算法将字符串形式的消息处理成签名;B用验证签名算法验证签名是否是A对消息的签名,确认是A发送的消息;消息没有被攥改过;A一定发送过消息。

1、签名算法

签名算法包括二步:消息摘要计算,RSA加密。

消息摘要计算。消息在签名前首先通过MD5计算,生成128位的消息摘要digest。 对摘要作RSA计算。用加密算法,采用签名者的私钥加密消息摘要,得到加密后的字符串。加密算法中使用的加密块为01类型。

2、验证签名算法

验证签名算法包括两步:RSA解密得签名者的消息摘要,验证者对原消息计算摘要,比较两个消息摘要。验证签名的过程输入为消息,签名者的公钥,签名;输出为验证的结果,即是否是正确的签名。

RSA解密。签名实际是加密的字符串。用3。5所述的解密算法,采用签名者的公钥对这个加密的字符串解密。解密的结果应为128位的消息摘要。在解密过程中,若出现得到的加密块的类型不是01,则解密失败。签名不正确。

消息摘要计算和比较。 验证者对消息用MD5算法重新计算,得到验证者自己的消息摘要。验证者比较解密得到的消息摘要和自己的消息摘要,如果两者相同,则验证成功,可以确认消息的完整性及签名确实为签名者的;否则,验证失败。

3、算法描述如下:

DSS中选用SHA(Secure Hash Algorithm)。p, q, g可由一组用户共享,但在实际应用中,使用公共模数可能会带来一定的威胁。签名过程如下:

1 P产生随机数k,k

2 P计算 r = ( g^k mod p ) mod q ○

s = ( k^(-1) (H(m) + xr)) mod q

验证过程: 签名结果是( m, r, s )。

3 验证时计算 w = s^(-1)mod q ○

u1 = ( H( m ) * w ) mod q

u2 = ( r * w ) mod q

v = (( g^u1 * y^u2 ) mod p ) mod q

若v = r,则认为签名有效。

参考文献:

1、en.wikipedia.org/wiki/modular_arithmetic

2、http://en.wikipedia.org/wiki/Digital_Signature_Algorithm

实验十、RC4序列密码

一、实验目的与要求

通过实验,使学生掌握利用RC4实现序列密码的加(解)密方法。

二、实验内容

编程实现RC4的加(解)密算法

三、实验指导

unsigned char S[256];

unsigned int i, j;

void swap(unsigned char *s, unsigned int i, unsigned int j) { unsigned char temp = s[i];

s[i] = s[j];

s[j] = temp;

}

/* KSA */

void rc4_init(unsigned char *key, unsigned int key_length) { for (i = 0; i

S[i] = i;

for (i = j = 0; i

j = (j + key[i % key_length] + S[i]) & 255;

swap(S, i, j);

}

i = j = 0;

}

/* PRGA */

unsigned char rc4_output() {

i = (i + 1) & 255;

j = (j + S[i]) & 255;

swap(S, i, j);

return S[(S[i] + S[j]) & 255];

}

#include

#include

《网络应用程序设计》实验指导书

#include

#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))

int main() {

unsigned char *test_vectors[][2] =

{

{

{

{

};

int x;

for (x = 0; x

int y;

rc4_init(test_vectors[x][0],

strlen((char*)test_vectors[x][0]));

for (y = 0; y

}

return 0;

}

Test vectors

These test vectors are not official, but convenient for anyone testing their own RC4 program. The keys and plaintext are ASCII, the ciphertext is in hexadecimal.

Key Keystream Plaintext Ciphertext

Key eb9f7781b734ca72a719...PlaintextBBF316E8D940AF0AD3

pedia 1021BF0420

Attack at 45A01F645FC35B383552544B9BF5dawn Wiki 6044db6d41b7... Secret 04d46b053ca87b59...

- 20 -


相关文章

  • [信息安全]教学大纲
  • 计算机学院课程教学大纲汇编 [课程编号]060071 信息安全 Information Security [学分]2.5 [学时]40 [编写]舒远仲 [审核]吴军 (一)授课对象 四年制本科计算机科学与技术专业.网络工程专业. (二)课程 ...查看


  • 数学专业参考书推荐
  • 数学专业参考书整理推荐 从数学分析开始讲起: 数学分析是数学系最重要的一门课,经常一个点就会引申出今后的一门课,并且是今后数学系大部分课程的基础.也是初学时比较难的一门课,这里的难主要是对数学分析思想和方法的不适应,其实随着课程的深入会一点 ...查看


  • 电磁学01-库仑定律和电场
  • 2009 年春季 信息学院 电 磁 学 主讲教师: 于民 (62752579:[email protected]) 上课地点:文史楼201 第一章 引 言 基本电磁现象回顾 • 基本电磁现象: – – – – – – – 起电现象.电荷 ...查看


  • [大学物理实验]课程选课说明
  • <大学物理实验>课程选课说明 一.教学任务 教学任务有校本部11个班级(484人),瓯江学院5个班级(192人).<大学物理实验> 课程教学时数一般为36学时(其中:瓯江学院09电子信息工程57学时,10电子信息工程 ...查看


  • 大物实验选课方法
  • 大连理工大学--大学物理实验选课说明 来源: 夏英男的日志 大学物理实验选课说明 1. 大学物理实验的选课系统会在第3周周二上午8:00开通,开通前同学一定要修改密码,认真阅读信息发布栏中的<大学物理实验教学管理规定>和< ...查看


  • 会计实习报告的范文
  • 会计实习报告范文 一.实验目的 随着会计制度的日趋完善,社会对会计人员的高度重视和严格要求,作为一名在校的会计专业学生,为了顺应社会的要求,加强社会竞争力,也应该注重培养自身的素质,培养较强的会计工作的操作能力.实训内容的衔接可以有助于促进 ...查看


  • 量子物理学的发展与应用
  • 魅力科学论文 题 目 量子物理学的发展与应用 姓 名 崔旭旭 专 业 交通运输 学 号 201334013 指导教师 张志强 郑州科技学院车辆与交通工程系 二○一六年六月 量子物理学的发展与应用 摘要:量子物理学是研究微观粒子的性质和运动规 ...查看


  • 概括全部图形推理类型
  • 几乎概括了图形推理的所有类型 图片: 图片: 图片: 图片: 图片: 图片: 图片: 图片: 图片: 图片: 图片: 图片: 图片: 片: 图图片: 图片: [行测资料集]: 华图2011公考资料大集合: http://www.iliyu. ...查看


  • 省固废管理信息平台讲义
  • 广东省固体废物管理信息平台(二期)讲义 一.用户注册 (1)在浏览器地址栏输入http://61.144.36.2:8080/userlogin.aspx,或者通过固废中心网站http://www.gdwmc.cn的入口进入广东省固体废物管 ...查看


热门内容