当前位置:文档之家› 密码学算法选题

密码学算法选题

密码学算法选题
密码学算法选题

密码学算法

1、 单表加法密码(简单)

1.(1)写出单表古典密码的加法加密运算的算法

设X=Y=Z q ,K=Z q 。对任意m ∈X ,k ∈K ,密文q k m m mod )(c K k

+==)(,加法密码的密钥量为q 。

Step1:确定k 和q 的值;

Step2:输入相应的密文;

Step3:作变换 c=(m+k) mod q ,字母用ASCII 码变为数字后计算;

Step4:得到相对应的明文;

Step5:逐一输出明文;

(2)单表古典密码的加法加密运算的程序设计如下:

#include

void main()

{

int jiami(int q,int k,int i);

char m[100],c[100];

int i,j,q,k;

cout<<"输入模q :";

cin>>q;

cout<<"输入密钥k :";

cin>>k;

cout<<"输入"<

for(i=0;i

cin>>m[i];

for(i=0;i

{

j=jiami(q,k,i);

c[i]=m[j];

}

cout<<"加密后的密文为:"<

for(i=0;i

cout<

cout<

}

int jiami(int q,int k,int i)

{

return (i+k)%q;

}

单表古典密码的加法加密运算运行结果如下:

2. 输入模q(=12)及加密密钥k(=5)对下列明文进行加法加密和乘法加密:

A graph is finite if both its vertex set and edge set are finite. In this book we study only finite graphs, and so the term ‘graph’ always means ‘finite graph’.

(注:标点符号及空格也算一个符号,忽略大小)

加法加密后的运行程序:

#include

void main()

{

char M[100];

char C[100];

int K=5,q=12,i;

printf("please input chars:\n");

gets(M);

for(i=0;M[i]!='\0';i++)

{

if(M[i]>='a'&&M[i]<='z')

{

C[i]=(M[i]-'a'+K)%q+'a';

}

else if(M[i]>='A'&&M[i]<='Z')

{

C[i]=(M[i]-'A'+K)%q+'A';

}

else

C[i]=M[i];

}

C[i]='\0';

printf("The result is:\n%s\n",C);

getchar();

}

运行结果:

3. 加法加密运算的解密密钥是c=(m+5)mod 12

2、HILL密码(中等)

#include

#define N 3 //可加密的字符串长度

char plaintext[N]; //明文,输入时输入字符,参与运算时强制转换成整数int ciphertext[N]; //密文,保存成整数,输出时强制转换成字符

int key[N][N]; //密钥矩阵

void getPlainText() //获得明文字符串

{

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

scanf("%s",plaintext);

printf("\n");

}

void getKey() //输入密钥矩阵

{

int i,j;

printf("请输入加密矩阵:\n");

for(i=0;i

for(j=0;j

scanf("%d",&key[i][j]);

printf("\n");

}

void hill() //Hill加密算法

{

int i,j;

for(i=0;i

for(j=0;j

ciphertext[i]+=key[i][j]*(int)(plaintext[j]-'a');

ciphertext[i]%=26;

}

}

printf("\n");

}

void printCipherText() //输出加密后的密文

{

int i;

printf("加密后的密文是:");

for(i=0;i

printf("%c",(char)(ciphertext[i]+'a'));

printf("\n");

}

void main()

{

getPlainText(); //明文

getKey(); //密钥

hill(); //加密

printCipherText(); //密文

}

3、DES算法(复杂)

1.DES算法详述

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其功能是把输入的64位数据块按位重新组合,并把输出分为L0 、R0两部分,每部分各长32位,其置换规则见下表:58,50,12,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,

即将输入的第58位换到第一位,第50位换到第2位,......,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0 是右32位,例:设置换前的输入值为D1D2D3......D64,则经过初始置换后的结果为:L0=D550......D8;R0=D57D49 (7)

经过26次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置的逆运算,例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位,其逆置换规则如下表所示:

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,

放大换位表

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,

单纯换位表

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,

在f(Ri,Ki)算法描述图中,S1,S2...S8为选择函数,其功能是把6bit数据变为4bit数据。下面给出选择函数Si(i=1,2......8)的功能表:

选择函数Si

S1:

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,

S2:

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,

S3:

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,

S4:

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,

S5:

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,

S6:

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,

S7:

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,

S8:

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,

2.子密钥Ki(48bit)的生成算法

初始Key值为64位,但DES算法规定,其中第8、16、......64位是奇偶校验位,不参与DES运算。故Key 实际可用位数便只有56位。即:经过缩小选择换位表1的变换后,Key 的位数由64 位变成了56位,此56位分为C0、D0两部分,各28位,然后分别进行第1次循环左移,得到C1、D1,将C1(28位)、D1(28位)合并得到56位,再经过缩小选择换位2,从而便得到了密钥K0(48位)。依此类推,便可得到K1、K2、......、K15,不过需要注意的是,16次循环左移对应的左移位数要依据下述规则进行:

循环左移位数1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1

以上介绍了DES算法的加密过程。DES算法的解密过程是一样的,区别仅仅在于第一次迭代时用子密钥K15,第二次K14、……,最后一次用K0,算法本身并没有任何变化。

一、加/解密执行过程及结果

1.运行程序

2.加密过程(同时生成密文文档)

3.解密过程(同时生成明文外部文档)

二、源代码

#include "stdafx.h"

#include "DESTest.h"

#include "DESTestDlg.h"

#include "Encrypt.h"

void CDES::deskey(unsigned char key[8], Mode md)

{

register int ii, j, l, m, n;

unsigned char pc1m[56], pcr[56];

unsigned long kn[32];

for (j = 0; j < 56; j++)

{

l = pc1[j];

m = l & 07;

pc1m[j] = (key[l >> 3] & bytebit[m]) ? 1:0;

for (ii = 0; ii < 16; ii++)

{

if (md == DECRYPT) m = (15 - ii) << 1;

else

{

m = ii << 1;

n = m + 1;

kn[m] = kn[n] = 0L;

}

for (j = 0; j < 28; j++)

{

l = j + totrot[ii];

if (l < 28)

pcr[j] = pc1m[l];

else

pcr[j] = pc1m[l - 28];

}

for (j = 28; j < 56; j++)

{

l = j + totrot[ii];

if (l < 56)

pcr[j] = pc1m[l];

else

pcr[j] = pc1m[l - 28];

}

for (j = 0; j < 24; j++)

{

if (pcr[ pc2[j] ])

kn[m] |= bigbyte[j];

if (pcr[ pc2[j+24] ])

kn[n] |= bigbyte[j];

}

}

cookey(kn);

return;

}

void CDES::cookey(register unsigned long *raw1) {

register unsigned long *cook, *raw0;

unsigned long dough[32];

register int i;

cook = dough;

for (i = 0; i < 16; i++, raw1++)

raw0 = raw1++;

*cook = (*raw0 & 0x00fc0000L) << 6;

*cook |= (*raw0 & 0x00000fc0L) << 10;

*cook |= (*raw1 & 0x00fc0000L) >> 10;

*cook++ |= (*raw1 & 0x00000fc0L) >> 6;

*cook = (*raw0 & 0x0003f000L) << 12;

*cook |= (*raw0 & 0x0000003fL) << 16;

*cook |= (*raw1 & 0x0003f000L) >> 4;

*cook++ |= (*raw1 & 0x0000003fL);

}

usekey(dough);

return;

}

void CDES::usekey(register unsigned long *from)

{

register unsigned long *to, *endp;

to = KnL, endp = &KnL[32];

while (to < endp)

{

*to++ = *from++;

}

return;

}

void CDES::scrunch(register unsigned char *outof, register unsigned long *into ) {

*into = (*outof++ & 0xffL) << 24;

*into |= (*outof++ & 0xffL) << 16;

*into |= (*outof++ & 0xffL) << 8;

*into++ |= (*outof++ & 0xffL);

*into = (*outof++ & 0xffL) << 24;

*into |= (*outof++ & 0xffL) << 16;

*into |= (*outof++ & 0xffL) << 8;

*into |= (*outof & 0xffL);

return;

}

void CDES::unscrun(register unsigned long *outof, register unsigned char *into) {

*into++ = (*outof >> 24) & 0xffL;

*into++ = (*outof >> 16) & 0xffL;

*into++ = (*outof >> 8) & 0xffL;

*into++ = *outof++ & 0xffL;

*into++ = (*outof >> 24) & 0xffL;

*into++ = (*outof >> 16) & 0xffL;

*into++ = (*outof >> 8) & 0xffL;

*into = *outof & 0xffL;

return;

}

void CDES::desfunc(register unsigned long *block, register unsigned long *keys) {

register unsigned long fval, work, right, leftt;

register int round;

leftt = block[0];

right = block[1];

work = ((leftt >> 4) ^ right) & 0x0f0f0f0fL;

right ^= work;

leftt ^= (work << 4);

work = ((leftt >> 16) ^ right) & 0x0000ffffL;

right ^= work;

leftt ^= (work << 16);

work = ((right >> 2) ^ leftt) & 0x33333333L;

leftt ^= work;

right ^= (work << 2);

work = ((right >> 8) ^ leftt) & 0x00ff00ffL;

leftt ^= work;

right ^= (work << 8);

right = ((right << 1) | ((right >> 31) & 1L)) & 0xffffffffL;

work = (leftt ^ right) & 0xaaaaaaaaL;

leftt ^= work;

right ^= work;

leftt = ((leftt << 1) | ((leftt >> 31) & 1L)) & 0xffffffffL;

for (round = 0; round < 8; round++)

{

work = (right << 28) | (right >> 4);

work ^= *keys++;

fval = SP7[work & 0x3fL];

fval |= SP5[(work >> 8) & 0x3fL];

fval |= SP3[(work >> 16) & 0x3fL];

fval |= SP1[(work >> 24) & 0x3fL];

work = right ^ *keys++;

fval |= SP8[work & 0x3fL];

fval |= SP6[(work >> 8) & 0x3fL];

fval |= SP4[(work >> 16) & 0x3fL];

fval |= SP2[(work >> 24) & 0x3fL];

leftt ^= fval;

work = (leftt << 28) | (leftt >> 4);

work ^= *keys++;

fval = SP7[work & 0x3fL];

fval |= SP5[(work >> 8) & 0x3fL];

fval |= SP3[(work >> 16) & 0x3fL];

fval |= SP1[(work >> 24) & 0x3fL];

work = leftt ^ *keys++;

fval |= SP8[work & 0x3fL];

fval |= SP6[(work >> 8) & 0x3fL];

fval |= SP4[(work >> 16) & 0x3fL];

fval |= SP2[(work >> 24) & 0x3fL];

right ^= fval;

}

right = (right << 31) | (right >> 1);

work = (leftt ^ right) & 0xaaaaaaaaL;

leftt ^= work;

right ^= work;

leftt = (leftt << 31) | ( leftt >> 1);

work = ((leftt >> 8) ^ right) & 0x00ff00ffL;

right ^= work;

leftt ^= (work << 8);

work = ((leftt >> 2) ^ right) & 0x33333333L;

right ^= work;

leftt ^= (work << 2);

work = ((right >> 16) ^ leftt) & 0x0000ffffL;

leftt ^= work;

right ^= (work << 16);

work = ((right >> 4) ^ leftt) & 0x0f0f0f0fL;

leftt ^= work;

right ^= (work << 4);

*block++ = right;

*block = leftt;

return;

};

unsigned char CDES::Df_Key[24] =

{

0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef,

0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10,

0x89, 0xab, 0xcd, 0xef, 0x01, 0x23, 0x45, 0x67 };

unsigned short CDES::bytebit[8] =

{

0200, 0100, 040, 020, 010, 04, 02, 01

};

unsigned long CDES::bigbyte[24] =

{

0x800000L, 0x400000L, 0x200000L, 0x100000L,

0x80000L, 0x40000L, 0x20000L, 0x10000L,

0x8000L, 0x4000L, 0x2000L, 0x1000L,

0x800L, 0x400L, 0x200L, 0x100L,

0x80L, 0x40L, 0x20L, 0x10L,

0x8L, 0x4L, 0x2L, 0x1L

};

unsigned char CDES::pc1[56] =

{

56, 48, 40, 32, 24, 16, 8, 0, 57, 49, 41, 33, 25, 17,

9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35,

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

13, 5, 60, 52, 44, 36, 28, 20, 12, 4, 27, 19, 11, 3

};

unsigned char CDES::totrot[16] =

{

1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28

};

unsigned char CDES::pc2[48] =

{

13, 16, 10, 23, 0, 4, 2, 27, 14, 5, 20, 9,

22, 18, 11, 3, 25, 7, 15, 6, 26, 19, 12, 1,

40, 51, 30, 36, 46, 54, 29, 39, 50, 44, 32, 47,

43, 48, 38, 55, 33, 52, 45, 41, 49, 35, 28, 31

};

unsigned long CDES::SP1[64] =

{

0x01010400L, 0x00000000L, 0x00010000L, 0x01010404L, 0x01010004L, 0x00010404L, 0x00000004L, 0x00010000L, 0x00000400L, 0x01010400L, 0x01010404L, 0x00000400L, 0x01000404L, 0x01010004L, 0x01000000L, 0x00000004L, 0x00000404L, 0x01000400L, 0x01000400L, 0x00010400L, 0x00010400L, 0x01010000L, 0x01010000L, 0x01000404L, 0x00010004L, 0x01000004L, 0x01000004L, 0x00010004L, 0x00000000L, 0x00000404L, 0x00010404L, 0x01000000L, 0x00010000L, 0x01010404L, 0x00000004L, 0x01010000L, 0x01010400L, 0x01000000L, 0x01000000L, 0x00000400L, 0x01010004L, 0x00010000L, 0x00010400L, 0x01000004L, 0x00000400L, 0x00000004L, 0x01000404L, 0x00010404L, 0x01010404L, 0x00010004L, 0x01010000L, 0x01000404L, 0x01000004L, 0x00000404L, 0x00010404L, 0x01010400L, 0x00000404L, 0x01000400L, 0x01000400L, 0x00000000L, 0x00010004L, 0x00010400L, 0x00000000L, 0x01010004L };

4、模n求逆元算法(简单)

#include

//三元组gcd(a,b) == ax +by == d;

struct gcdstruct

{

int d;

int x;

int y;

};

gcdstruct EXTENDED_EUCLID(int a,int b)

{

gcdstruct aa,bb;

if(b==0){

aa.d = a;

aa.x = 1;

aa.y = 0;

return aa;

}

else {

bb = EXTENDED_EUCLID(b,a%b);

aa.d = bb.d;

aa.x = bb.y;

aa.y = bb.x - bb.y * (a/b);

}

return aa;

}

long inverse(long a,long m)

{

long x;

gcdstruct aa;

aa = EXTENDED_EUCLID(a,m);

return aa.x;

}

int main()

{

int a,m;

a = 3;

m = 11;

printf("a = %d,m = %d,x = %d\n",a,m,inverse(a,m));

getchar();

return 0;

}

5、模n的幂乘快速算法(简单)

#include

using namespace std;

//计算a^bmodn

int modexp(int a,int b,int n)

{

int ret=1;

int tmp=a;

while(b)

{ //基数存在

if(b&0x1) ret=ret*tmp%n;

tmp=tmp*tmp%n;

b>>=1;

}

return ret;

}

int main()

{

cout<

return 0;

}

关于密码学的发展和一些常见的加密算法

关于密码学的发展和一些常见的加密算法 1.悠久迷人的密码史话——密码学和密码 前言: 密码学(Cryptology,来源于希腊语kryptos和graphein,即隐藏和书写的意思)这门科学,或者说这门艺术,通常被分为两个部分,密码学(Cryptography)的任务是构建更为隐秘而且有效的密码,或者说加密方式;而与之相对应,密码分析学(Crypanalysis)则是研究已有的加密法的弱点,在没有密钥的情况下将密文还原成为明文。这两种科学相互依靠而不能分割,密码学家(Cryptologist)需要研习密码学来掌握加密方式,以便更好地解密;同样需要了解密码分析学,以判定自己密码的安全性高低。有一句话说的很好:“密码是两个天才的较量,败者将耗尽智慧而死。” 密码学产生的根本原因在于人们想要传递一些只有我们允许的接受者才能接受并理解的信息。被隐藏的真实信息称为明文(Plaintext),明文通过加密法(Cipher)变为密文(Ciphertext),这个过程被称为加密(Encryption),通过一个密钥(Key)控制。密文在阅读时需要解密(Decryption),同样需要密钥,这个过程由密码员(Cryptographer)完成。但是密码的传递并非绝对安全,可能有未得到允许的人员得到密文,并且凭借他们的耐心和智慧(我们通常假定他们有足够的时间和智慧),在没有密钥的情况下得到明文,这种方法称为破解(Break)。通常使用的加密方法有编码法(Code)和加密法(Cipher),编码法是指用字,短语和数字来替代明文,生成的密文称为码文(Codetext),编码法不需要密钥或是算法,但是需要一个编码簿(Codebook),编码簿内是所有明文与密文的对照表;而加密法则是使用算法和密钥。另外一种较常用的方法是夹带加密法(Steganography),顾名思义,它是将密文以隐藏的方式传递的,比如图画或是其它消息中,或是使用隐形墨水,在计算机能够进行图象和其它信息的处理之后,这种方法更是有了极大的发展空间。 密码的历史十分悠久。大约在4000年以前,在古埃及的尼罗河畔,一位擅长书写者在贵族的基碑上书写铭文时有意用加以变形的象形文字而不是普通的象形文字来写铭文,从而揭开了有文字记载的密码史。 公元前5世纪,古斯巴达人使用了一种叫做“天书”的器械,这是人类历史上最早使用的密码器械。“天书”是一根用草纸条、皮条或羊皮纸条紧紧缠绕的木棍。密信自上而下写在羊皮纸条上。然后把羊皮纸条解开送出。这些不连接的文字毫无意义,除非把羊皮纸条重新缠在一根直径和原木棍相同的木棍上,这样字就一圈圈跳出来,形成那封信。 公元前4世纪前后,希腊著名作家艾奈阿斯在其著作《城市防卫论》中就曾提到一种被称为“艾奈阿斯绳结”的密码。它的作法是从绳子的一端开始,每隔一段距离打一个绳结,而绳结之间距离不等,不同的距离表达不同的字母。按此规定把绳子上所有绳结的距离按顺序记录下来,并换成字母,就可理解它所传递的信息。 古罗马时代曾使用过一种“代替式密码”,把信中每个文字的字母都用字母顺序表中相隔两位后的一个字母取代,这种代替式密码直到第二次大战时还被日本海军使用。 此外,在古代还出现过一种被称为“叠痕法”的密码,使用时先把信纸折叠几下(上下及左右),然后铺平信纸,将传递的信息按顺序一个个分开,写在折

密码学对称加密算法

对称加密算法 一、网络安全 1.网络安全 (1) 网络的安全问题:有以下四个方面 A. 端-端的安全问题,主要指用户(包括代理)之间的加密、鉴别和数据完整性维护。 B. 端系统的安全问题,主要涉及防火墙技术 C. 安全服务质量问题,主要指如何保护合法用户的带宽,防止用户非法占用带宽。 D. 安全的网络基础设施,主要涉及路由器、DNS服务器,以及网络控制信息和管理信息的安全问题。 (2)网络的安全服务:有以下五个方面 A.身份认证:这是考虑到在网络的应用环境下,验证身份的双方一般是通过网络而非直接交互,所以传统的验证手段如根据对方的指纹等方法就无法应用。同时大量的黑客随时都可能尝试向网络渗透,截获合法用户的口令并冒充顶替,以合法身份入网。所以应该提供一种安全可靠的身份认证的手段。 B.授权控制:授权控制是控制不同用户对信息资源的访问权限。授权控制是以身份认证为基础的。通过给不同用户的提供严格的不同层次和不同程度的权限,同时结合可靠的身份认机制,可以从很大程度上减少非法入侵事件发生的机会。 C.数据加密:数据加密技术顾名思义。在互联网上应用加密技术来保证信息交换的可靠性已经的到了人们普遍的认可,已经进入了应用阶段。目前的加密技术主要有两大类:一类是基于对称密钥加密的算法,另一类是基于非对称密钥加密的算法。它们都已经达到了一个很高的强度,同时加密算法在理论上也已经相当的成熟,形成了一门独立的学科。而从应用方式上,一般分成软件加密和硬件加密。前者成本低而且实用灵活,更换也方便;而后者加密效率高,本身安全性高。在应用中,可以根据不同的需要来进行选择。 D.数据完整性:数据完整性是指通过网上传输的数据应该防止被修改、删除、插入、替换或重发,以保证合法用户接收和使用该数据的真实性。 E.防止否认:在网上传输数据时,网络应提供两种防止否认的机制:一是防止发送方否认自己发送过的信息,而谎称对方收到的信息是别人冒名或篡改过的;二是防止接收方否认自己收到过信息。利用非对称加密技术可以很好的实现第一个否认机制。 二、加密技术 (1) 加密技术的产生和发展 A. 古代,目前记录的比较早的是一个在公元前2世纪,由一个希腊人提出来的,26个字母放在一个5×5的表格里,这样所有的源文都可以行列号来表示。 B. 近代,在第二次世界大战里,密码机(如紫罗兰)得到了比较广泛的已经技术,同时破译密码的技术也得到了发展,出现了一次性密码技术。同时密码技术也促进了计算机的发展。 C. 现代,由于计算机和计算机网络的出现,对密码技术提出了更高的需求。密码学的论文和会议不断的增加,以密码技术为主的商业公司开始出现,密码算法层出不穷,并开始走向国际标准化的道路,出现了DES,AES等国家(美国的)标准。同时各个国家和政府对密码技术也越来越重视,都加密技术的出口和进口都作了相当严格的规定。 (2) 加密技术的分类 A.对称加密技术 a. 描述 对称算法(symmetric algorithm),有时又叫传统密码算法,就是加密密钥能够从解密密钥中推算出来,同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中,加密密钥和解密密钥是相同的。所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信性

密码学简答题及计算题

简答题及计算题 1.RSA 算法中n =11413,e =7467,密文是5859,利用分解11413=101×113,求明文。 解:10111311413n p q =?=?= ()(1)(1)(1001)(1131)11088n p q ?=--=--= 显然,公钥e=7467,满足1<e <()n ?,且满足gcd(,())1e n ?=,通过公式1mod11088d e ?≡求出1mod ()3d e n ?-≡=, 由解密算法mod d m c n ≡得3mod 5859mod114131415d m c n ≡== 2.用C 语言编写欧几里德算法的程序。 #include unsigned int Gcd( unsigned int M, unsigned int N ) { unsigned int Rem; while( N > 0 ) { Rem = M % N; M = N; N = Rem; } return M; } void main() { int temp; int a,b; scanf("%d",&a); scanf("%d",&b); printf("the greatest common factor of %d and %d is ",a,b); printf("%d\n",Gcd(a,b)); } 3.用欧几里德算法计算gcd (1024,888)。 1024=888*1+136 gcd (888,136) 888=136*6+72 gcd (136,72) 136=72*1+64 gcd (72,64) 72=64*1+8 gcd (64,8) 64=8*8+0 gcd (8,0) gcd (1024,888)=8

密码学试题

选择题 1、如果发送方用私钥加密消息,则可以实现() A、保密性 B、保密与鉴别 C、保密而非鉴别 D、鉴别 2、在混合加密方式下,真正用来加解密通信过程中所传输数据(明文)的密钥是() A、非对称算法的公钥 B、对称算法的密钥 C、非对称算法的私钥 D、CA中心的公钥 3、以下关于加密说法,不正确的是() A、加密包括对称加密和非对称加密两种 B、信息隐蔽是加密的一种方法 C、如果没有信息加密的密钥,只要知道加密程序的细节就可以对信息进行解密 D、密钥的位数越多,信息的安全性就越高 4、以下关于混合加密方式说法不正确的是:() A、采用公开密钥体制进行通信过程中的加解密处理 B、采用公开密钥体制对对称密钥体制的密钥进行加密后的通信 C、采用对称密钥体制对对称密钥体制的密钥进行加密后的通信 D、采用混合加密方式,利用了对称密钥体制的密钥容易管理和非对称密钥体制的加解密处理速度快的双重优点 5、两个不同的消息摘要具有相同的值时,称为() A、攻击 B、冲突 C、散列 D、都不是

6、()用于验证消息完整性。 A、消息摘要 B、加密算法 C、数字信封 D、都不是 7、HASH函数可应用于()。 A、数字签名 B、生成程序或文档的“数字指纹” C、安全存储口令 D、数据的抗抵赖性 8、数字证书采用公钥体制,每个用户设定一把公钥,由本人公开,用它进行: A、加密和验证签名 B、解密和签名 C、加密 D、解密 9、数字签名为保证其不可更改性,双方约定使用() A、HASH算法 B、RSA算法 C、CAP算法 D、ACR算法 10、1是网络通信中标志通信各方身份信息的一系列数据,提供一种在Internet上验证身份的方式 A、数字认证 B、数字证书 C、电子证书 D、电子认证 11、以下关于CA认证中心说法正确的是

密码学课程设计

中国矿业大学 密码学课程设计报告 院系: 计算机学院 专业: 信息安全 班级: 信安08-3班 姓名: 许多 学号: 08083701 指导老师: 汪楚娇 2011年6月 1绪论 密码技术是一门古老而十分有用的技术,随着计算机通信技术的迅猛发展,大量的敏感信息通过公共设施或计算机网络进行交换。特别是Internet的广泛应用、电子商务和电子政务的迅速发展,越来越多的信息需要严格的保密,如:银行账号、个人隐私等。正是这种对信息的机密性和真实性的需求,密码学才逐成为比较热门的学科。 近几年来,信息安全成为全社会的需求,信息安全保障成为国际社会关注的焦点。而密码学是信息安全的核心,应用密码学技术是实现安全系统的核心技术。应用密码学研究如何实现信息的机密性、完整性和不可否认性。随着信息系统及网络系统的爆炸性增长,形形色色的安全

威胁严重阻碍了当前的信息化进程,因此,亟待使用密码学来增强系统的安全性。而密码学课程设计正是为这方面做出了具体的实践。 经过前一段时间的学习,我们对于密码学这门课程有了更深的认识和了解,对于一般的密码学算法学会了怎么样使用。因此,通过密码学课程设计这么课程,对前一段的学习进行了检查。在设计中,我们选择做了古典密码算法,分组密码算法DES,公钥密码算法RSA。这几种经典的密码算法是我们学习密码学课程设计所必须掌握的,也是学习信息安全的基础。在接下来的部分,我将详细介绍我设计的过程以及思路。 2 古典密码算法 2.1 古典密码Hill 2.11 古典密码Hill概述 Hill体制是1929年由Lester S.Hill发明的,它实际上就是利用了我们熟知的线性变换方法,是在Z26上进行的。Hill体制的基本思想是将n个明文字母通过线性变换转化为n个密文字母,解密时只需要做一次逆变换即可,密钥就是变换矩阵。

现代密码学 课后答案 第二版

现代密码学教程第二版 谷利泽郑世慧杨义先 欢迎私信指正,共同奉献 第一章 1.判断题 2.选择题 3.填空题 1.信息安全的主要目标是指机密性、完整性、可用性、认证性和不可否认性。 2.经典的信息安全三要素--机密性,完整性和可用性,是信息安全的核心原则。

3.根据对信息流造成的影响,可以把攻击分为5类中断、截取、篡改、伪造和重放,进一 步可概括为两类主动攻击和被动攻击。 4.1949年,香农发表《保密系统的通信理论》,为密码系统建立了理论基础,从此密码学 成为了一门学科。 5.密码学的发展大致经历了两个阶段:传统密码学和现代密码学。 6.1976年,W.Diffie和M.Hellman在《密码学的新方向》一文中提出了公开密钥密码的 思想,从而开创了现代密码学的新领域。 7.密码学的发展过程中,两个质的飞跃分别指 1949年香农发表的《保密系统的通信理 论》和 1978年,Rivest,Shamir和Adleman提出RSA公钥密码体制。 8.密码法规是社会信息化密码管理的依据。 第二章 1.判断题 答案×√×√√√√××

2.选择题 答案:DCAAC ADA

3.填空题 1.密码学是研究信息寄信息系统安全的科学,密码学又分为密码编码学和密码分 析学。 2.8、一个保密系统一般是明文、密文、密钥、加密算法、解密算法 5部分组成的。 3.9、密码体制是指实现加密和解密功能的密码方案,从使用密钥策略上,可分为对称和 非对称。 4.10、对称密码体制又称为秘密密钥密码体制,它包括分组密码和序列 密码。

第三章5.判断 6.选择题

密码学算法

BF算法: #include #include int BFMatch(char *s,char *p) { int i,j; i=0; while(i #include #include #define LEN 256

int BMMatcher(char *s, char *p, int index, int position[]) { int len = strlen(s); int i,j, nextindex; i = strlen(p)-1; for(; i>=0; i--, j--) { if(s[j] != p[i]) break; } if(i<0) return 0; else if(position[s[j]]>0) nextindex = index + i - position[s[j]]; else nextindex = index + 1; if(nextindex > LEN-strlen(p)) return -1; else return nextindex; } int main() { int position[LEN]={0}; char *src="ababcababa"; char *patten="ababa"; int i, nextindex, index=-2, pos=0; for(i=0; i

《现代密码学》习题答案 北邮版

《现代密码学习题》答案 第一章 1、1949年,( A )发表题为《保密系统的通信理论》的文章,为密码系统建立了理论基础,从此密码学成了一门科学。 A、Shannon B、Diffie C、Hellman D、Shamir 2、一个密码系统至少由明文、密文、加密算法、解密算法和密钥5部分组成,而其安全性是由( D)决定的。 A、加密算法 B、解密算法 C、加解密算法 D、密钥 3、计算和估计出破译密码系统的计算量下限,利用已有的最好方法破译它的所需要的代价超出了破译者的破译能力(如时间、空间、资金等资源),那么该密码系统的安全性是( B )。 A无条件安全B计算安全C可证明安全D实际安全 4、根据密码分析者所掌握的分析资料的不通,密码分析一般可分为4类:唯密文攻击、已知明文攻击、选择明文攻击、选择密文攻击,其中破译难度最大的是( D )。 A、唯密文攻击 B、已知明文攻击 C、选择明文攻击 D、选择密文攻击 5、1976年,W.Diffie和M.Hellman在密码学的新方向一文中提出了公开密钥密码的思想,从而开创了现代密码学的新领域。 6、密码学的发展过程中,两个质的飞跃分别指 1949年香农发表的保密系统的通信理论和公钥密码思想。 7、密码学是研究信息寄信息系统安全的科学,密码学又分为密码编码学和密码分析学。 8、一个保密系统一般是明文、密文、密钥、加密算法、解密算法 5部分组成的。 9、密码体制是指实现加密和解密功能的密码方案,从使用密钥策略上,可分为对称和非对称。 10、对称密码体制又称为秘密密钥密码体制,它包括分组密码和序列密码。 第二章 1、字母频率分析法对(B )算法最有效。 A、置换密码 B、单表代换密码 C、多表代换密码 D、序列密码 2、(D)算法抵抗频率分析攻击能力最强,而对已知明文攻击最弱。 A仿射密码B维吉利亚密码C轮转密码D希尔密码 3、重合指数法对(C)算法的破解最有效。 A置换密码B单表代换密码C多表代换密码D序列密码 4、维吉利亚密码是古典密码体制比较有代表性的一种密码,其密码体制采用的是(C )。 A置换密码B单表代换密码C多表代换密码D序列密码

密码学算法整理

密级: 拟制人:谢大平审核人: 批准人: 日期:2012/9/13

目录 密码学算法整理.......................................................................... 错误!未定义书签。 1.撰写目的 (4) 2.预期读者 (4) 3.参考文献 (4) 4.密码学本质 (4) 5.加密技术的应用 (5) 6.密码 (5) 6.1古典密码学 (5) 6.2现代密码学 (7) 6.2.1对称加密 (8) 6.2.1.1 流密码 (8) 6.2.1.2 分组密码 (10) 6.2.2非对称加密 (18) 7.密钥 (18) 7.1认证 (18) 7.2交换 (18) 7.3弱密钥 (19) 7.4密钥共享 (19) 8.加密哈希函数 (19) 9.密码分析学 (20) 图表目录 图表 1..........................................................................................错误!未定义书签。图表 2..........................................................................................错误!未定义书签。 表格目录 表格 1..........................................................................................错误!未定义书签。表格 2..........................................................................................错误!未定义书签。表格 3..........................................................................................错误!未定义书签。

(完整word版)密码学

第一章 1.现代密码学技术仅用于实现信息通信保密的功能× 2.密码技术是一种古老的技术,所以,密码学发展史早于信息安全发展史× 3.密码学是保障信息安全的核心技术,信息安全是密码学研究与发展的目的√ 4.密码学是对信息安全各方面的研究,能够解决所有信息安全的问题× 5.从密码学的发展史可以看出,整个密码学的发展史符合历史发展的规律和人类对客观事物的认识规律√ 6.信息隐藏技术其实也是一种信息保密技术√ 7.传统密码系统本质上均属于对称密码学范畴× 8.早期密码的研究基本上是秘密的进行的,而密码学的真正蓬勃发展和广泛应用源于计算机网络的普及和发展√ 9.1976年后,美国数据加密标准(DES)的公布使密码学的研究公开,从而开创了现代密码学的新纪元,是密码学发展史上的一次质的飞跃× 10.密码标准化工程是一项长期的艰巨的基础性工作,也是衡量国家商用密码发展水平的重要标志√ 11、1949年,(A、Shannon)发表题为《保密系统的通信理论》的文章,为密码系统建立了理论基础,从此密码学成了一门科学。 12.在公钥密码思想提出约一年后1978年,美国麻省理工学院的rivest、(shamir)和adleman 提出RSA的公钥密码体制 13.1976年,W.Diffie和M.Hellman在密码学的新方向一文中提出了公开密钥密码的思想,从而开创了现代密码学的新领域 14.信息安全的主要目标是指机密性、安全性、认证性和不可抵赖性,可用性 15.经典的信息安全三要素——机密性、完整性和可用性,是信息安全的核心原则 16.根据对信息流造成的影响,可以把攻击分为五类:中断,截取,篡改,伪造和重放,进一步概括为两类:主动攻击和被动攻击 17.1949年,香农发表题为保密系统的通信原理为密码系统建立了理论基础从此密码学成了一门科学 18.密码学的发展大致经历了两个阶段:以手工为主的古代密码和以机械为工具近代密码 第二章 判断 1,根据商农的理论,在加密明文之前,利用压缩技术压缩明文,这增加攻击者破译的难度。(√) 2,从理论上讲,穷举攻击可以破解任何密码系统,包括“一次一密”密码系统。(×) 3,设计密码系统的目标就是使其达到保密性。(√) 4,任何一个密码体制都可以通过迭代来提高其安全强度。(×) 5,按照现代密码体制的原则,密码分析者如果能够找到秘密密匙,那么,他就能够利用密文恢复出其明文。(√) 6,现代密码系统的安全性不应取决于不易改变的算法,而应取决于可随时改变的密匙。(×)选择 1,一个密码系统至少由明文,密文,加密算法和解密算法,密匙五部分组成,而其安全性是由密匙决定的。

《现代密码学》习题答案北邮版

《现代密码学》习题答案北邮版 《现代密码学习题》答案 第一章 1、1949年,( A )发表题为《保密系统的通信理论》的文章,为密码系统建立了理论基础,从此密码学成了一门科学。 A、Shannon B、Diffie C、Hellman D、Shamir 2、一个密码系统至少由明文、密文、加密算法、解密算法和密钥5部分组成,而其安全性是由( D)决定的。 A、加密算法B、解密算法C、加解密算法 D、密钥 3、计算和估计出破译密码系统的计算量下限,利用已有的最好方法破译它的所需要的代价超出了破译者的破译能力(如时间、空间、资金等资源),那么该密码系统的安全性是( B )。 A无条件安全B计算安全C可证明安全D实际安全 4、根据密码分析者所掌握的分析资料的不通,密码分析一般可分为4类:唯密文攻击、已知明文攻击、选择明文攻击、选择密文攻击,其中破译难度最大的是( D )。 A、唯密文攻击 B、已知明文攻击 C、选择明文攻击 D、选择密文攻击 、1976年,W.Diffie和M.Hellman在密码学的新方向一文中提出了公开密钥密码的思想,从而开5 创了现代密码学的新领域。 6、密码学的发展过程中,两个质的飞跃分别指 1949年香农发表的保密系统的通信理论和公钥密码思想。

7、密码学是研究信息寄信息系统安全的科学,密码学又分为密码编码学和密码分析学。 8、一个保密系统一般是明文、密文、密钥、加密算法、解密算法 5部分组成的。 9、密码体制是指实现加密和解密功能的密码方案,从使用密钥策略上,可分为和对称非对称。 10、对称密码体制又称为秘密密钥密码体制,它包括分组密码和序列密码。 第二章 1、字母频率分析法对(B )算法最有效。 A、置换密码 B、单表代换密码 C、多表代换密码 D、序列密码 2、(D)算法抵抗频率分析攻击能力最强,而对已知明文攻击最弱。 A仿射密码B维吉利亚密码C轮转密码D希尔密码 3、重合指数法对(C)算法的破解最有效。 A置换密码B单表代换密码C多表代换密码D序列密码 4、维吉利亚密码是古典密码体制比较有代表性的一种密码,其密码体制采用的是(C )。 1 A置换密码B单表代换密码C多表代换密码D序列密码 5、在1949年香农发表《保密系统的通信理论》之前,密码学算法主要通过字符间的简单置换和代换实现,一般认为密码体制属于传统密码学范畴。 6、传统密码体制主要有两种,分别是指置换密码和代换密码。 7、置换密码又叫换位密码,最常见的置换密码有列置换和周期转置换密码。 8、代换是传统密码体制中最基本的处理技巧,按照一个明文字母是否总是被一个固定的字母代替进行划分,代 换密码主要分为两类: 单表代换和多表代换密码。

密码学论文

信息技术安全——密码学 摘要随着网络已经逐步进入我们的生活,网络安全也随之倍受人们的关注,而在网络 安全中起着举足轻重作用的正是密码学,文中简单的介绍有关密码学的发展,较为详细的对密码学中极为经典的算法DES和RSA进行解释,通过对这两个算法的理解,来认识当今密码学发展的前沿和动向。 关键词密码学,非对称加密算法,对称加密算法,数字签名, Abstract the security of webnet has been paid more attention When Internet has been involving into our life .The cryptography play a important role in the security of webnet .In this article I will discuss the development of the cryptography and I will thorough interpret these two algorithm about DES and RSA. We will recognize the forward position and tendency about cryptography though understand those two algorithm. Key words Cryptography , No-symmetric encryption algorithm , symmetric encryption algorithm, the digital signature 密码学的发展历程 随着信息化和数字化社会的发展,人们对信息安全和保密的重要性认识不断提高,而在信息安全中起着举足轻重作用的密码学也就成为信息安全课程中不可或缺的重要部分,密码学早在公元前400多年就已经产生,正如《破译者》一书中所说的“人类使用密码的历史几乎与使用文字的时间一样长”。密码学(Cryptograph)一词来源于古希腊语Kruptos(hidden)+ graphein(to write)准确的现代术语是“密码编制学”简称“编密学”,与之相对的专门研究如何破解密码的学问称之为“密码分析学”。密码学则包括密码编制学和密码分析学这两个相互独立又相互依存的分支。从其发展来看,可分为古典密码——以字符为基本加密单元的密码,以及现代密码——以信息块为基本加密单元的密码。第一次世界大战前,重要的密码学进展很少出现在公开文献中,但该领域却和其它专业学科一样向前发展.直到1918年,二十世纪最有影响的密码分析文章之William F. Friedman的专题论文《重合指数及其在密码学中的应用》作为私立的“河岸(Riverbank)实验室”的一份研究报告问世。1949年到1967年,密码学文献近乎空白。在1967年,一部与众不同的著作--David Kahn 的《破译者》出现,它没有任何新的技术思想,但却对以往的密码学历史作了相当完整的记述,包括提及政府仍然认为是秘密的一些事情。《破译者》的意义不仅在于它涉及到的相当广泛的领域,而且在于它使成千上万原本不知道密码学的人了解密码学。新的密码学文章慢慢地开始源源不断地被编写出来了。到了第二次世界大战时多表密码编制达到了顶点也达到了终点。英国获知了“谜”型机的原理,启用了数理逻辑天才、现代计算机设计思想的创始人,年仅26岁的Alan Turing。1939年8月,在Turing领导下完成了一部针对“谜”型机的密码破译机,每秒钟可处理2000个字符,人们给它起了个绰号叫“炸弹(Bomb)”。半年后,它几乎可以破译截获德国的所有情报。后来又研制出一种每秒钟可处理5000个字符的“巨人(Colossus)”型密码破译机,1943年投入使用。至此,同盟国几乎掌握了希特勒德国的绝大多数军事秘

密码学-实验一 古典密码算法

实验一古典密码算法 1、目的 使学生认识理解古典密码算法:凯撒密码算法,维吉尼亚密码算法。 2、环境 PC 1 台、安装软件VC60、JBuilder8、Delphi7。 3、预备知识 1.凯撒密码的过程: 表1:字母编码表

的原始字母位移加密法(shift cipher):模数计算。E k(x)=(x+k)mod 26,D k(y)=(y –k)mod 26 如:k=5;“hello world”加密为:mjqqt…. 2.维吉尼来密码 维吉尼来方阵:(不区分大小写)

数学表达式: =+ C i P i K i []([][])%26;验证:V[0,0]=0;V[25,25]=24 V[13,12]=25 解密: =- P i C i K i []([][])%26;

如:k=”BEST”;“HELLO WORLD”加密为:IIDE…. 4字符一组: hell OWOR LD BEST BEST BEST 以第一行字母为列标,2行为行标(B,H)=I; 解密: IIDE BEST, 明文字母是B行字母为I 的列号H,或B列=I的行H。 4、方法和步骤

(1)请根据算法的描述和你对算法过程的理解,选用一种编程语言C,C++,Java,Pascal来实现凯撒算法,照实验报告之要求;将解密,将密文为结果写于实验报告上。 (2)请根据算法的描述和你对算法过程的理解,选用一种编程语言C,C++,Java,Pascal来实现维吉尼亚算法,照实验报告之要求;将解密,,将密文为结果写于实验报告上.附参考

源程序:Vigenere.cpp.pdf 5、注意 算法要实现加密过程和解密过程并对正确性设计验证途径。

密码学实验1古典密码算法

密码学实验1古典密码算法 一(实验原理 古典密码算法历史上曾被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要应用对象是文字信息,利用密码算法实现文字信息的加密和解密。下面介绍两种常见的具有代表性的古典密码算法,以帮助读者对密码算法建立一个初步的印象。 1( 替代密码 替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。例如:明文字母 a、b、c、d ,用 D、E、F、G做对应替换后形成密文。 替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。下面我们介绍一种典型的单表替代密码,恺撒(caesar)密码,又叫循环移位密码。它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第 k个字母替代。它的加密过程可以表示为下面的函数: E(m)=(m+k) mod n 其中:m 为明文字母在字母表中的位置数;n 为字母表中的字母个数;k 为密钥;E(m)为密文字母在字母表中对应的位置数。例如,对于明文字母 H,其在字母表中的位置数为 8,设 k=4,则按照上式计算出来的密文为 L: E(8) = (m+k) mod n = (8+4) mod 26 = 12 = L 2( 置换密码 置换密码算法的原理是不改变明文字符,只将字符在明文中的排列顺序改变,从而实现明文信息的加密。置换密码有时又称为换位密码。

矩阵换位法是实现置换密码的一种常用方法。它将明文中的字母按照给的顺序安排在一个矩阵中,然后用根据密钥提供的顺序重新组合矩阵中字母,从而形成密文。例如,明文为 attack begins at five,密钥为 cipher,将明文按照每行 6 列的形式排在矩阵中,形成如下形式: a t t a c k b e g i n s a t f i v e 根据密钥 cipher中各字母在字母表中出现的先后顺序,给定一个置换: 1 2 3 4 5 6 f = 1 4 5 3 2 6 3 列,根据上面的置换,将原有矩阵中的字母按照第 1 列,第 4 列,第 5 列,第第 2列,第 6 列的顺序排列,则有下面形式: a a c t t k b i n g e s a I v f t e 从而得到密文:abatgftetcnvaiikse 其解密的过程是根据密钥的字母数作为列数,将密文按照列、行的顺序写出,再根据由密钥给出的矩阵置换产生新的矩阵,从而恢复明文。二(实验目的通过编程实现替代密码算法和置换密码算法,加深对古典密码体制的了解,为深入学习密码学奠定基础。 三(实验环境 运行 windows 或 linux 操作系统的 PC 机,具有 gcc(linux)、VC(windows)等 C语言编译环境。

密码学实验(RSA完整算法)

密码学实验 ——RSA算法实现 姓名: 班级: 学号: 教师: 助教:

一.程序功能函数定义 ①p ublic static String toHexString(byte[] b) ——格式转换函数 ②p ublic KeyPair generateKey() throws NoSuchAlgorithmException ——密钥对生成函数 ③p rotected byte[] PKCS1Ecryption(RSAPublicKey publicKey, String Data) ——PKCS1机制下RSA加密函数 ④p rotectedbyte[] PKCS1DeEcryption (RSAPrivateKey privateKey, byte[] raw) ——PKCS1机制下RSA解密密函数 ⑤p rotected byte[] OAEPEcryption(RSAPublicKey publicKey, String Data) ——OAEP机制下RSA加密函数 ⑥p rotectedbyte[] OAEPDeEcryption (RSAPrivateKey privateKey, byte[] raw) ——OAEP机制下RSA解密密函数 ⑦p ublic static void main(String[] args) ——主函数(Main)

二.程序功能函数说明(含返回、参数)《1》public KeyPair generateKey() throws NoSuchAlgorithmException A.入口参数:无 B.返回类型:KeyPair类(JAVA库类)——密钥对 C.函数功能:利用系统随机源(且这里指定密钥长度为 512bit)与指定的算法类(RSA)构造一对密钥对《2》protected byte[] PKCS1Ecryption(RSAPublicKey publicKey, String Data) A.入口参数:RSA公钥类publickey和字符串类data B.返回类型:字节数组类——密文形式 C.函数功能:能将原明文首先转化成字节数组形式,并 且利用加密库Cipher与Security指定PKCS1机制下的 RSA加密算法对明文加密并且以字节数组的形式返回 加密后得到的密文 《3》protected byte[] OAEPEcryption(RSAPublicKey publicKey, String Data) A.入口参数:RSA公钥类publickey和字符串类data B.返回类型:字节数组类——密文形式 C.函数功能:能将原明文首先转化成字节数组形式,并 且利用加密库Cipher与Security指定OAEP机制下的 RSA加密算法对明文加密并且以字节数组的形式返回

密码学中的算法问题及矩阵分析

密码学中的算法问题及矩阵分析 【摘要】本文关于密码学之中关于密码的破译,矩阵所起到的决定性的作用,来反映mod算法以及逆矩阵的运用。针对希尔密码以及维吉尼亚密码进行解剖分析,从而得出在密码的破译之中,mod26伴随着逆矩阵共同分解,能够更快更高效地破解密码。 【关键词】mod26 逆矩阵希尔密码维吉尼亚密码 一、利用mod算法进行密码分析

14 98 210 210 56 182 210 252 126 196 98 7 19 105 105 28 91 105 126 63 98 49 我们可以看到,希尔密码是将数列排好,依次相乘。得出的横列亦或者数列便是明文。若当我们用普通的算法进行解析的话,估计要算得十分庞大,也抑或寻找不到其中的规律,如果用Mod 算法则容易得多。这是使用正矩阵的,而逆矩阵的使用算法则更加容易。 假设密文为“FOAOESWO” FO AO ES WO 6 1 5 23 15 15 19 15 37678390115135--??????=????????????,783mod 2623W -==,135mod 265E == 所以密文“FOAOESWO”的明文为“WEREDONE” 由此我们可见mod 算法与逆矩阵的效用,接下来是第二个密码的分析。 2.【维吉尼亚密码】 频率的分析可以很好地打破密码的禁锢,然而,维吉利亚密码将密钥与矩阵相结合,创造出了新的密码,从中进行剖析。 加密算法:例如密钥的字母为[d],明文对应的字母[b]。根据字母表的顺序 [d]=4,[b]=2,那么密文就是[d]+[b]-1=4+2-1=5=[e],因此加密的结果为[e]。解密即做此逆运算。 加密公式:密文 = (明文 + 密钥) Mod 26 - 1 解密公式:明文 = [26 + (密文 - 密钥)] Mod 26 + 1 假如对如下明文加密:

密码学算法选题

密码学算法 1、 单表加法密码(简单) 1.(1)写出单表古典密码的加法加密运算的算法 设X=Y=Z q ,K=Z q 。对任意m ∈X ,k ∈K ,密文q k m m mod )(c K k +==)(,加法密码的密钥量为q 。 Step1:确定k 和q 的值; Step2:输入相应的密文; Step3:作变换 c=(m+k) mod q ,字母用ASCII 码变为数字后计算; Step4:得到相对应的明文; Step5:逐一输出明文; (2)单表古典密码的加法加密运算的程序设计如下: #include void main() { int jiami(int q,int k,int i); char m[100],c[100]; int i,j,q,k; cout<<"输入模q :"; cin>>q; cout<<"输入密钥k :"; cin>>k; cout<<"输入"<>m[i]; for(i=0;i

2. 输入模q(=12)及加密密钥k(=5)对下列明文进行加法加密和乘法加密: A graph is finite if both its vertex set and edge set are finite. In this book we study only finite graphs, and so the term ‘graph’ always means ‘finite graph’. (注:标点符号及空格也算一个符号,忽略大小) 加法加密后的运行程序: #include void main() { char M[100]; char C[100]; int K=5,q=12,i; printf("please input chars:\n"); gets(M); for(i=0;M[i]!='\0';i++) { if(M[i]>='a'&&M[i]<='z') { C[i]=(M[i]-'a'+K)%q+'a'; } else if(M[i]>='A'&&M[i]<='Z') { C[i]=(M[i]-'A'+K)%q+'A'; } else C[i]=M[i]; } C[i]='\0'; printf("The result is:\n%s\n",C); getchar(); } 运行结果:

密码学实验三—DES算法的实现

实验三用DES实现对数据的加解密 一、实验目的 1. 用DES加密方法实现对明文的加密 2.用DES解密加密后的密文 二、实验内容 1、给定八字节明文,输入8位密钥对明文加密 2、用同一个密钥对加密的密文解密的到原来的明文 三、实验原理 实验步骤(包括流程图、功能模块) 【实验原理】 1、DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则见下表: 58,50,12,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, 2. 将输入的第58位换到第一位,第50位换到第2位,...,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0 是右32位,例:设置换前的输入值为D1D2D3......D64,则经过初始置换后的结果为:L0=D550 (8) R0=D57D49 (7) 经过26次迭代运算后。得到L16、R16,将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置的逆运算,例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位,其逆置换规则如下表所示: 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, 3. DES算法的解密过程是一样的,区别仅仅在於第一次迭代时用子密钥K15,第二次K14、......,最后一次用K0,算法本身并没有变化。 【算法流程图】

相关主题
文本预览
相关文档 最新文档