java加解密算法--常见加解密算法
什么是加密算法?
百度百科给出的解释如下:
数据加密的基本过程就是对原来为明⽂的⽂件或数据按某种算法进⾏处理,使其成为不可读的⼀段代码,通常称为“密⽂”,使其只能在输⼊相应的密钥之后才能显⽰出本来内容,通过这样的途径来达到保护数据不被⾮法⼈窃取、阅读的⽬的。该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。
简单来说,就是把某⼀段数据(明⽂),按照“某种规则”转换成另外⼀段不可读的数据(密⽂)。这⾥选定的“规则”,就是加密算法。理所当然,当别⼈拿到“密⽂”,解析出“明⽂”的难度取决于加密算法的破解难度。
1. 算法种类
单向加密
对称加密
⾮对称加密
1.1 单向加密
即加密之后不能解密,⼀般⽤于数据验证
1) Base64
Base64 编码是从⼆进制到字符的过程,⽤ 64 个字符来表⽰任意的⼆进制数据。对于开发⼈员来说,拿到密⽂,很容易就能够解析成明⽂。因此严格来说,Base64不能称之为加密算法,仅仅是⼀种编码⽅式。它常常⽤于发送Http请求时对URL中参数的编码,保证不是⼀眼就看出来了这些参数的意义,或者图⽚编码传输。
转换⽅法:
1 字节(byte) = 8 ⽐特位(bit)
Base64 定义了 64 (2^6)个可打印字符表⽰⼆进制的⽅法,也就是说 6 个 bit 的⼆进制数据可以⽤对应的字符代替表⽰
对于连续多个⼆进制数据,每 3 个字节⼀组进⾏转换,3个字节 24 bit,然后将其分为 4 部分(3×8 = 4×6),每个部分刚好 6 bit,⾼位补0,将 6 bit ⼆进制转换为 Base64 定义的字符即完成转换
若⼆进制数据字节数不是 3 的倍数,Base64 就将剩下的⼆进制数据补 0 ⾄ 3 的倍数,全 0 的⽤字符 “=” 代替
⽐如:我要⽤Base64编码⼀个字符串“abc”,实际算法如下:
'a','b','c'的ASCII标准编码分别为(⼗进制)97,98,99,因此⽤⼆进制表⽰“abc”字符串就是:
01100001,01100010,01100011 ---3组,每组8字节
Base64的原理:将这三组8字节,分成4组6字节
011000,010110, 001001,100011 ---4组,每组6字节
⾼位补0
00011000,00010110, 00001001,00100011
这四个⼆进制数组对应⼗进制的数值分别是:24,22,9,35,RFC2045(Base64解码表)分别为:
Y,W,J,j
即:"abc"经过Base64编码后,为"YWJj"。
2) MD5
Message Digest algorithm 5,信息摘要算法,MD5
⼀般⽤于确保信息的传输完整⼀致性,校验传输的数据是否被修改,⼀旦原始信息被修改,⽣成的 MD5 值将会变得很不同。
算法能将任意⼤⼩、格式的⽂字或⽂件进⾏加密从⽽产⽣ 128 bit(16 字节)的散列值。如同⼈的指纹,不同⽂本的 MD5 值是不同的。
极端情况:就是不同的字符串的 MD5 值⼀样,这叫哈希碰撞。2009 年中科院就已经实现了相应的碰撞算法,不过 MD5 应⽤仍然很⼴泛
⼀般不可破解,除⾮使⽤穷举法,难度依旧很⼤
简单来说,就是把⼀段信息(明⽂),通过⼀种有损的⽅式压缩成定长的字符(32位密⽂)。因为这
种压缩⽅式是会损失信息的,所以是⽆法还原出“明⽂”的。如果想⽤该算法加密,还可以通过“加盐”的⽅式提⾼解密难度。该算法允许多传⼀个参数"salt",指定通过MD5加密的次数,这样是能够提⾼解密难度的。
3) SHA
Secure Hash Algorithm,安全散列算法
是⼀个密码散列函数家族,是 FIPS 所认证的安全散列算法,被⼴泛地应⽤于电⼦商务等信息安全领域。
和 MD5特点⼀致,都是对⽂本进⾏散列,产⽣⼀定长度的散列值,不过⽣成的密⽂长度是40位,因此更难破解。SHA通过碰撞法被破解了,但是SHA仍然是公认的安全加密算法,较之MD5更为安全。
SHA与MD5的不同:
1.对强⾏攻击的安全性,SHA-1摘要⽐MD5摘长,对强⾏攻击有更⼤的强度。使⽤强⾏技术,产⽣任何⼀个报⽂使其摘要等于给定报摘要的难度对MD是2^128数量级的操作,⽽对SHA则是2^160数量级的操作。这样,SHA对强⾏攻击有更⼤的强度。
2.对密码分析的安全性,由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
3.在相同的硬件上,SHA-1的运⾏速度⽐MD5慢。
4) HMAC
Hash Message Authentication Code,散列消息鉴别码
基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,⽤公开函数和密钥产⽣⼀个固定长度的值作为认证标识,⽤这个标识鉴别消息的完整性。使⽤⼀个密钥⽣成⼀个固定⼤⼩的⼩数据块,即MAC,并将其加⼊到消息中,然后传输。接收⽅利⽤与发送⽅共享的密钥进⾏鉴别认证等。
简单的说,是⼀种通过特别计算⽅式之后产⽣的消息认证码(MAC),使⽤密码散列函数,同时结合⼀个加密密钥。它可以⽤来保证数据的完整性,同时可以⽤来作某个消息的⾝份验证。java加密方式有哪些
1.2 对称加密
对称加密的意思就是信息收发都有相同的⼀把钥匙,消息的加密解密都⽤这进⾏
优缺点:
优点:算法公开、计算量⼩、加密速度快、加密效率⾼。
缺点:
(1)交易双⽅都使⽤同样钥匙,安全性得不到保证。
(2)每对⽤户每次使⽤对称加密算法时,都需要使⽤其他⼈不知道的惟⼀钥匙,这会使得发收信双⽅所拥有的钥匙数量呈⼏何级数增长,密钥管理成为⽤户的负担。对称加密算法在分布式⽹络系统上使⽤较为困难,主要是因为密钥管理困难,使⽤成本较⾼。
1)DES
Data Encryption Standard,数据加密标准,速度较快,适⽤于加密⼤量数据的场合。
DES是最基本的对称加密算法,也是使⽤频率最⾼的⼀种算法,加密密钥与解密密钥相同。DES出⾝⽐较好,出⾃IBM之⼿,后被美国军⽅采纳,之后便⼴泛流传,但是近些年使⽤越来越少,因为DES使⽤56位密钥,以现代计算能⼒,24⼩时内即可被破解。虽然如此,在某些简单应⽤中,我们还是可以使⽤DES加密算法。DES使⽤56位长度的密钥,有些提供商可能附加8位奇偶校验位。
2)AES
Advanced Encryption Standard,⾼级加密标准,速度快,安全级别⾼。
它的原理是:加密⽅和解密⽅保有同⼀个16位长的密钥,使⽤AES算法加解密时需要传⼊该密钥参数,通过Java实现AES算法提供的⼯具包加密后返回的是⼀个Base64格式的字节数组。因此为保证密⽂“可读性”,需要在加密后对密⽂进⾏Base64编码,解密前进⾏Base64解码成密⽂。AES算法的安全性,取决于密钥的安全性。因此⼀定不要在加解密的URL中传⼊该密钥参数,不然没有意义。⼀般的做法是:前后端协商好密钥,或者通过不对称加密的⽅式传递密钥。
AES是⽬前使⽤最多的对称加密算法之⼀,AES⾄今尚未听说有被破解的案例。
AES通常⽤于移动通信系统加密以及基于SSH协议的软件,如SSH Client,secureCRT。
AES是⽤来替代DES的,因为DES有很多被破解,⽽3DES效率⼜⽐较慢。
3)PBE
Password Based Encryption,基于密码加密
是⼀种基于⼝令的加密算法,其特点是使⽤⼝令代替了密钥,⽽⼝令由⽤户⾃⼰掌管,采⽤随机数杂凑多重加密等⽅法保证数据的安全性。PBE算法在加密过程中并不是直接使⽤⼝令来加密,⽽是加密的密钥由⼝令⽣成,这个功能由PBE算法中的KDF函数完成。KDF函数的实现过程为:将⽤户输⼊的⼝令⾸先通过“盐”(salt)的扰乱产⽣准密钥,再将准密钥经过散列函数多次迭代后⽣成最终加密密钥,
密钥⽣成后,PBE算法再选⽤对称加密算法对数据进⾏加密,可以选择DES、3DES、RC5等对称加密算法。来源:百度百科
特点:
结合了消息摘要算法和对称加密算法的优点,本质上是对MD5/SHA以及DES/3DES/AES算法的包装,不是新的算法,不过也是最为⽜逼的⼀种⽅式。
盐:指加密的随机字符串或者⼝令等,也可以⼈为是⼀些扰码,防⽌密码的暴⼒破解。
4)3DES
或称为Triple DES,Triple Data Encryption Algorithm,三重数据加密算法
它相当于是对每个数据块应⽤三次DES加密算法。由于计算机运算能⼒的增强,原版DES密码的密钥长度变得容易被暴⼒破解;3DES即是设计⽤来提供⼀种相对简单的⽅法,即通过增加DES的密钥长度来避免类似的攻击,⽽不是设计⼀种全新的块密码算法。来源:百度百科
DES被很多密码学机构质疑,因为算法是半公开的,因此违反柯克霍夫原则,所以在这个基础上,延伸了3重DES.
3DES与实现DES⽅式基本⼀致,算法名称要改为DESede,密钥长度为168,转换密钥时使⽤DESedeKeySpec类。
1.3 ⾮对称加密
⾮对称加密算法是⼀种密钥的保密⽅法。⾮对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是⼀对,如果⽤公开密钥对数据进⾏加密,只有⽤对应的私有密钥才能解密;如果⽤私有密钥对数据进⾏加密,那么只有⽤对应的公开密钥才能解密。
优缺点:
算法强度复杂、安全性依赖于算法与密钥.但是由于算法复杂,使得⾮对称算法加解密速度没有对称算法加解密的速度快
对称密钥体制中只有⼀种密钥,并且是⾮公开的,如果要解密就得让对⽅知道密钥.所以保证其安全性就是保证密钥的安全
⾮对称密钥体制有两种密钥,其中⼀个是公开的,这样就可以不需要像对称密码那样向对⽅传输密钥了.因此安全性就⼤了很多
算法复杂度:对称密钥<⾮对称密钥
加解密速度:对称密钥>⾮对称密钥
安全性:对称密钥<⾮对称密钥
1)RSA
RSA算法的JDK实现默认密钥长度是1024,BC则是2048,密钥长度必须是64的倍数,在512到65536位之间。
RSA是可以双向加密的:私钥加密,公钥解密;公钥加密,私钥解密。
2)DH
Diffie-Hellman算法(D-H算法),密钥⼀致协议。是由公开密钥密码体制的奠基⼈Diffie和Hellman所提出的⼀种思想。简单的说就是允许两名⽤户在公开媒体上交换信息以⽣成"⼀致"的、可以共享的密钥。换句话说,就是由甲⽅产出⼀对密钥(公钥、私钥),⼄⽅依照甲⽅公钥产⽣⼄⽅密钥对(公钥、私钥)。以此为基线,作为数据传输保密基础,同时双⽅使⽤同⼀种对称加密算法构建本地密钥(SecretKey)对数据加密。这样,在互通了本地密钥(SecretKey)算法后,甲⼄双⽅公开⾃⼰的公钥,使⽤对⽅的公钥和刚才产⽣的私钥加密数据,同时可以使⽤对⽅的公钥和⾃⼰的私钥对数据解密。不单单是甲⼄双⽅两⽅,可以扩展为多⽅共享数据通讯,这样就完成了⽹络交互数据的安全通讯!
该算法源于中国的同余定理——中国馀数定理。
DH算法的默认密钥长度是1024,密钥长度必须是64的倍数,在512到1024位之间。
密钥⼀致协议就是允许两名⽤户在公开媒体上交换信息以⽣成"⼀致"的、可以共享的密钥。
算法过程:
1.甲⽅构建密钥对,将公钥公布给⼄⽅,将私钥保留;双⽅约定数据加密算法;⼄⽅通过甲⽅公钥构建密钥对,将公钥公布给甲⽅,将私钥保留。
2.甲⽅使⽤私钥、⼄⽅公钥、约定数据加密算法构建本地密钥,然后通过本地密钥加密数据,发送给⼄⽅加密后的数据;⼄⽅使⽤私钥、甲⽅公钥、约定数据加密算法构建本地密钥,然后通过本地密钥对数据解密。
3.⼄⽅使⽤私钥、甲⽅公钥、约定数据加密算法构建本地密钥,然后通过本地密钥加密数据,发送给甲⽅加密后的数据;甲⽅使⽤私钥、⼄⽅公钥、约定数据加密算法构建本地密钥,然后通过本地密钥对数据解密。
3)ElGamal
是⼀种较为常见的加密算法,它是基于1985年提出的公钥密码体制和椭圆曲线加密体系。既能⽤于数据加密也能⽤于数字签名,其安全性依赖于计算有限域上离散对数这⼀难题。在加密过程中,⽣成的密⽂长度是明⽂的两倍,且每次加密后都会在密⽂中⽣成⼀个随机数K,在密码中主要应⽤离散对数问题的⼏个性质:求解离散对数(可能)是困难的,⽽其逆运算指数运算可以应⽤平⽅-乘的⽅法有效地计算。也就是说,在适当的G中,指数函数是单向函数。
特点:
1、在JDK⾥并没有提供对ElGamal算法的实现.⽽是通过BouncyCastle实现.
2、只提供公钥加密,私钥解密,不提供私钥加密,公钥解密
3、ElGamal算法⽀持数据加密与数字签名.
4、密钥长度:160~16384(8的倍数),默认的密钥长度为1024.
1.⼄⽅构建密钥对⼉,将公钥公布给甲⽅,将私钥保留。
2.甲⽅使⽤公钥加密数据,然后⽤公钥对加密后的数据签名,发送给⼄⽅签名以及加密后的数据;⼄⽅使⽤私钥、签名来验证待解密数据是否有效,如果有效使⽤私钥对数据解密。
总结:
1、DH算法⽐较复杂,需要根据公钥⽣成⾃⼰的秘钥对,然后使⽤公钥和⾃⼰的私钥⽣成⾃⼰的本地秘钥在进⾏加密。
2、RSA相对来讲简单的多,⽀持公钥加密、私钥解密,私钥加密、公钥解密。
3、ElGamal算法和RSA类似,但是只⽀持公钥加密,私钥解密,不⽀持私钥加密,公钥解密。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论