1、非对称加密过程:
        假如现实世界中存在A和B进行通讯,为了实现在非安全的通讯通道上实现信息的保密性、完整性、可用性(即信息安全的三个性质),A和B约定使用非对称加密通道进行通讯,具体过程如下:
        说明:
        国内目前使用双证书体系,即用户同时拥有签名证书、加密证书两张证书。签名证书是用户的身份认证,是和CA协商的结果,可用于对用户A的身份验证;加密证书是用来对信息进行加密,是用户和秘钥管理系统生成。我们在这里假设都适合CA进行交互。
        ①:此过程是生成公钥私钥的过程,我们这里基于RSA算法实现,RSA算法的详细说明在后面讲解。
        ②:此过程是CA对用户的身份进行签名,目的验证A的身份。这样在A与B通讯的过程中,A可以把自己的数字签名发给B,B得到此数字签名后就可以通过CA的公钥对其进行解密并进行身份验证,具体过程在后面讲解。
        ③④同理。
        ⑤:A对要传输的信息进行加密并传输,B接受到以后进行解密的过程。
 
2、RSA算法:
        RSA原理:RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
        算法:
        (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}为私有密钥。
        实例:
        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)。

        代码实现:
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
public class SimpleRSA {
    /**
     * 加密、解密算法
     * @param key 公钥或密钥
     * @param message 数据
     * @return
     */
    public static long rsa(int baseNum, int key, long message){
        if(baseNum < 1 || key < 1){
            return 0L;
        }
        //加密或者解密之后的数据
        long rsaMessage = 0L;
           
        //加密核心算法
        rsaMessage = Math.round(Math.pow(message, key)) % baseNum;
        return rsaMessage;
    }
 
    public static void main(String[] args){
        //基数
        int baseNum = 3 11;
        //公钥
        int keyE = 3;
        //密钥
        int keyD = 7;
        //未加密的数据
        long msg = 24L;
        //加密后的数据
        long encodeMsg = rsa(baseNum, keyE, msg);
        //解密后的数据
        long decodeMsg = rsa(baseNum, keyD, encodeMsg);
           
        System.out.println("加密前:" + msg);
        System.out.println("加密后:" + encodeMsg);
        System.out.println("解密后:" + decodeMsg);
    }

  

        结果:这样CA就保存了用户的公钥,其他任何人想法送给此用户信息,只需查询词公钥,加密发送即可,而此用户用只有自己知道的秘钥解密。
 
3、签名证书:
        签名证书的用途:加入有A用户向B用户发送了信息“A love you”,B接收到之后怎么确定就是A发送的呢(因为中间人攻击中,假如C截获了A发送的信息后,改成“C love you”,B是无法确定这两个信息的发送者,因他她们都同样用B的工要加密),于是产生了签名证书技术。
        签名证书是由CA用自己的私钥对用户的信息进行加密,并把发给用户的,用户可以在发送信息的过程中附加上自己的签名证书,让接受者验证信息的来源。当接受者接受到发送者的签名证书后即可用ca的公钥解密验证发送者的身份信息。
 
4、信息传输:
   过程:
        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在中间截获这个数据就可以获取这些私密信息。怎么应对这种情况呢?签名证书就派上用场了。
         证书中心用自己的私钥,对每一个用户的、的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate)。发送者在发送信息之前如果想核对接受者的公钥,只需用CA的公钥对B的签名证书进行解密确认即可。

【转载】非对称加密过程详解(基于RSA非对称加密算法实现)的更多相关文章

  1. 【编程开发】非对称加密过程详解(基于RSA非对称加密算法实现)

    1.非对称加密过程:         假如现实世界中存在A和B进行通讯,为了实现在非安全的通讯通道上实现信息的保密性.完整性.可用性(即信息安全的三个性质),A和B约定使用非对称加密通道进行通讯,具体 ...

  2. MapReduce过程详解(基于hadoop2.x架构)

    本文基于hadoop2.x架构详细描述了mapreduce的执行过程,包括partition,combiner,shuffle等组件以及yarn平台与mapreduce编程模型的关系. mapredu ...

  3. [转载] Linux启动过程详解-《别怕Linux编程》之八

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket.为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. = ...

  4. (转载)Linux启动过程详解

    启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘 ...

  5. Swift 对象创建(PUT Object)过程详解——基于副本策略(一)

    swift中创建对象,即PUT object,根据选定的存储策略将对象内容写入至相应的服务器(object server).我们重点关注object controller和object servers ...

  6. DNS解析过程详解(转载)

    DNS解析过程详解(转载) DNS Domain Name System 域名系统,它就是根据域名查出IP地址.    先说一下DNS的几个基本概念: 一. 根域 就是所谓的“.”,其实我们的网址ww ...

  7. 转载:C/C++源代码到可执行程序的过程详解

    C/C++源代码到可执行程序的过程详解 编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格 ...

  8. SSL/TLS 握手过程详解

    在现代社会,互联网已经渗透到人们日常生活的方方面面,娱乐.经济.社会关系等都离不开互联网的帮助.在这个背景下,互联网安全就显得十分重要,没有提供足够的安全保障,人们是不会如此依赖它的.幸运的是,在大牛 ...

  9. 开源项目SMSS发开指南(五)——SSL/TLS加密通信详解(下)

    继上一篇介绍如何在多种语言之间使用SSL加密通信,今天我们关注Java端的证书创建以及支持SSL的NioSocket服务端开发.完整源码 一.创建keystore文件 网上大多数是通过jdk命令创建秘 ...

随机推荐

  1. Ubuntu/Debian nginx 简介

    Linux运营维护(简称运维) 这里是简单的使用介绍: 参考:http://einverne.github.io/post/2017/06/ubuntu-debian-install-nginx.ht ...

  2. apiCloud 三方分享,微信好友分享,微信朋友圈分享,QQ分享,微博分享

    首先查看我的这篇有关三方登录的博客,地址是http://www.cnblogs.com/gqx-html/p/8303567.html,配置完三方数据后可以从上一篇文章中的链接跳转到各个登录查看api ...

  3. LOJ6036编码

    每个串拆成两个,都插入trie数. 把trie树建出来后,每一条从根到叶子的链上最多只能有一个变量为1. 这是个经典的前后缀优化2-sat建图的套路. 树上的做法也就是边dfs边做而已. #inclu ...

  4. MySQL的自动补全和语法高亮工具MyCli

    官方地址: RHEL, Centos: We don't have packages for RHEL or Centos, yet. Instead, use pip to install mycl ...

  5. v-for

    在实际的项目中,我们很多时候会碰到将JSON数据中的数组或对象渲染出列表之类的元素.在Vue中,提供了一个 v-for的指令,可以渲染列表. 组件和v-for 在自定义组件里,你可以像任何普通元素一样 ...

  6. loj#2353. 「NOI2007」 货币兑换 斜率优化

    题意略 题解:可以列出dp方程\(dp[i]=max(dp[j]*{\frac{a[i]*c[j]+b[i]}{a[j]*c[j]+b[j]}}\),化简可以得到\(\frac{dp[i]}{b[i] ...

  7. python迭代器概念与应用

    结论 )可迭代对象包含迭代器.2)如果一个对象拥有__iter__方法,其是可迭代对象:如果一个对象拥有next方法,其是迭代器.3)生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__i ...

  8. leetcode-algorithms-33 Search in Rotated Sorted Array

    leetcode-algorithms-33 Search in Rotated Sorted Array Suppose an array sorted in ascending order is ...

  9. leetcode-algorithms-12 Integer to Roman

    leetcode-algorithms-12 Integer to Roman Roman numerals are represented by seven different symbols: I ...

  10. 安卓——AppTheme

    <?xml version="1.0" encoding="utf-8"?> <resources> <style name=&q ...