dddddsddasdasd

来源:百度文库 编辑:神马文学网 时间:2024/04/30 06:49:08

1、RSA算法 :

首先, 找出三个数, p, q, r,
其中 p, q 是两个相异的质数, r 是与 (p-1)(q-1) 互质的数
p, q, r 这三个数便是 private key

接著, 找出 m, 使得 rm == 1 mod (p-1)(q-1)
这个 m 一定存在, 因为 r 与 (p-1)(q-1) 互质, 用辗转相除法就可以得到了
再来, 计算 n = pq
m, n 这两个数便是 public key

编码过程是, 若资料为 a, 将其看成是一个大整数, 假设 a < n
如果 a >= n 的话, 就将 a 表成 s 进位 (s <= n, 通常取 s = 2^t),
则每一位数均小於 n, 然後分段编码
接下来, 计算 b == a^m mod n, (0 <= b < n),
b 就是编码後的资料

解码的过程是, 计算 c == b^r mod pq (0 <= c < pq),
於是乎, 解码完毕 等会会证明 c 和 a 其实是相等的   :)

如果第三者进行窃听时, 他会得到几个数: m, n(=pq), b
他如果要解码的话, 必须想办法得到 r
所以, 他必须先对 n 作质因数分解
要防止他分解, 最有效的方法是找两个非常的大质数 p, q,
使第三者作因数分解时发生困难
<定理>
若 p, q 是相异质数, rm == 1 mod (p-1)(q-1),
a 是任意一个正整数, b == a^m mod pq, c == b^r mod pq,
则 c == a mod pq

证明的过程, 会用到费马小定理, 叙述如下:
m 是任一质数, n 是任一整数, 则 n^m == n mod m
(换另一句话说, 如果 n 和 m 互质, 则 n^(m-1) == 1 mod m)
运用一些基本的群论的知识, 就可以很容易地证出费马小定理的

(1)RSA算法表述
  假定用户A欲送消息m给用户B,则RSA算法的加/解密过程为:
  1)首先用户B产生两个大素数p和q(p、q是保密的)。
  2)用户B计算n=pq和φ(n)=(p-1)(q-1)(φ(n)是保密的)。
  3)用户B选择一个随机数e(0  4)用户B通过计算得出d,使得d*e mod φ(n)=1(即在与n互素的数中选取与φ(n)互素的数,可以通过Euclidean算法得出。d是用户B自留且保密的,用作解密密钥)。
  5)用户B将n及e作为公钥公开。
  6)用户A通过公开渠道查到n和e。
  7)对m施行加密变换,即EB(m)=me mod n=c。
  8)用户B收到密文c后,施行解密变换
       DB(c)=cd mod n=(me mod n)d mod n=med mod n=m mod n
  下面举一个简单的例子用于说明这个过程:令26个英文字母对应于0到25的整数,即a-00,b-01,…,y-24,z-25。设,m=inclub,则m的十进制数编码为:m=08 13 02 11 20 01。设n=3×11=33,p=3,q=11, φ(n)=2×10=20。取e=3,则d=7将n=33和e=3公开,保留d=7。
  用户A查到n和e后,将消息m加密:
  EB(i)=083 mod 33= 17,
  EB(n)=133 mod 33= 19,
  EB(c)=023 mod 33= 8,
  EB(l)=113 mod 33= 11,
  EB(u)=203 mod 33= 14,
  EB(b)=013 mod 33= 1,
则 c= EB(m) = 17 19 08 11 14 01,它对应的密文为
  c=rtilob
  当用户B接到密文c后施行解密变换:
  DB(r) = 177 mod 33= 8,即明文i,
  DB(t) = 197 mod 33= 13,即明文n,
  DB(i) = 087 mod 33= 2,即明文c,
  DB(l) = 117 mod 33= 11,即明文l
  DB(o) = 147 mod 33= 20,即明文u,
  DB(b) = 017 mod 33= 1,即明文b。

2,C语言实现

#include
int candp(int a,int b,int c)
{ int r=1;
b=b+1;
while(b!=1)
{
    r=r*a;
    r=r%c;
    b--;
}
printf("%d\n",r);
return r;
}
void main()
{
int p,q,e,d,m,n,t,c,r;
char s;
printf("please input the p,q: ");
scanf("%d%d",&p,&q);
n=p*q;
printf("the n is %3d\n",n);
t=(p-1)*(q-1);
printf("the t is %3d\n",t);
printf("please input the e: ");
scanf("%d",&e);
if(e<1||e>t)
{
     printf("e is error,please input again: ");
     scanf("%d",&e);
}
d=1;
while(((e*d)%t)!=1)   d++;
printf("then caculate out that the d is %d\n",d);
printf("the cipher please input 1\n");
printf("the plain please input 2\n");
scanf("%d",&r);
switch(r)
{
    case 1: printf("input the m: "); /*输入要加密的明文数字*/
            scanf("%d",&m);
            c=candp(m,e,n);
            printf("the cipher is %d\n",c);break;
    case 2: printf("input the c: "); /*输入要解密的密文数字*/
            scanf("%d",&c);
            m=candp(c,d,n);
            printf("the cipher is %d\n",m);break;
}
getch();
}

 

3.“一次一密”密码

一种理想的加密方案,叫做一次一密密码(one-time pad),由Major Joseph Mauborgne和AT&T公司的Gilbert Vernam在1917年发明的。一次一密乱码本是一个大的不重复的真随机密钥字母集,这个密钥字母集被写在几张纸上,并一起粘成一个乱码本。发方用乱码本中的每一密钥字母准确地加密一个明文字符。加密是明文字符和一次一密乱码本密钥字符的模26加法。

每个密钥仅对一个消息使用一次。发方对所发的消息加密,然后销毁乱码本中用过的一页或用过的磁带部分。收方有一个同样的乱码本,并依次使用乱码本上的每个密钥去解密密文的每个字符。收方在解密消息后销毁乱码本中用过的一页或用过的磁带部分。新的消息则用乱码本的新的密钥加密。

例如,如果消息是:ONETIMEPAD,而取自乱码本的密钥序列是TBFRGFARFM ,那么密文就是IPKLPSFHGQ ,

因为

O + T mod26 = I

N + B mod26 = P

E + F mod26 = K

等等。

如果偷窃听者不能得到用来加密消息的一次一密乱码本,这个方案是完全保密的。给出的密文消息相当于同样长度的任何可能的明文消息。

随机密钥序列异或一非随机的明文消息产生一完全随机的密文消息。再大的计算能力也无能为力。

密钥字母必须是随机产生的。对这种方案的攻击将是针对用来产生密钥序列的那种方法。使用伪随机数发生器是不值得考虑的,它们通常具有非随机性。如果采用真随机源,它就是安全的。

另一个重要的事情是密钥序列不能重复使用。

一次一密乱码本的想法很容易推广到二进制数据的加密,只需由二进制数字组成的一次一密乱码本代替由字母组成的一次一密乱码,用异或代替一次一密乱码本的明文字符加法就成。为了解密,用同样的一次一密乱码本对密文异或,其他保持不变,保密性也很完善。

但有几个问题。因为密钥比特必须是随机的,并且绝不能重复使用,密钥序列的长度要等于消息的长度。

即使解决了密钥的分配和存储问题,还需确信发方和收方是完全同步的。如果收方有一比特的偏移(或者一些比特在传送过程中丢失了),消息就变成乱的了。另一方面,如果某些比特在传送中被改变了(没有增减任何比特,更像由于随机噪声引起的),那些改变了的比特就不能正确地解密。再者,一次一密乱码本不提供鉴别。

一次一密乱码本在今天仍有应用场合,主要用于高度机密的低带宽信道。

4.替换加密
  将明文字母表M中的每个字母替换成密文字母表C中的字母。这一类密码包括移位密码、替换密码、仿射密码、乘数密码、多项式代替密码、密钥短语密码等。这种方法可以用来传送任何信息,但安全性不及代码加密。因为每一种语言都有其特定的统计规律,如英文字母中各字母出现的频度相对基本固定,根据这些规律可以很容易地对替换加密进行破解。以下是几种常用的替换加密算法。
  1)移位密码是最简单的一类代替密码,将字母表的字母右移k个位置,并对字母表长度作模运算,其形式为:ek(m)=(k+m)=c mod q,解密变换为:dk(c)=(m-k)=m mod q。凯撒(Caesar)密码是对英文26个字母进行移位代替的密码,其q=26。这种密码之所以称为凯撒密码,是因为凯撒使用过k=3的这种密码。
  2)乘数密码也是一种替换密码,它将每个字母乘以一个密钥k,ek(m)=km mod q,其中k和q是互素的,这样字母表中的字母会产生一个复杂的剩余集合,若是和q不互素,则会有一些明文字母被加密成相同的密文字母,而且不是所有的字母都会出现在密文字母表中。异或运算(XOR)也常用于替换加密,加密:c=m XOR k,解密:m=c XOR k。
  3)多名或同音替换。每个字母可加密或替换成多个密文字母,这种方法是一种一对多的映射关系,可以挫败一般的频度分析攻击。
  3.变位加密
  变位加密不隐藏明文的字符,即明文的字母保持相同,但其顺序被打乱重新排列成另一种不同的格式,由于密文字符与明文字符相同,密文中字母的出现频率与明文中字母的出现频率相同,密码分析者可以很容易地由此进行判别。虽然许多现代密码也使用换位,但由于它对存储要求很大,有时还要求消息为某个特定的长度,因而比较少用。以下介绍几种常见的变位加密算法。
  1)简单变位加密。预先约定好一组数字表示密钥,将文字依次写在密钥下,再按数字次序重新组织文字实现加密,也有人喜欢将明文逆序输出作为密文。例如
    密钥:5 2 4 1 6 3   (密文排列次序)
    明文:信息安全技术
    密文:技息全信术安
  2)列变位法。将明文字符分割成个数固定的分组(如5个一组,5即为密钥!),按一组一行的次序整齐排列,最后不足一组用任意字符填充,完成后按列读取即成密文。如明文是:InformationSecurityTechnology,则分组排列为:
    I n f o r
    m a t i o
    n S e c u
    r i t y T
    e c h n o
    l o g y
则密文是:ImnrelnaSicoftethgoicynyrouTo ,这里的密钥是数字5。解密过程则是按列排列密文,再按行读取即可。
  3)矩阵变位加密。将明文中的字母按给定的顺序安排在一个矩阵中,然后用另一种顺序选出矩阵的字母来产生密文。一般为按列变换次序,如原列次序为1234,现为2413。如将明文Network Security按行排列在3×6矩阵中,如下所示:
    1 2 3 4 5 6
    N e t w o r
    k   S e c u
    r i t y   
给定一个置换: ,根据给定的次序,按5、2、6、4、1、3的列序重新排列,得到:


    5 2 6 4 1 3
    o e r w N t
    c   u e k S
        i   y r t
所以,密文为:oerwNtc uekS i yrt。解密过程正好相反,按序排列密文后,通过列置换再按行读取数据即可。

5,一个简单加密算法例子  

明文 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
序号 1 2 3 4 5 。。。。。。。。。。。。。。。。。。。。26
口令 254136
第一次加密 错位(依口令重排序)
得到:D A F C B E J G L I H K P M R O N Q V S X U T W E Y Z
第二次加密 替代 (产生与明文一样长的密钥)
使口令 254136 变成 6 6 9 7 8 6 11 5 3 10 5 7 5 7 7 7 2 12 7 5 6
依上面的长数与明文一一对应移位替代生成密文
H H T P L N Q  Q L R Q W U B T U W C Z A W F D D F