古典密码,背包密码,RSA

一、古典密码

单表代换密码

1、置换密码

(1)列置换

(2)周期置换

2、代换密码

①加法密码:

用明文字母在字母表中后面第k个字母来代替

  凯撒密码——历史上第一个密码技术

②乘法密码

③密钥词组代替密码

多表代换密码

①Vernam密码

明文、密文、密钥都表示为二进制位

②Playfair密码

用密钥控制生成矩阵,然后每两个字母为单位进行代换

③Hill密码(乘积密码)

建立在矩阵相乘的基础上

二、背包密码

背包问题:超递增背包

如递增序列为1 4 6 13 27 52

首先背包质量与最大元素比较,若背包质量大,则该元素在背包中,用背包质量减去该元素质量,然后再比较下一个,以此类推,如果背包质量小,则直接比较下一个,一次类推

例子:

如背包总重量为70,重量序列为{1,4,6,13,27,52}

最大质量52小于70,因此52在此背包中

下一个重量27大于70-52=18,因此27不在背包中

继续以此类推,直到总重量减少到0或者无法继续减少,则表示已经找到

此处对应的明文是110101

从密钥构造公钥

选择一个超递增序列为密钥{2,3,6,13,27,52}

对每一个值乘以一个数n,对m求余

作为模的数应大于序列中所有数的和

此处设m=107, n与m互素, 取n=29

则背包问题序列为:

2*29 mod 107 = 58

3*29 mod 107 = 87

6*29 mod 107 = 67

······

最终得到的公钥序列为:{58,87,67,56,34,10}

要对一个二进制消息进行教秘,先将其分成长度和背包序列相同的块,1表示在包内,0则表示不在

如消息:011001 100101 000101

公钥:{58,87,67,56,34,10}

011001:87+67+10=164

100101:58+56+10=124

000101:56+10=66

密文为164,124,66

解密

先计算n^-1(乘法逆元)满足n*n^-1 mod m = 1

将密文的每一个值与n^-1相乘模m,然后用私钥来求解

继续用上个例子

m=107, n=29, 私钥{2,3,6,13,27,52}密文为164,124,66

计算出n^-1=48

则密文要与48相乘模107

164*48 mod 107=61=3+6+52 对应011001

124*48 mod 107=67=2+13+52 对应100101

66*48 mod 107=65 = 13+52 对应000101

RSA

需要懂得三部分知识:

互质关系:两个正整数只有1为公因子,没有其他公因子,不是质数的两个数也可以构成互质关系

欧拉公式:φ(n)为比n小但与n互素的正整数个数,称为n的欧拉函数。对任一素数p, 有φ(n)=p-1,而对于两个不同的素数p和q,则对n=pq,可以证明φ(n)=φ(pq)=(p-1)(q-1)=φ(p)*φ(q)

模反元素:求模反元素(逆元),可以用辗转相除法,上面已经有过说明

RSA算法如下:

选择两个素数p和q,n= p*q, φ(n)=(p-1)*(q-1),选择整数e,使gcd(φ(n), e)=1, 1<e<φ(n), 计算逆元d= e^-1 mod φ(n), 得到公钥KU={e, n}, 私钥= {d, n}。

加密:明文M, 密文:C=m^e mod n

解密:密文C, 明文:M=C^d mod n

如A要发送信息9726给B

首先由B生成密钥,假设选择了两个素数p=101和q=113, 计算的n=p*q=101*103=11413, φ(n) =(q-1)*(p-1)=11200, e与 φ(n)没有公因子,选择e为3533, 算得d=e^-1 =3533^-1 mod 11200 = 6597

得到公钥={3533, 11413}, 私钥={6597, 11413}

A得到公钥将明文加密9726^3533 mod 11413 = 5761,此为密文

当B收到密文时,就用私钥进行解密

5761^6597 mod 11413 = 9726得到信息

原文地址:https://www.cnblogs.com/ojkojk/p/13413830.html