zoukankan      html  css  js  c++  java
  • RAS加密算法

    信息的加密与去密

    信息加密的简单模型如图所示:

    就是先对数字信息\(x\)做一个变换\(E\),将变换后的信息\(y=E(x)\)发出,接收方收到信息\(y\)后,进行一个相反的变换\(D\)(也就是\(E\)的逆运算),恢复成数字信息\(x=D(y)\),从而识别原始信息。

    通常把数字信息\(x\)叫做明文,加密后得到的数字信息\(y\)叫做密文,变换\(E\)\(D\)分别叫做加密和去密的秘钥。一般来说,秘钥对\({E, D}\)由发送方和接收方约定和保存,不被外人所知。

    例如,凯撒加密法,加密运算\(E(k) = k + 19(mod \ 31)\),去密运算\(D(k) = k+12(mod \ 31)\),这是互逆操作,即\(DE(k) = ED(k)=k\)

    • 这有一个缺点,由于D, E都非常简单,已知一个很容易推出另一个。这相当于已知公钥能推出私钥,显然不能用于公开秘钥体制。
    • 另一个缺点,两两之间需要保存一个秘钥对\({E, D}\),如果是2000人相互通信,每个人都需要存\(C_{2000}^2 = 1 999 0000\)

    RSA加密算法

    1976年,美国斯坦福大学的年轻数学家狄菲(Diffe)和计算机专家(Hellman)提出一种新的加密方法,叫做公开秘钥体制。在这种体制下,信息的加密和去密使用两个不同的秘钥,加密用公钥(公开的,任何人都可以看到),去密用私钥(严格保密)。
    1977年,美国MIT计算机科学实验室的列维斯特(Rivest)等人基于大数分解的复杂性提出了一个方案,就是RSA。

    RSA算法的具体描述如下:
    (1)任意取两个不同的大素数\(p\)\(q\),计算乘积\(n=pq\)\(\varphi (n) = (p-1)(q-1)\)
    (2)任取一个大整数\(e\),使得\(gcd(e, \varphi (n)) = 1\),注意:\(e\)是很容易取的,例如所有大于p和q的素数都可用
    (3)计算出一个正整数\(d\),使得\(ed \equiv 1(mod \ \varphi (n))\),根据拓展欧几里得定理很容易得到
    (4)将\(n, e\)公开,\(d\)保密
    (5)将明文\(x\)加密为密文\(y\),加密算法为 \(y = E(x) = x^e(mod \ n)\)
    (6)将密文\(y\)解密为明文\(x\),解密算法为 \(D(y) = y^d(mod \ n) = x\)

    这里需要证明一下为什么 \(D(y) = y^d(mod \ n) = x\),因为根据欧拉定理
    \(n\)为正整数,\(a\)为任意整数,且\((a, n)=1\),则

    \[a^{\varphi (n)} \equiv 1 (mod \ n) \]

    因此\(D(y) = y^d(mod \ n) = (x^e)^d(mod \ n) = x^{1 + k\varphi (n)}(mod \ n) = x\cdot (x^{\varphi (n)})^k(mod \ n) = x\)

    一个有趣的一点:RSA也是互逆的,即\(ED(x) = DE(x) = x\)
    所以理论上,你可以用私钥加密数据,发送别人别人用公钥解密(这个过程叫签名)。但通常都是别人用公钥加密,你用私钥解密发送过来的数据(这个过程叫加密)。

    那有没有可能已知一个秘钥,推出另一个秘钥?
    比如公钥\({n, e}\)是公开的,想借此推出私钥\({n, d}\)。因为\(ed \equiv 1(mod \ \varphi (n))\),所以需要知道\(\varphi(n)\)。而\(\varphi(n) = (p-1)(q-1)\),因此需要将\(n\)分解成素因式\(pq\),而这是一个复杂性很高的问题。

    数字签名

    利用数字签名做身份认证,证明这条信息来自某某。
    在公开秘钥体制之前,身份认证一直没有很好的解决方案。如今采用公开秘钥体制做身份认证就很简单。
    在A向B发送信息之前,将信息\(x\)(比如写的"我是A"),先用A的私钥加密,得到\(y = E_A (x)\)(数字签名),把\(y\)传送给\(B\)后,\(B\)在公钥本上找到\(A\)的公钥,从而得到\(y\)对应的明文\(x\)。由于别人不知道\(A\)的私钥,没办法伪造相同的信息,所以这个信息一定是来自\(A\)的。

    同时进行签名和加密

    在公开密钥体制下,发送方可以同时对信息进行签名和加密。
    例如甲要向乙发送信息,先用自己的私钥签名,再用对方的公钥加密;接收方先用自己的私钥解密,再用对方的公钥解密,得到明文。

    参考链接:

    1. 高中数学A版选修4-6 初等数论初步.pdf
    2. 百度百科-RSA算法
    个性签名:时间会解决一切
  • 相关阅读:
    使用yeoman搭建脚手架并发布到npm
    Facebook的一些基本操作(网页版)
    Egg中使用egg-mongoose和常用的Mongoose 方法
    Vuex的使用
    跨浏览器的javascript事件的封装
    利用ngnix解决跨域问题
    webpack打包工具
    用vue-cli脚手架搭建一个仿网易云音乐的全家桶vue项目
    mac 解决mysqlclient安装失败问题
    linux之wget
  • 原文地址:https://www.cnblogs.com/lfri/p/15761046.html
Copyright © 2011-2022 走看看