加密算法

释放双眼,带上耳机,听听看~!

参考:数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

   加密算法概述

【前言】常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法

一、非对称
加密算法

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密,反之亦然。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方、丙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。这样其他任何人想法送给此用户信息,只需查询词公钥,加密发送即可,而此用户用只有自己知道的秘钥解密,它消除了最终用户交换密钥的需要。

另一方面,甲方可以使用乙方的公钥对机密信息进行签名后再发送给乙方;甲方再用自己的私匙对乙方发送回来的数据进行验签。

非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。

1、基于RSA算法的实现

加密算法

      RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。

       (1) 算法:

          (1)选择两个不同的大素数p和q;

          (2)计算乘积n=pq和Φ(n)=(p-1)(q-1);

          (3)选择大于1小于Φ(n)的随机整数e,使得gcd(e,Φ(n))=1;注:gcd即最大公约数。

          (4)计算d使得d*e=1mod Φ(n);注:即d*e mod Φ(n) =1。

          (5)对每一个密钥k=(n,p,q,d,e),定义加密变换为Ek(x)=xe mod n,解密变换为Dk(x)=yd mod n,这里x,y∈Zn;

          (6)p,q销毁,以{e,n}为公开密钥,{d,n}为私有密钥。

        (2)实例:

          1. 假设p = 3、q = 11(p,q都是素数即可。),则N = pq = 33;

          2. r =Φ(n)= (p-1)(q-1) = (3-1)(11-1) = 20;

          3. 根据gcd(e,Φ(n))=1,即gcd(e,20)=1,令e=3,则,d = 7。(两个数交换一下也可以。)

到这里,公钥和密钥已经确定。公钥为(n, e) = (33, 3),密钥为(n, d) = (33, 7)。

(3)代码:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
1public class SimpleRSA {
2    /**
3     * 加密、解密算法
4     * @param key 公钥或密钥
5     * @param message 数据
6     * @return
7     */
8    public static long rsa(int baseNum, int key, long message){
9        if(baseNum < 1 || key < 1){
10            return 0L;
11        }
12        //加密或者解密之后的数据
13        long rsaMessage = 0L;
14          
15        //加密核心算法
16        rsaMessage = Math.round(Math.pow(message, key)) % baseNum;
17        return rsaMessage;
18    }
19
20    public static void main(String[] args){
21        //基数
22        int baseNum = 3 * 11;
23        //公钥
24        int keyE = 3;
25        //密钥
26        int keyD = 7;
27        //未加密的数据
28        long msg = 24L;
29        //加密后的数据
30        long encodeMsg = rsa(baseNum, keyE, msg);
31        //解密后的数据
32        long decodeMsg = rsa(baseNum, keyD, encodeMsg);
33          
34        System.out.println("加密前:" + msg);
35        System.out.println("加密后:" + encodeMsg);
36        System.out.println("解密后:" + decodeMsg);
37    }
38}
39
40

(4)但是,仅仅这些还不够。假如有A用户用B的公钥向B用户发送了信息“A love you”,B接收到之后怎么确定就是A发送的呢(因为中间人攻击中,假如C截获了A发送的信息后,并且获取了B的私钥,改成“C love you”,B是无法确定这两个信息的发送者,因她们都同样用B的工要加密),于是产生了签名证书技术

        签名证书是由CA用自己的私钥对用户的信息进行加密,并把发给用户的,用户可以在发送信息的过程中附加上自己的签名证书,让接受者验证信息的来源。当接受者接受到发送者的签名证书后即可用ca的公钥解密验证发送者的身份信息。

信息传输过程:

        A. Alice 准备好要传送的数字信息(明文)。

        B. Alice 对数字信息进行哈希(hash)运算,得到一个信息摘要。

        C. Alice 用自己的私钥(SK)对信息摘要进行加密得到Alice 的数字签名,并将其附在数字信息上。

        D. Alice 用Bob 的公钥(PK)对刚才随机产生的加密密钥进行加密,将加密后的密文传送给Bob

        E. Bob 收到Alice 传送过来的密文,用自己的私钥(SK)对密文解密。

        F. Bob 用Alice 的公钥(PK)对Alice 的数字签名进行解密,得到信息摘要。

        G. Bob 用相同的hash 算法对收到的明文再进行一次hash 运算,得到一个新的信息摘要。

        H. Bob 将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。

       采用数字签名,能完成这些功能:

       (1)确认信息是由签名者发送的; 

        (2)确认信息自签名后到收到为止,未被修改过; 

       (3)签名者无法否认信息是由自己发送的。

      ** 但是上述过程存在问题**,例如有用户C窃取A的电脑信息,把B的公钥修改成了自己的公钥,A用此公钥加密信息发给B,C在中间截获这个数据就可以获取这些私密信息。怎么应对这种情况呢?签名证书就派上用场了。

数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)   https://www.daimajiaoliu.com/daima/38579afe4900406

       证书中心用自己的私钥,对每一个用户的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。发送者在接收到对方的CA数字证书之后,再继续发送信息之前如果想核对接受者的公钥,只需用用CA的公钥对B的签名证书进行解密确认即可。确认是否是真的是B返回给我们的数据。

 

给TA打赏
共{{data.count}}人
人已打赏
安全技术安全运维

Windows服务器如何发现被黑

2018-5-20 12:24:31

安全技术

Node.js + MongoDB + AngularJS - 5 在Node.js中处理数据I0-1

2021-12-21 16:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索