精华内容
下载资源
问答
  • 主要介绍了Java实现的对称加密算法AES,结合实例形式分析了对称加密算法AES的定义、特点、用法及使用场景,需要的朋友可以参考下
  • 主要介绍了JAVA加密算法- 非对称加密算法(DH,RSA),详细介绍了DH,RSA的用法和示例,需要的朋友可以了解一下。
  • 除了RSA和DSA这两种著名的非对称加密算法之外,在智能卡领域还有第3种类型的加密方法被用于数字签名和密钥交换,它是基于椭圆曲线EC(Elliptic Curves)的。  1985年,Victor Miller和Neal Koblitz各自独立地提出...
  • visual c++ vc实现RSA加密算法是最常用的非对称加密算法.zip
  • 主要介绍了C#实现简单的RSA非对称加密算法,结合实例形式分析了C#实现RSA加密的具体步骤与相关操作技巧,需要的朋友可以参考下
  • C语言实现国密SM4对称加解密算法。编译环境:VS2010。请参考我的博客https://blog.csdn.net/u013073067/article/details/86578753 分析代码
  • java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...
  • AES/DES 对称加密算法

    2018-12-25 14:04:55
    DES、AES对称加密算法,之前从网上找的,但是在MAC上运行发现每次加密出来的结果都不一样,后来查了一些博客,最后确认是SecureRandom的随机算法问题,需要设置setSeed.
  • 分享一个PHP对称加密算法DES,AES类,支持密钥:64/128/256 bit(字节长度8/16/32),支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit)。
  • C语言实现AES-128对称加解密算法。编译环境:VS2010。请参考我的博客https://blog.csdn.net/u013073067/article/details/86529111 分析代码
  • SM4(国产对称加密算法) ,支持ECB和CBC两种加密模式,支持base64和HEX两种加密格式输出。兼容java
  • 最近突发奇想要往数据库里保存一些机密的东西,然后就想着怎么让别人即使进入到了数据库也看不懂存储的是什么,那么只有加密了;可是我们自己还要看呢,那只能找一些对称...下面就介绍了php中简单的对称加密算法实现。
  • DES算法为密码体制中的对称密码体制,是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法。 这里以Java代码实现DES算法。
  • 主要介绍了Java对称加密算法DES,结合实例形式详细分析了java DES算法的概念、原理、实现方法与应用场景,需要的朋友可以参考下
  • 本文介绍了OpenSSL对称加密算法中添加新算法的方法。
  • java rsa非对称加密算法3个实例源代码
  • 主要介绍了java 非对称加密算法RSA实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 对称加密算法和非对称加密算法

    千次阅读 2020-10-15 17:47:18
    常用的对称加密算法:AES,RC4,3DES 传输的示意图如下所示: 第二 、非对称加密: 非对称加密算法实现机密信息交换的基本过程是: 甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开; 得到该公用密钥的...

    第一 对称加密:

    对称加密是指,加密方和解密方使用同样的秘钥来进行加密和解密。

    在对称加密算法中,数据发信方将明文( 原始数据 )和加密 密钥 (mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。

    常用的对称加密算法:AES,RC4,3DES

    传输的示意图如下所示:

     

    第二 、非对称加密:

    非对称加密算法实现机密信息交换的基本过程是:

    1. 甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;
    2. 得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;
    3. 甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。
    4. 甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。

    非对称加密算法:RSA,DSA/DSS 

    用通俗易懂的话来解释非对称加密:

    看一个小时候经常在《趣味数学》这类书里的一个数学小魔术:

    让对方任意想一个3位数,并把这个数和91相乘,然后告诉我积的最后三位数,我就可以猜出对方想的是什么数字啦!比如对方想的是123,那么对方就计算出123 * 91等于11193,并把结果的末三位193告诉我。看起来,这么做似乎损失了不少信息,让我没法反推出原来的数。不过,我仍然有办法:只需要把对方告诉我的结果再乘以11,乘积的末三位就是对方刚开始想的数了。可以验证一下,193 * 11 = 2123,末三位正是对方所想的秘密数字!

    其实道理很简单,91乘以11等于1001,而任何一个三位数乘以1001后,末三位显然都不变(例如123乘以1001就等于123123)。

    知道原理后,我们可以构造一个定义域和值域更大的加密解密系统。比方说,任意一个数乘以400000001后,末8位都不变,而400000001 = 19801 * 20201,于是你来乘以19801,我来乘以20201,又一个加密解密不对称的系统就构造好了。

    甚至可以构造得更大一些:4000000000000000000000000000001 = 1199481995446957 * 3334772856269093,这样我们就成功构造了一个30位的加密系统。

    这是一件非常coooooooool的事情,任何人都可以按照我公布的方法加密一个数,但是只有我才知道怎么把所得的密文变回去。

    其安全性就建立在算乘积非常容易,但是要把4000000000000000000000000000001分解成后面两个数相乘,在没有计算机的时代几乎不可能成功!但如果仅仅按照上面的思路,如果对方知道原理,知道我要构造出带很多0的数,根据19801和8位算法这2个条件非常容易穷举出400000001这个目标值。

    要解决这个问题,真实世界就不是使用乘法了,比如RSA算法使用的是指数和取模运算,但本质上就是上面这套思想。

    传输的示意图如下所示:

    如上图所示,客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然,但上述过程也存在缺点:

    公钥是公开的(也就是黑客也会有公钥),所以第 ④ 步私钥加密的信息,如果被黑客截获,其可以使用公钥进行解密,获取其中的内容。

     

    非对称和对称完美结合

    非对称加密既然也有缺陷,那我们就将对称加密,非对称加密两者结合起来,取其精华、去其糟粕,发挥两者的各自的优势:

    如上图所示

    1. 第 ③ 步时,客户端说:(咱们后续回话采用对称加密吧,这是对称加密的算法和对称密钥)这段话用公钥进行加密,然后传给服务器
    2. 服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,服务器说:(好的)对称密钥加密
    3. 后续两者之间信息的传输就可以使用对称加密的方式了

    这是个非常非常经典的数据传输过程,也是Https传输协议里面最经典的部分。也是把对称加密和非对称加密的作用发挥到了很好的地方。在https传输的过程中,如果单独只用对称加密,或者单独使用非对称加密都会出现问题。

    展开全文
  • 主要介绍了Python3非对称加密算法RSA,结合实例形式分析了Python3 RSA加密相关模块安装及使用操作技巧,需要的朋友可以参考下
  • DES( Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法。
  • RSA非对称加密算法

    2019-02-14 23:12:03
    主要介绍RSA非对称加密算法的由来和应用场景,以及加密原理
  •  图1 用对称和非对称相结合的加密算法变换密钥的方法举例(首先产生一个 加密的动态对称密钥,然后用非对称加密算法在两个实体问进行变换, 产生和交换密钥对的非对称加密算法是事先单独进行的未在图中示出) ...
  • 然而密码技术认为,「保密」信息总有一天会被扒出来,所以加密算法不应该依靠「保密」来保证机密性,而应该做到:即便知道了加密算法,依然无计可施。说的魔幻一点就是,告诉你我的密码,你依然不知道我的...

    简单来说: 数字签名使用私钥加密,发送数字签名+原来数据用来验证身份。但是前提是私钥提供方身份是真的,所以还需要第三方机构来做认证,就是公钥证书。身份验证以后,非对称加密用公钥加密数据,用私钥来解密。

     

    说到密码,我们第一个想到的就是登陆账户的密码,但是从密码学的角度来看,这种根本就不算合格的密码。

    为什么呢,因为我们的账户密码,是依靠隐蔽性来达到加密作用:密码藏在我心里,你不知道,所以你登不上我的账户。

    然而密码技术认为,「保密」信息总有一天会被扒出来,所以加密算法不应该依靠「保密」来保证机密性,而应该做到:即便知道了加密算法,依然无计可施。说的魔幻一点就是,告诉你我的密码,你依然不知道我的密码。

    最玄学的就是 Diffie-Hellman 密钥交换算法,我当初就觉得很惊奇,两个人当着你的面互相报几个数字,他们就可以拥有一个共同的秘密,而你却根本不可能算出来这个秘密。下文会着重介绍一下这个算法。

    本文讨论的密码技术要解决的主要是信息传输中的加密和解密问题。要假设数据传输过程是不安全的,所有信息都在被窃听的,所以发送端要把信息加密,接收方收到信息之后,肯定得知道如何解密。有意思的是,如果你能够让接收者知道如何解密,那么窃听者不是也能够知道如何解密了吗?

    下面,我们会介绍对称加密算法、密钥交换算法、非对称加密算法、数字签名、公钥证书,看看解决安全传输问题的一路坎坷波折。

    一、对称性加密

    对称性密码,也叫共享密钥密码,顾名思义,这种加密方式用相同的密钥进行加密和解密。

    比如我说一种最简单的对称加密的方法。首先我们知道信息都可以表示成 0/1 比特序列,也知道相同的两个比特序列做异或运算的结果为 0。

    那么我们就可以生成一个长度和原始信息一样的随机比特序列作为密钥,然后用它对原始信息做异或运算,就生成了密文。反之,再用该密钥对密文做一次异或运算,就可以恢复原始信息。

    这是一个简单例子,不过有些过于简单,有很多问题。比如密钥的长度和原始信息完全一致,如果原始信息很大,密钥也会一样大,而且生成大量真随机比特序列的计算开销也比较大。

    当然,有很多更复杂优秀的对称加密算法解决了这些问题,比如 Rijndael 算法、三重 DES 算法等等。它们从算法上是无懈可击的,也就是拥有巨大的密钥空间,基本无法暴力破解,而且加密过程相对快速

    但是,一切对称加密算法的软肋在于密钥的配送。加密和解密用同一个密钥,发送方必须设法把密钥发送给接收方。如果窃听者有能力窃取密文,肯定也可以窃取密钥,那么再无懈可击的算法依然不攻自破。

    所以,下面介绍两种解决密钥配送问题最常见的算法,分别是 Diffie-Hellman 密钥交换算法和非对称加密算法。

    二、密钥交换算法

    我们所说的密钥一般就是一个很大的数字,算法用这个数加密、解密。问题在于,信道是不安全的,所有发出的数据都会被窃取。换句话说,有没有一种办法,能够让两个人在众目睽睽之下,光明正大地交换一个秘密,把对称性密钥安全地送到接收方的手中?

    Diffie-Hellman 密钥交换算法可以做到。准确的说,该算法并不是把一个秘密安全地「送给」对方,而是通过一些共享的数字,双方「心中」各自「生成」了一个相同的秘密,而且双方的这个秘密,是第三方窃听者无法生成的

    也许这就是传说中的心有灵犀一点通吧。

    这个算法规则不算复杂,你甚至都可以找个朋友尝试一下共享秘密,等会我会简单画出它的基本流程。在此之前,需要明确一个问题:并不是所有运算都有逆运算

    最简单的例子就是我们熟知的单向散列函数,给一个数字 a 和一个散列函数 f,你可以很快计算出 f(a),但是如果给你 f(a) 和 f,推出 a 是一件基本做不到的事。密钥交换算法之所以看起来如此玄幻,就是利用了这种不可逆的性质。

    下面,看下密钥交换算法的流程是什么,按照命名惯例,准备执行密钥交换算法的双方称为 Alice 和 Bob,在网络中企图窃取他俩通信内容的坏人称为 Hack 吧。

    首先,Alice 和 Bob 协商出两个数字 N 和 G 作为生成元,当然协商过程可以被窃听者 Hack 窃取,所以我把这两个数画到中间,代表三方都知道:

     

    现在 Alice 和 Bob 心中各自想一个数字出来,分别称为 A 和 B 吧:

     

    现在 Alice 将自己心里的这个数字 A 和 G 通过某些运算得出一个数 AG,然后发给 Bob;Bob 将自己心里的数 B 和 G 通过相同的运算得出一个数 BG,然后发给 Alice:

     

    现在的情况变成这样了:

     

    注意,类似刚才举的散列函数的例子,知道 AG 和 G,并不能反推出 A 是多少,BG 同理。

    那么,Alice 可以通过 BG 和自己的 A 通过某些运算得到一个数 ABG,Bob 也可以通过 AG 和自己的 B 通过某些运算得到 ABG,这个数就是 Alice 和 Bob 共有的秘密。

    而对于 Hack,可以窃取传输过程中的 GAGBG,但是由于计算不可逆,怎么都无法结合出 ABG 这个数字。

     

    以上就是基本流程,至于具体的数字取值是有讲究的,运算方法在百度上很容易找到,限于篇幅我就不具体写了。

    该算法可以在第三者窃听的前提下,算出一个别人无法算出的秘密作为对称性加密算法的密钥,开始对称加密的通信。

    对于该算法,Hack 又想到一种破解方法,不是窃听 Alice 和 Bob 的通信数据,而是直接同时冒充 Alice 和 Bob 的身份,也就是我们说的「中间人攻击」:

     

    这样,双方根本无法察觉在和 Hack 共享秘密,后果就是 Hack 可以解密甚至修改数据。

    可见,密钥交换算法也不算完全解决了密钥配送问题,缺陷在于无法核实对方身份。所以密钥交换算法之前一般要核实对方身份,比如使用数字签名。

    三、非对称加密

    非对称加密的思路就是,干脆别偷偷摸摸传输密钥了,我把加密密钥和解密密钥分开,公钥用于加密,私钥用于解密。只把公钥传送给对方,然后对方开始给我发送加密的数据,我用私钥就可以解密。至于窃听者,拿到公钥和加密数据也没用,因为只有我手上的私钥才能解密。

    可以这样想,私钥是钥匙,而公钥是锁,可以把锁公开出去,让别人把数据锁起来发给我;而钥匙一定要留在自己手里,用于解锁。我们常见的 RSA 算法就是典型的非对称加密算法,具体实现比较复杂,我就不写了,网上很多资料。

    在实际应用中,非对称性加密的运算速度要比对称性加密慢很多的,所以传输大量数据时,一般不会用公钥直接加密数据,而是加密对称性加密的密钥,传输给对方,然后双方使用对称性加密算法传输数据。

    需要注意的是,类似 Diffie-Hellman 算法,非对称加密算法也无法确定通信双方的身份,依然会遭到中间人攻击。比如 Hack 拦截 Bob 发出的公钥,然后冒充 Bob 的身份给 Alice 发送自己的公钥,那么不知情的 Alice 就会把私密数据用 Hack 的公钥加密,Hack 可以通过私钥解密窃取。

    那么,Diffie-Hellman 算法和 RSA 非对称加密算法都可以一定程度上解决密钥配送的问题,也具有相同的缺陷,二者的应用场景有什么区别呢?

    简单来说,根据两种算法的基本原理就可以看出来:

    如果双方有一个对称加密方案,希望加密通信,而且不能让别人得到钥匙,那么可以使用 Diffie-Hellman 算法交换密钥。

    如果你希望任何人都可以对信息加密,而只有你能够解密,那么就使用 RSA 非对称加密算法,公布公钥。

    下面,我们尝试着解决认证发送方身份的问题。

    四、数字签名

    刚才说非对称加密,把公钥公开用于他人对数据加密然后发给你,只有用你手上对应的私钥才能将密文解密。其实,私钥也可用用来加密数据的,对于 RSA 算法,私钥加密的数据只有公钥才能解开

    数字签名也是利用了非对称性密钥的特性,但是和公钥加密完全颠倒过来:仍然公布公钥,但是用你的私钥加密数据,然后把加密的数据公布出去,这就是数字签名

    你可能问,这有什么用,公钥可以解开私钥加密,我还加密发出去,不是多此一举吗?

    是的,但是数字签名的作用本来就不是保证数据的机密性,而是证明你的身份,证明这些数据确实是由你本人发出的。

    你想想,你的私钥加密的数据,只有你的公钥才能解开,那么如果一份加密数据能够被你的公钥解开,不就说明这份数据是你(私钥持有者)本人发布的吗?

    当然,加密数据仅仅是一个签名,签名应该和数据一同发出,具体流程应该是:

    1、Bob 生成公钥和私钥,然后把公钥公布出去,私钥自己保留。

    2、用私钥加密数据作为签名,然后将数据附带着签名一同发布出去

    3、Alice 收到数据和签名,需要检查此份数据是否是 Bob 所发出,于是用 Bob 之前发出的公钥尝试解密签名,将收到的数据和签名解密后的结果作对比,如果完全相同,说明数据没被篡改,且确实由 Bob 发出。

    为什么 Alice 这么肯定呢,毕竟数据和签名是两部分,都可以被掉包呀?原因如下:

    1、如果有人修改了数据,那么 Alice 解密签名之后,对比发现二者不一致,察觉出异常。

    2、如果有人替换了签名,那么 Alice 用 Bob 的公钥只能解出一串乱码,显然和数据不一致。

    3、也许有人企图修改数据,然后将修改之后的数据制成签名,使得 Alice 的对比无法发现不一致;但是一旦解开签名,就不可能再重新生成 Bob 的签名了,因为没有 Bob 的私钥。

    综上,数字签名可以一定程度上认证数据的来源。之所以说是一定程度上,是因为这种方式依然可能受到中间人攻击。一旦涉及公钥的发布,接收方就可能收到中间人的假公钥,进行错误的认证,这个问题始终避免不了。

    说来可笑,数字签名就是验证对方身份的一种方式,但是前提是对方的身份必须是真的... 这似乎陷入一个先有鸡还是先有蛋的死循环,要想确定对方的身份,必须有一个信任的源头,否则的话,再多的流程也只是在转移问题,而不是真正解决问题

    五、公钥证书

    证书其实就是公钥 + 签名,由第三方认证机构颁发。引入可信任的第三方,是终结信任循环的一种可行方案。

    证书认证的流程大致如下:

    1、Bob 去可信任的认证机构证实本人真实身份,并提供自己的公钥。

    2、Alice 想跟 Bob 通信,首先向认证机构请求 Bob 的公钥,认证机构会把一张证书(Bob 的公钥以及自己对其公钥的签名)发送给 Alice。

    3、Alice 检查签名,确定该公钥确实由这家认证机构发送,中途未被篡改。

    4、Alice 通过这个公钥加密数据,开始和 Bob 通信。

     

    PS:以上只是为了说明,证书只需要安装一次,并不需要每次都向认证机构请求;一般是服务器直接给客户端发送证书,而不是认证机构。

    也许有人问,Alice 要想通过数字签名确定证书的有效性,前提是要有该机构的(认证)公钥,这不是又回到刚才的死循环了吗?

    我们安装的正规浏览器中都预存了正规认证机构的证书(包含其公钥),用于确认机构身份,所以说证书的认证是可信的。

    Bob 向机构提供公钥的过程中,需要提供很多个人信息进行身份验证,比较严格,所以说也算是可靠的。

    获得了 Bob 的可信公钥,Alice 和 Bob 之间的通信基于加密算法的保护,是完全无懈可击的。

    现在的正规网站,大都使用 HTTPS 协议,就是在 HTTP 协议和 TCP 协议之间加了一个 SSL/TLS 安全层。在你的浏览器和网站服务器完成 TCP 握手后,SSL 协议层也会进行 SSL 握手交换安全参数,其中就包含该网站的证书,以便浏览器验证站点身份。SSL 安全层验证完成之后,上层的 HTTP 协议内容都会被加密,保证数据的安全传输。

    这样一来,传统的中间人攻击就几乎没有了生存空间,攻击手段只能由技术缺陷转变为坑蒙拐骗。事实上,这种手段的效果反而更高效,比如我就发现网上不少下载网站发布的浏览器,不仅包含乱七八糟的导航和收藏网址,还包含一些不正规的认证机构证书。任何人都可以申请证书,这些不正规证书很可能造成安全隐患

    六、最后总结

    对称性加密算法使用同一个密钥加密和解密,难以破解,加密速度较快,但是存在密钥配送问题。

    Diffie-Hellman 密钥交换算法可以让双方「心有灵犀一点通」,一定程度解决密钥配送问题,但是无法验证通信方的身份,所以可能受到中间人攻击。

    非对称性加密算法生成一对儿密钥,把加密和解密的工作分开了。

    RSA 算法作为经典的非对称加密算法,有两种用途:如果用于加密,可以把公钥发布出去用于加密,只有自己的私钥可以解密,保证了数据的机密性;如果用于数字签名,把公钥发布出去后,用私钥加密数据作为签名,以证明该数据由私钥持有者所发送。但是无论那种用法,涉及公钥的发布,都无法避免中间人攻击。

    公钥证书就是公钥 + 签名,由可信任的第三方认证机构颁发。由于正规浏览器都预装了可信的认证机构的公钥,所以可以有效防止中间人攻击。

    HTTPS 协议中的 SSL/TLS 安全层会组合使用以上几种加密方式,所以说不要安装非正规的浏览器,不要乱安装未知来源的证书

    密码技术只是安全的一小部分,即便是通过正规机构认证的 HTTPS 站点,也不意味着可信任,只能说明其数据传输是安全的。技术永远不可能真正保护你,最重要的还是得提高个人的安全防范意识,多留心眼儿,谨慎处理敏感数据。

    _____________

    公众号:labuladong

    B站:labuladong

    知乎:labuladong

    From: https://labuladong.github.io/ebook/%E6%8A%80%E6%9C%AF/%E5%AF%86%E7%A0%81%E6%8A%80%E6%9C%AF.html

    展开全文
  • 对称加密算法和非对称加密算法的区别 1.对称加密算法加密和解密使用的密钥的是相同的,也就是只有一个密钥,而非对称加密算法有两个密钥,也就是加密和解密所使用的密钥是不同的 2.各自算法不同 3.对称加密算法加密...

    对称加密算法和非对称加密算法的区别

    1.对称加密算法加密和解密使用的密钥的是相同的,也就是只有一个密钥,而非对称加密算法有两个密钥,也就是加密和解密所使用的密钥是不同的

    2.各自算法不同

    3.对称加密算法加密速度快(相对的),非对称算法,密钥成对生成,公钥对外发布,但是对大数据的加解密速度比对称算法慢。

    4.还有就是安全性不同,对称加密算法,在传输的过程中被窃听那就玩完了,而非对称加密算法就可以很好的避免这个问题

    5.数字签名,对称加密不可以用于数字签名和数字鉴别,非对称加密可以用于数字签名和数字鉴别。

    对称加密算法与非对称加密算法的相同点

    废话一句:都是加密算法

    咳咳…

    1.都是可逆的

    2.然后…

    然后…

    emm

    暂时没有想到

    对称加密算法和非对称加密算法的优缺点

    对称加密算法:速度快但是安全性不可保证、安全性取决于密钥的长度、对称加密算法是可逆的、占用的资源空间较少、源认证存在问题

    非对称加密算法:安全性高但是速度慢、非对称加密算法压缩可逆、占用运算空间资源较多、源认证存在问题

    常见的算法

    对称加密算法:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等等

    非对称加密算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC等等

    ps:

    ECC:椭圆曲线加密算法

    其他链接

    哔哩哔哩
    会同步该博客发一些自制视频

    微博
    用的比较少

    Github
    一些源代码

    知乎
    不懂的我一般会在上面提问

    简书
    同步该博客内容相同

    CSDN
    同步该博客内容相同
    博客首页

    个人联系方式

    QQ:2446264712

    微信:X15019749137

    邮箱:xiaoyangaichibaozi@yeah.net

    有意添加请备注 啊啊啊啊

    展开全文
  • 对称加密算法中,数据发信方将明文(原始数据)和加密密钥(mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。常用的对称加密算法:AES,RC4,3DES传输的示意图如下所示:如上图所示,此种...
    第一 对称加密:
    对称加密是指,加密方和解密方使用同样的秘钥来进行加密和解密。
    在对称加密算法中,数据发信方将明文( 原始数据 )和加密 密钥 (mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。常用的 对称加密算法:AES,RC4,3DES

    传输的示意图如下所示:

    如上图所示,此种方式属于对称加密,双方拥有相同的密钥,信息得到安全传输,但此种方式的缺点是:

    (1)不同的客户端、服务器数量庞大,所以双方都需要维护大量的密钥,维护成本很高

    (2)因每个客户端、服务器的安全级别不同,密钥极易泄露

    这里举例一个使用DES算法来实现对称加密的例子:

    public class DESUtils {

    public byte[] initKey(){
    try {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
    keyGenerator.init(56);
    SecretKey secretKey = keyGenerator.generateKey();
    return  secretKey.getEncoded();
    } catch (NoSuchAlgorithmException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    return null;
    }

    /**
      * @Method: encrypt
      * @Description: 加密算法
      * @param data 被加密字节数组
      * @param key  随机对称密钥
      * @return
      * 返回类型:byte[]
      */
    public byte[] encrypt(byte[] data,byte[] key){
    SecretKey secretKey = new SecretKeySpec(key, "DES");
    Cipher cipher;
    try {
    cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    return cipher.doFinal(data);
    } catch (Exception e) {
    e.printStackTrace();


    return null;
    }

    /**
      * @Method: decode
      * @Description: TODO
      * @param 被解密的字节数组
      * @param key 随机对称密钥(和加密密钥务必保持一致)
      * @return
      * 返回类型:byte[]
      */
    public byte[] decode(byte[] data,byte[] key){
    SecretKey secretKey = new SecretKeySpec(key, "DES");
    Cipher cipher;
    try {
    cipher = Cipher.getInstance("DES");
    cipher.init(Cipher.DECRYPT_MODE, secretKey);
    return cipher.doFinal(data);
    } catch (Exception e) {
    e.printStackTrace();


    return null;
    }

    测试代码为:

    public static void testDes(){
    DESUtils desUtils = new DESUtils();
    byte[] key = desUtils.initKey();   // 
    String originData = "123456";
    System.out.println("原始数据:"+originData);
    try {
    // 将原始数据转化为字符串
    byte[] arrayOrigin = originData.getBytes("utf-8");
    // 对原始数据进行加密
    byte[] encryption = desUtils.encrypt(arrayOrigin, key);
    // 通过BASE64Encoder转化处理
    String encryptionStr = new BASE64Encoder().encode(encryption);
    System.out.println("经过加密之后的字符串:"+encryptionStr);

    try {
    // 使用BASE64Decoder进行转化处理
    byte[] decoceOrigin = new BASE64Decoder().decodeBuffer(encryptionStr);
    // 使用DES进行解密操作
    byte[] decode = desUtils.decode(decoceOrigin, key);
    // 把字节数组转化为字符串
    String decodeStr = new String(decode,"utf-8");
    System.out.println("对加密字符串进行解密:"+decodeStr);
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    } catch (UnsupportedEncodingException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }

    运行结果如下:

    原始数据:123456
    经过加密之后的字符串:jaKOVkHJtOQ=
    对加密字符串进行解密:123456

    第二 、非对称加密:
    非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。 非对称加密算法:RSA,DSA/DSS 

    如上图所示,客户端用公钥对请求内容加密,服务器使用私钥对内容解密,反之亦然,但上述过程也存在缺点:

    公钥是公开的(也就是黑客也会有公钥),所以第 ④ 步私钥加密的信息,如果被黑客截获,其可以使用公钥进行解密,获取其中的内容。

    实现非对称加密算法例子:

    public class AsymmetricEncryption {


    public static final String KEY_ALGORITHM = "RSA";
    /** 貌似默认是RSA/NONE/PKCS1Padding,未验证 */
    public static final String CIPHER_ALGORITHM = "RSA/ECB/PKCS1Padding";
    public static final String PUBLIC_KEY = "publicKey";
    public static final String PRIVATE_KEY = "privateKey";


    /** RSA密钥长度必须是64的倍数,在512~65536之间。默认是1024 */
    public static final int KEY_SIZE = 2048;


    public static final String PLAIN_TEXT = "hello world!";


    /**
    * @Method: generateKeyBytes
    * @Description: 首先产生一个公钥和私钥对,使用HashMap保存起来
    * @return 返回类型:Map<String,byte[]>
    */
    public static Map<String, byte[]> generateKeyBytes() {


    try {
    KeyPairGenerator keyPairGenerator = KeyPairGenerator
    .getInstance(KEY_ALGORITHM);
    keyPairGenerator.initialize(KEY_SIZE);
    KeyPair keyPair = keyPairGenerator.generateKeyPair();


    RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
    RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();


    Map<String, byte[]> keyMap = new HashMap<String, byte[]>();
    keyMap.put(PUBLIC_KEY, publicKey.getEncoded());
    keyMap.put(PRIVATE_KEY, privateKey.getEncoded());
    return keyMap;
    } catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
    }
    return null;
    }


    /**
    * 还原公钥,X509EncodedKeySpec 用于构建公钥的规范

    * @param keyBytes
    * @return
    */
    public static PublicKey restorePublicKey(byte[] keyBytes) {
    X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);


    try {
    KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
    PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec);
    return publicKey;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }


    /**
    * 还原私钥,PKCS8EncodedKeySpec 用于构建私钥的规范

    * @param keyBytes
    * @return
    */
    public static PrivateKey restorePrivateKey(byte[] keyBytes) {
    PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(
    keyBytes);
    try {
    KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
    PrivateKey privateKey = factory
    .generatePrivate(pkcs8EncodedKeySpec);
    return privateKey;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }


    /**
    * 加密,三步走。

    * @param key
    * @param plainText
    * @return
    */
    public static byte[] RSAEncode(PublicKey key, byte[] plainText) {


    try {
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    cipher.init(Cipher.ENCRYPT_MODE, key);
    return cipher.doFinal(plainText);
    } catch (Exception e) {
    e.printStackTrace();
    }


    return null;
    }


    public static String RSADecode(PrivateKey key, byte[] encodedText) {


    try {
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
    cipher.init(Cipher.DECRYPT_MODE, key);
    return new String(cipher.doFinal(encodedText));
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }

    }

    测试代码如下:

    public static void tesRSA(){
    Map<String, byte[]> keyMap = AsymmetricEncryption.generateKeyBytes();

    // 加密
    PublicKey publicKey = AsymmetricEncryption.restorePublicKey(keyMap.get(AsymmetricEncryption.PUBLIC_KEY));
    byte[] encodedText = AsymmetricEncryption.RSAEncode(publicKey, AsymmetricEncryption.PLAIN_TEXT.getBytes());
    String rsaString = new BASE64Encoder().encode(encodedText);
    System.out.println("RSA encoded: " + rsaString);

    PrivateKey privateKey = AsymmetricEncryption.restorePrivateKey(keyMap.get(AsymmetricEncryption.PRIVATE_KEY));
    System.out.println("RSA decoded: "+ AsymmetricEncryption.RSADecode(privateKey, encodedText));

    }

    运行结果如下所示:

    RSA encoded: e7wIyV32VtiJhiraQGIYxD2TKtC4O6dRJx0lgVuEUsjCTSjqNFmEVNlYmFzd3ohIiW67XyIfEzWD
    W9YFpFnDekRFLgeerh7c5gXMLVsVkf7k7XuTbiGmQOlOBUmL8VWpWVWTk8Rgn7Y+G7/dz9+DOEnH
    csMnssKC/MBM80Ad5Za+QHqgb6BdZNHjZYzWpDIztBEUf/yHWfkGhmJahxo6Ff6y8er/shiP+qL3
    hMJlw70TTGoGlrAWQqxUMYGPrv4IELi/iNSednXxo5bNNatJYke7FhKnuy8GEOWNH/K8Q52vl24L
    cururJGLEJR6Hn/oaGxnXQbs2Fzo3vUziDj1cQ==
    RSA decoded: hello world!

    第三 非对称和对称完美结合

    非对称加密既然也有缺陷,那我们就将对称加密,非对称加密两者结合起来,取其精华、去其糟粕,发挥两者的各自的优势:


    如上图所示

    (1)第 ③ 步时,客户端说:(咱们后续回话采用对称加密吧,这是对称加密的算法和对称密钥)这段话用公钥进行加密,然后传给服务器

    (2)服务器收到信息后,用私钥解密,提取出对称加密算法和对称密钥后,服务器说:(好的)对称密钥加密

    (3)后续两者之间信息的传输就可以使用对称加密的方式了

    这是个非常非常经典的数据传输过程,也是Https传输协议里面最经典的部分。也是把对称加密和非对称加密的作用发挥到了很好的地方。在https传输的过程中,如果单独只用对称加密,或者单独使用非对称加密都会出现问题。



    展开全文
  • 对称加密:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES 非对称加密:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
  • 本文主要介绍对称加密算法(symmetric encryption algorithm)和非对称加密算法(asymmetric cryptographic algorithm)的相关知识。 1 对称加密算法 1.1 概述 对称加密算法是应用较早的加密算法,技术成熟。 在...
  • 基于FPGA的常用哈希及对称加密算法.pdf
  • 有幸接触了一下传说中的对称加密算法3DES 感觉这些加密算法与我的工作是想去甚远的,一般没什么机会接触这些东西 今次了解了一下3DES这个对称算法 原理算不上明白,算是踩了C#中的一些坑吧 C#中对于密钥的处理比较...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 79,507
精华内容 31,802
关键字:

对称加密算法