密码学实验报告(18000字)

发表于:2016.9.6来自:www.ttfanwen.com字数:18000 手机看范文

密码学实验报告

学院: 计算机科学与技术 班级:

学号:

姓名: 指导老师:

实验日志

实验题目:

DES(或AES)分组密码

实验目的:

熟悉分组密码加解密算法的基本原理,加深对所提供的部分源程序的理解;

分组密码将明文分成一组一组,在密钥的控制下,经过加密变换生成一组一组的密文。具体而言,分组密码就是将明文消息序列m1,m2,?,mi,?划分成等长的消息组

(m1,m2,?,mn),(mn?1,mn?2,?,m2n),?在密钥k?k1,k2,?,kt的控制下按固定的加密算法一组一

组进行加密,输出一组一组密文(c1,c2,?,cl),(cl?1,cl?2,?,c2l),?。

下面的实验以DES算法为例,DES算法明文分组长为64bit,加密后得到64bit的密文,输入初始种子密钥为64bit,第8、16、24、32、40、48、56、64为奇偶校验位,实际的密钥长为56bit。DES加密过程由三个阶段来完成:

(1) 初始置换IP,用于重排明文分组的64bit数据;

(2) 相同结构的16轮迭代,每轮中都有置换和代换运算,第16轮变换的输出分为左右两半,并交换次序。

-1(3) 逆初始置换IP(为IP的逆)后,产生64bit的密文。

实验要求:

(1) Windows系列操作系统;

(2) VC6.0编程环境。

(3) 提交完整的程序代码清单和详细的注释;

(4) 要求有程序运行结果显示。当加密成功时,得到密文;输入相同的密钥,能将密文恢复成明文。

实验主要步骤:

(1) 熟悉分组密码加解密算法的基本原理,加深对所提供的部分源程序的理解;

(2) 分析源程序中密码算法的加解密和子密钥生成等典型模块的主要功能,并对源程序加上注释;

(3) 在已提供的部分源程序的基础上,添加源程序省缺的部分;

(4) 对给定的消息分组进行加解密运算和验证。

源代码:

#include <stdio.h>

#include <memory.h>

#include <string.h>

typedef bool (*PSubKey)[16][48];

enum {ENCRYPT,DECRYPT}; //选择:加密;解密

static bool SubKey[2][16][48]; // 16圈子密钥

static bool Is3DES; // 3次DES标志

static char Tmp[256], deskey[16]; //暂存字符串,密钥串

static void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type);//标准DES加/解密 static void SetKey(const char* Key, int len);// 设置密钥

static void SetSubKey(PSubKey pSubKey, const char Key[8]);// 设置子密钥

static void F_func(bool In[32], const bool Ki[48]);// f 函数

static void S_func(bool Out[32], const bool In[48]);// S 盒代替

static void Transform(bool *Out, bool *In, const char *Table, int len);// 变换

static void Xor(bool *InA, const bool *InB, int len);// 异或

static void RotateL(bool *In, int len, int loop);// 循环左移

static void ByteToBit(bool *Out, const char *In, int bits);// 字节组转换成位组

static void BitToByte(char *Out, const bool *In, int bits);// 位组转换成字节组

// Type(选择)—ENCRYPT:加密,DECRYPT:解密

// 输出缓冲区(Out)的长度 >= ((datalen+7)/8)*8,即比datalen大的且是8的倍数的最小正整数 // In 可以= Out,此时加/解密后将覆盖输入缓冲区(In)的内容

// 当keylen>8时系统自动使用3次DES加/解密,否则使用标准DES加/解密.超过16字节后只取前16字节

//加密解密函数:

bool DES_Act(char *Out,char *In,long datalen,const char *Key,int keylen,bool Type = ENCRYPT);

void main()

{

char plain_text[100]; // 设置明文

char key[100] ; // 密钥设置

printf("请输入明文:\n");

gets(plain_text);

printf("\n 请输入密钥:\n");

gets(key);

char encrypt_text[255]; // 密文

char decrypt_text[255]; // 解密文

memset(encrypt_text,0,sizeof(encrypt_text));

memset(decrypt_text,0,sizeof(decrypt_text));

// 进行DES加密:

DES_Act(encrypt_text, plain_text, sizeof(plain_text), key, sizeof(key), ENCRYPT); printf("\nDES加密后的密文:\n");

printf("%s\n\n",encrypt_text);

// 进行DES解密:

DES_Act(decrypt_text, encrypt_text, sizeof(plain_text), key, sizeof(key), DECRYPT); printf("\n解密后的输出:\n");

printf("%s",decrypt_text);

printf("\n\n");

getchar();

}

//下面是DES算法中用到的各种表:

// 初始置换IP表

const static char IP_Table[64] =

{

58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,

62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,

57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,

61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7

};

// 逆初始置换IP1表

const static char IP1_Table[64] =

{

40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,

38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29,

36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,

34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25

};

// 扩展置换E表

static const char Extension_Table[48] =

{

32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,

8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17,

16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25,

24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1

};

// P盒置换表

const static char P_Table[32] =

{

16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,

2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25

};

// 密钥置换表

const static char PC1_Table[56] =

{

57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,

10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,

63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,

14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4

};

// 压缩置换表

const static char PC2_Table[48] =

{

14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,

23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,

41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,

44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32

};

// 每轮移动的位数

const static char LOOP_Table[16] =

{

1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1

};

// S盒设计

const static char S_Box[8][4][16] =

{

// S盒1

14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13, // S盒2

15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9, // S盒3

10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12, // S盒4

7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14, // S盒5

2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3, // S盒6

12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13, // S盒7

4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12, // S盒8

13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11 };

//下面是DES算法中调用的函数:

// 字节转换函数

void ByteToBit(bool *Out, const char *In, int bits)

{

for(int i=0; i<bits; ++i)

Out[i] = (In[i>>3]>>(i&7)) & 1;

}

// 比特转换函数

void BitToByte(char *Out, const bool *In, int bits)

{

memset(Out, 0, bits>>3);

for(int i=0; i<bits; ++i)

Out[i>>3] |= In[i]<<(i&7);

}

// 变换函数

void Transform(bool *Out, bool *In, const char *Table, int len)

{

for(int i=0; i<len; ++i)

Tmp[i] = In[ Table[i]-1 ];

memcpy(Out, Tmp, len);

}

// 异或函数的实现

void Xor(bool *InA, const bool *InB, int len)

{

for(int i=0; i<len; ++i)

InA[i] ^= InB[i];

}

// 轮转函数

void RotateL(bool *In, int len, int loop)

{

memcpy(Tmp, In, loop);

memcpy(In, In+loop, len-loop);

memcpy(In+len-loop, Tmp, loop);

}

// S函数的实现

void S_func(bool Out[32], const bool In[48]) //将8组,每组6 bits的串,转化为8组,每组4 bits

{

for(char i=0,j,k; i<8; ++i,In+=6,Out+=4)

{

j = (In[0]<<1) + In[5];

k = (In[1]<<3) + (In[2]<<2) + (In[3]<<1) + In[4];

ByteToBit(Out, &S_Box[i][j][k], 4);

}

}

// F函数的实现

void F_func(bool In[32], const bool Ki[48])

{

static bool MR[48];

Transform(MR, In, Extension_Table, 48); //先进行 E 扩展

Xor(MR, Ki, 48); //再异或

S_func(In, MR); //各组字符串分别经过各自的 S 盒 Transform(In, In, P_Table, 32); //最后 P 变换

}

// 设置子密钥

void SetSubKey(PSubKey pSubKey, const char Key[8])

{

static bool K[64], *KL=&K[0], *KR=&K[28]; //将64位密钥串去掉8位奇偶位后,分成两份

ByteToBit(K, Key, 64); //转换格式

Transform(K, K, PC1_Table, 56);

for(int i=0; i<16; ++i) // 由56位密钥产生48位子密钥 {

RotateL(KL, 28, LOOP_Table[i]); //两份子密钥分别进行左移转换 RotateL(KR, 28, LOOP_Table[i]);

Transform((*pSubKey)[i], K, PC2_Table, 48);

}

}

// 设置密钥

void SetKey(const char* Key, int len)

{

memset(deskey, 0, 16);

memcpy(deskey, Key, len>16?16:len);

SetSubKey(&SubKey[0], &deskey[0]);

Is3DES = len>8 ? (SetSubKey(&SubKey[1], &deskey[8]), true) : false;

}

// DES加解密函数

void DES(char Out[8], char In[8], const PSubKey pSubKey, bool Type)

{

static bool M[64], tmp[32], *Li=&M[0], *Ri=&M[32]; //64 bits明文 经过IP置换后,分成左右两份

ByteToBit(M, In, 64);

Transform(M, M, IP_Table, 64);

if( Type == ENCRYPT ) //加密

{

for(int i=0; i<16; ++i) //加密时:子密钥 K0~K15 {

memcpy(tmp, Ri, 32);

F_func(Ri, (*pSubKey)[i]); // 调用F函数

Xor(Ri, Li, 32); //Li与Ri异或

memcpy(Li, tmp, 32);

}

}

else //解密

{

for(int i=15; i>=0; --i) // 解密时:Ki的顺序与加密相反

{

memcpy(tmp, Li, 32);

F_func(Li, (*pSubKey)[i]);

Xor(Li, Ri, 32);

memcpy(Ri, tmp, 32);

}

}

Transform(M, M, IP1_Table, 64); //最后经过逆初始置换IP-1,得到密文/明文

BitToByte(Out, M, 64);

}

// DES加解密函数(可以对长明文分段加密)

bool DES_Act(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type) {

if( !( Out && In && Key && (datalen=(datalen+7)&0xfffffff8) ) )

return false;

SetKey(Key, keylen);

if( !Is3DES )

{ // 1次DES

for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8)

DES(Out, In, &SubKey[0], Type);

}

else

{ // 3次DES 加密:加(key0)-解(key1)-加(key0) 解密::解(key0)-加(key1)-解(key0)

for(long i=0,j=datalen>>3; i<j; ++i,Out+=8,In+=8) {

DES(Out, In, &SubKey[0], Type);

DES(Out, Out, &SubKey[1], !Type);

DES(Out, Out, &SubKey[0], Type);

}

}

return true;

}

实验结果:

密码学实验报告

心得体会:

通过这次实验,我熟悉了分组密码加解密算法的基本原理,加深了对所提供的部分源程序的理解;这次实验最关键的要理解源代码,真正懂得其中算法,这是精髓。通过这第一个密码学实验,我才发现好多c语言的基本知识都忘得差不多了。学东西不能像猴子搬玉米,捡了又丢了,所以通过这次实验也刚好把c语言的知识给捡起来。这揭开了一层密码学实验神秘的面纱。

实验日志二

实验题目:

RSA公钥密码

实验目的:

?(n),e)?1;在RSA算法中,n?p?q;?(n)?(p?1)?(q?1);1?e??(n),且gcd(

d?e ? 1 mod ?(n)。这些参数中,公开的有:n和e,保密的有:p、q和d。

设明文分组m,则加密算法为

c?me mod n

对密文分组c的解密运算为

m?cd mod n

实验要求:

(1) Windows系列操作系统;

(2) VC6.0编程环境

实验主要步骤:

(1) 编写RSA加密程序,在指定的目录下建立明文文件,输入任意选取的密钥,加密后得到密文文件;

(2) 编写RSA解密程序,将密文文件解密得到明文文件。

源代码:

#include <math.h>

#include <stdio.h>

void main()

{

long p,q,n,t,e,d,i;

/*定义明文的长度及内容*/

char m[50] = {"Hello,Nice to meet you!"};

long encrypt[50];

char decrypt[50];

p=149,q=193;

n=p*q;

t=(p-1)*(q-1);

/*取得 e*/

i=2;

while(1)

{

long a=t,b=i,c;

a,b=t>i?t,i:i,t;

while(1)

{

if(b==0) break;

c=a%b;

a=b;

b=c;

}

if(a==1)

{

e=i;

break;

}

i++;

}

/*取得 d*/

i=1;

while(1)

{ if((t*i+1)%e==0) { d=(t*i+1)/e; break; } i++; } /*输出数据与明文*/ printf(" 两个大素数:p=%d, q=%d ;\n 公钥:n=%d, e=%d ;\n 私钥:d=%d \n\n",p,q,n,e,d); printf(" 明文: %s\n",m); /*加密*/ for(i=0;i<50;i++) { long a=e,b=1,c; for(c=m[i];a>0;a>>=1) { if(a%2==1) b=(b*c)%n; c=(c*c)%n; } encrypt[i]=b; } /*十六进形式输出密文*/ printf("\n 利用公钥加密后的密文为: "); for(i=0;i<50;i++) printf("%x",encrypt[i]); /*解密*/ for(i=0;i<50;i++) { long a=d,b=1,c; for(c=encrypt[i];a>0;a>>=1) { if(a%2==1) b=(b*c)%n; c=(c*c)%n; } decrypt[i]=(char)b; }

}

/*输出解密后的消息*/ printf("\n\n 利用私钥解密后的密文: %s\n",decrypt);

实验结果:

密码学实验报告

心得体会:

经过这次实验,我了解了公钥密码体制的基本思想,基本掌握了公钥密码算法RSA,学会了分析密码算法安全性的基本思想。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐位公钥数据加密标准。有什么不懂得一定要请教老师或者同学,把不懂得彻底弄懂。

实验日志三

实验题目:数字签名标准

实验目的:

DSS的核心是DSA算法,在DSA算法中,公钥k1=(p,q,g,y);私钥k2=(x)。签名者选取一个随机数k,满足0<k<q;拥有私钥x;使用SHA-1算法计算出消息摘要h(m)。DSA签名算法为

r≡(gk mod p) mod q

s≡(h(m)+xr)k-1 mod q

生成的签名为(r,s)。

验证者拥有公钥k1=(p, g, y),收到的明文m和签名(r, s),验证算法

(gu1yu2modp)modq?r

其中

u1≡h(m)s-1 mod q, u2≡rs-1 mod q

如果等式成立,则签名有效。否则,签名无效。

实验要求:

(1) Windows 系列操作系统;

(2) 掌握DSS的基本原理,阅读和分析已提供的DSA算法中生成密钥对的源代码DSAGenerateKeyPair.java,导出私钥文件prikey.dat和公钥文件pubkey.dat。

(3) 添加实现DSA签名代码DSASigner.java和DSA签名验证代码DSAChecker.java。

(4) 完成对消息的签名运算和验证运算。

实验主要步骤:

(1) 使用DSAGenerateKeyPair.java生成一对密钥,导出私钥文件prikey.dat和公钥文件pubkey.dat。

(2) 运行DSASigner.java,导入私钥文件prikey.dat,对消息签名,将签名后的数据写入文件info.dat;

(3) 运行DSAChecker.java 文件,导入公钥文件pubkey.dat,导入已签名的文件info.dat,验证签名的有效性。

源代码:

#include "stdafx.h"

#include <string.h>

#include <stdio.h>

#include "BigInt.h"

#include "sha1.h"

#include "time.h"

int shas1(const unsigned int x[], unsigned char digest[20])

{

SHA1_CTX context;

unsigned char buffer[16384]; //,digest[20];

// FILE *file;

SHA1Init(&context);

SHA1Update(&context, buffer, 1);

SHA1Final(digest, &context);

return 0;

}

CBigInt sha(CBigInt y)

{

SHA1_CTX context;

CBigInt X;

unsigned char buffer[16384],digest[20];

CString str;

char *t="0123456789ABCDEF";

if((y.m_nLength==1)&&(y.m_ulValue[0]==0))

{

str="0";

X.Mov(0);

return X;

}

str="";

int a;

char ch='\0';

str.Insert(0,ch);

X.Mov(y);

while(X.m_ulValue[X.m_nLength-1]>0)

{

a=X.Mod(16);

ch=t[a];

str.Insert(0,ch);

X.Mov(X.Div(16));

}

int i=0;

while (str[i]>0)

i++;

for (a=i,i=0;i<a;i++)

buffer[i]=str[i];

for (i=a;i<64;i++) buffer[i]='\0';

SHA1Init(&context);

SHA1Update(&context, buffer, 1);

SHA1Final(digest, &context);

int len=str.GetLength(),k;

X.Mov(0);

for(i=0;i<20;i++)

{

X.Mov(X.Mul(256));

// if((digest[i]>='0')&&(digest[i]<='9'))

k=digest[i];

// else if((digest[i]>='A')&&(digest[i]<='F'))k=digest[i]-55; // else if((digest[i]>='a')&&(digest[i]<='f'))k=digest[i]-87; // else k=0;

X.Mov(X.Add(k));

}

return X;

}

CBigInt makerandnumber( unsigned int len)

{

srand(time(NULL));

CBigInt X;

X.m_nLength=(len+31)/32;

// X.Mov(0);

for (unsigned int j=0;j<X.m_nLength;j++)

{

X.m_ulValue[j]=rand()*0x10000+rand();

}

X.m_ulValue[0]=X.m_ulValue[0]|0x1;

X.m_ulValue[j-1]=X.m_ulValue[j-1]|0x80000000;

return X;

}

CBigInt pow2( const int x, int y)

{

CBigInt p,q,t;

p.Mov(1);

q.Mov(x);

while (y>0)

{

if (y%2==0) {q.Mov(q.Mul(q)); y /= 2 ; }

else { p.Mov(p.Mul(q)); y -= 1; }

}

return p;

}

CBigInt pow3(CBigInt x, CBigInt y, CBigInt m)

{

CBigInt p,t;

p.Mov(1);

t.Mov(0);

while (y.Cmp(t)>0)

{

if (y.m_ulValue[0]&0x1==0)

{x.Mov(x.Mul(x)); x.Mov(x.Mod(m)); x.Mov(x.Div(2)); } else {p.Mov(p.Mul(x)); p.Mov(p.Mod(m)); y.Mov(y.Sub(1)); } }

return p;

}

/*

void dsa()

{

CBigInt r,s,u,v[4],w,p,q,t;

t.Mov(pow2(2,160));

//

int n=3,b=31,L=512,g=160,T=1; while (T) { while (T) { s.Mov(makerandnumber(g)); r.Mov(s); r.Mov(r.Add(1)); r.Mov(r.Mod(t)); u.Mov(sha(s)); q.Mov(sha(r)); for (int i=0;i<5;i++) q.m_ulValue[i]=q.m_ulValue[0]^u.m_ulValue[i]; if (q.Rab()) break; } int C=0,N=2; while (T) { v[4],w,p; for (int k=0;k<4;k++) { v[k].Mov(s); v[k].Mov(v[k].Add(N+k)); v[k].Mov(v[k].Mod(t)); v[k].Mov(sha(v[k])); } w.Mov(0); r.Mov(1); for ( k=0;k<3;k++) { v[k].Mov(v[k].Mul(r)); w.Mov(w.Add(v[k])); r.Mov(r.Mul(t)); } v[k].Mov(v[k].Mod(0x80000000)); v[k].Mov(v[k].Mul(r)); w.Mov(w.Add(v[k])); r.Mov(w); r.Mov(r.Add(1)); w.Mov(w.Mod(q)); r.Mov(r.Sub(w)); p.Mov(r); if (p.Rab()) break; C=C+1;

}

*/ } N=N+n+1; if (C==4096) break; } if (C<4096) break;

实验结果:

密码学实验报告

心得体会:

DSS数字签名的核心是DSA算法,数字签名应用十分广泛,对我们来说接触地最多的是在支付宝付账的时候网站进行了数字签名,给我们的交易多加了一层防护网。这次实验对于如何生成、导出密钥,如何进行签名和认证我有了更清晰的认识。可以自己尝试进行数字签名,记住,多动手多动脑才能更好地掌握这门技术。

实验日志四

实验题目:

邮件加密软件PGP

实验目的:

PGP(Pretty Good Privacy)是一个完整的电子邮件安全软件包,它将RSA公钥密码体制、IDEA分组密码体制和MD5算法等结合使用,能够保密发送者的邮件,防止非授权者阅读,还能对邮件加上发送者的数字签名,使接收者确信邮件是发送者发过来的。总体上,PGP包括对电子邮件进行加密、认证、数字签名、压缩、分段与重装等技术处理。

实验要求:

(1) Windows xp或Windows 2000以上操作系统;

(2) PGP邮件加密软件。

实验主要步骤和结果:

) 安装和配置PGP

1) 安装PGP

PGP软件的安装十分简单,按照系统提示进行即可。

2) 创建密钥对

进入―PGP Key Generation Wizard‖窗口创建密钥对。在―Full name‖框中输入想要创建的用户A的用户名,―Email address‖框中输入用户A所对应的电子邮件地址,这些信息是公开的。 下一步是―Passphrase Assignment‖,如图4所示。在―Passphrase‖框中输入保护私钥的秘密短语,在―Confirmation‖框中再次输入秘密短语以便证实无误。

密码学实验报告

图4 创建秘密短语

―Passphrase Assignment‖步骤完成后,点击―下一步‖按钮。进入―Key Generation Progress‖,系统开始自动创建密钥对,生成―Key‖和―Subkey‖。点击―下一步‖按钮,完成―PGP Key Generation Wizard‖。

3) 上传和下载公钥

为了使其他人能够给用户A发送加密的邮件或文件,用户A需要将自己的公钥告知他人。启动―PGPkeys‖,如图5,该窗口显示所有―Local Keyring‖中用户的公钥基本信息。

密码学实验报告

图5 用户公钥信息

右键点击用户A的公钥,选择―Send To‖->― ldap://…‖,可将用户A的公钥上传到公钥服务器上供别人下载。

当用户A发送加密邮件或文件给其他人,就需要得到其他人的公钥。启动―PGPkeys‖,打开菜单―Server‖ ->―Search‖,将显示公钥服务器上所有公钥,右键点击需要下载的通信用户B的公钥,选择―Import to Local Keyring‖,用户B的公钥将导入到―Local Keyring‖,显示在―PGPkeys‖窗口中。

(2) 加密和解密

PGP使用公钥对文件和邮件加密。例如,对文件test.txt加密,右键点击该文件,在弹出菜单里选择―PGP‖ ->―Encrypt‖,将出现―PGPshell – Key Selection Dialog‖。对话框中上面的列表框是备选的用户公钥,下面的列表框是接收者的公钥,两个列表框中的公钥可以相互转储。选择公钥后,点击―OK‖,生成加密文件test.txt.pgp,使用文本编辑器打开该加密文件是一堆乱码。如果在―PGPshell – Key Selection Dialog‖中选择左下脚的―Text Output‖,生成加密文件test.txt.asc,使用文本编辑器打开该加密文件如图6所示。

解密时,右键点击加密文件,选择―PGP‖ ->―Decrypt‖,将出现―PGPshell – Enter Passphrase‖对话框,输入保护私钥的秘密短语,点击―OK‖,解密文件成功。PGP对邮件的加解密与文件类似。

密码学实验报告

图6 加密文件test.txt.asc

(3) 签名和验证

PGP对文件和邮件的签名,在操作上与加密类似,不同点在于,加密文件时需选择接

收者的公钥,签名则要输入签名者的秘密短语。签名时,右键点击要签名的文件,选择―PGP‖ ->―Sign‖,生成的签名文件为原文件名.sig。

单击签名文件,PGP自动做签名验证,如图7所示,从―PGPlog‖中可查看到签名者的公钥和签名日期等信息。

密码学实验报告

心得体会:本次实验的主要内容是根据实验要求安装和配置邮件加密软件GPG,并通过运行该软件来加深对软件的认识和了解。这是密码学实验的最后一次实验,但是在实验室安装PGP的时候重启电脑,什么数据都没有,由于实验电脑设置问题,只有回到寝室再完成这个实验,仔细阅读实验指导书,按照步骤,一步一步地来,这的确是安全系数很高的邮件传输软件。密码学的实验真的很有意思,很有实践意义。我们应该多上机进行实验,这样才能理论和实践相结合。



更多类似范文
┣ 更多密码学实验报告
┗ 搜索类似范文

更多相关推荐:
密码学实验报告1800字

江苏大学学院专业姓名学号计算机学院信息安全09023090604035小组成员AES对称加密算法实现一AES对称加密算法实现原理AESTheAdvancedEncryptionStandard接受一个128位的...

密码实验报告12100字

课程名称密码编码学实验实验名称古典密码算法一实验目的及内容熟悉古典密码算法凯撒密码算法和维吉尼亚密码算法的编程实现加强对密码学的理解二实验源代码1凯撒密码算法includeltstdiohgtincludelt...

仿射密码实验报告1300字

实验报告姓名1111学号22222班级2222日期20xx211古典密码仿射密码一实验环境1硬件配置处理器Corei5M内存2GB主硬盘320G2使用软件1操作系统win72软件工具MicrosoftVisua...

DES 加密解密算法的C++实现--实验报告11000字

网络与信息安全IntroductiontoNetworkandSecurityDES加密解密算法的C实现姓名学号学院20xx年10月一DES算法的实现1DES简介本世纪五十年代以来密码学研究领域出现了最具代表性...

专栏推荐
大家在关注

地图地图CC