zoukankan      html  css  js  c++  java
  • 古典密码,背包密码,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得到信息

  • 相关阅读:
    CF 552(div 3) E Two Teams 线段树,模拟链表
    单词接龙
    书的复制 动规,贪心
    C++文本处理&造轮子
    【NOIP2015】【Luogu2661】信息传递(有向图最小环)
    平时上机练习的注意点(NOIP2018)
    【SHOI2009】【BZOJ2028】会场预约(线段树染色)
    【AHOI2009】【BZOJ1798】Seq 维护序列seq(线段树模板,易错提醒)
    2018 “百度之星”程序设计大赛
    2018 “百度之星”程序设计大赛
  • 原文地址:https://www.cnblogs.com/ojkojk/p/13413830.html
Copyright © 2011-2022 走看看