常用加解密技术介绍

hiKirin 2013-11-19

通常把加密方法分为以下几类

       1.单向加密算法 顾名思义,这种算法只能加密,不能解密,是不可逆的,所以叫做单向加密算法。这些算法又称摘要算法,就类似给一篇短文做一个提纲一样。相同的短文,做出来的提纲是相同的,因此,可以根据提纲来判断是不是那个短文;又因为只有提纲,是无法知道原来的短文具体是怎么写的,所以又是不可逆的。

       所以这种算法通常被用作对数据进行签名。

       1.MD5(Message Digest algorithm 5,信息摘要算法)

       2.SHA(Secure Hash Algorithm,安全散列算法)

       3.HMAC(Hash Message Authentication Code,散列消息鉴别码)

       MD5、SHA、HMAC这三种加密算法,通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠,通常与其他对称或非对称加密算法一起使用。 例如:

       Signature dsa = Signature.getInstance("SHA1withRSA");

       SHA1withRSA就是说明这是通过SHA1算法签名并通过RSA算法加密之后得到签名(也叫文件摘要)的方式。

       还有一种算法经常在加解密时使用, BASE64算法,BASE64严格地说,属于编码格式,而非加密算法。这种算法用于把字节数组转化成字符串,方便存储和传输和阅读。

2.对称加密算法
   对称加密(也叫私钥加密)指加密和解密使用相同密钥的加密算法。有时又叫传统密码算法,就是加密密钥和解密密钥是相同的,或者加密/解密密钥能够从解密/加密密钥中推算出来,所以也称这种加密算法为秘密密钥算法或单密钥算法。
   对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。
   常见对称加密算法如下:
   1.DES算法
   2.3DES/edeDES/TDES算法
   3.AES算法
   4.Twofish算法
   5.Blowfish算法
   6.RC2算法
   7.RC4算法
   8.RC5算法
   9.RC6算法
   10.PBE算法
   11.CAST算法
   12.IDEA算法
3.非对称加密算法
   非对称加密算法(asymmetric cryptographic algorithm)又名“公开密钥加密算法”。
    非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。另一方面,甲方可以使用自己的私密钥对机密信息进行加密后再发送给乙方;乙方再用甲方的公钥对加密后的信息进行解密。
    非对称密码体制的特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。
   常见非对称算法有如下几种:
   1.RSA算法
   2.DH算法
   3.DSA-Digital Signature Algorithm(数字签名算法)
   4.ECC-Elliptic Curves Cryptography(椭圆曲线密码编码学)
 加解密算法使用说明(java语言)

一、BASE64编码算法
    BASE64算法类似于URLEncoder/URLDecoder类的算法,实际上是一种转码的算法,并不是加密算法。转码后,每76个字符加一个换行符。
    BASE64的实现类比较多,简单介绍2种。
   1)JDK自带实现类
 参见示例代码Base64Test.java。
 2)bouncy castle实现类
 参见示例代码BCBase64Test.java。
二、单向加密算法
1.MD5
     message digest algorithm 5 (信息摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。不管文件多大,经过MD5后都能生成唯一的MD5值,这个值的长度都是128位,即16个字节。
   MD系列包括如下算法:
   1.md2,摘要长度128位,16个字节,已过时
   2.md4,摘要长度128位,16个字节,已过时
   3.md5,摘要长度128位,16个字节
    此外,还有一种RIPEMD算法,是Hans Dobbertin等3人在md4,md5的基础上,于1996年提出来的,顾名思义RIPEMD就是成熟md算法。算法共有4个标准128、160、256和320,其对应输出长度分别为16字节、20字节、32字节和40字节。不过,让人难以致信的是RIPEMD的设计者们根本就没有真正设计256和320位这2种标准,他们只是在128位和160位的基础上,修改了部分参数来达到输出为256和320位的目的。所以,256位的强度和128相当,而320位的强度和160位相当。
   RIPEMD系列算法如下
   1.ripemd128,摘要长度128位,16个字节
   2.ripemd160,摘要长度160位,20个字节
   3.ripemd256,相当于ripemd128算法
   4.ripemd320,相当于ripemd160算法
   摘要长度越长,破解难度也就越大,安全性也就越高。
   应用代码参见示例Md5Test.java

   2.SHA
   SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了,但是SHA仍然是公认的安全加密算法,较之MD5更为安全。SHA系列算法要求输入消息的长度不超过264位,1G=230位,最大长度为234G,实际应用中不会出现超过最大限制的数据,可以不考虑消息长度的问题。
    SHA系列算法包括如下几种:
    1.SHA1/SHA,摘要长度160位,20个字节
    2.SHA256,摘要长度256位,32个字节
    3.SHA384,摘要长度384位,48个字节
    4.SHA512,摘要长度512位,64个字节
    摘要长度越长,破解难度也就越大,安全性也就越高。
    应用代码参见示例ShaTest.java。
    3.HMAC  HMAC(Hash Message Authentication Code),散列消息鉴别码,基于密钥的Hash算法的认证协议,也叫MAC算法。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即摘要,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥及摘要进行鉴别认证等。
    应用代码参见示例HmacTest.java。

    三、对称加密算法
    1.DES   DES-Data Encryption Standard,即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。?   DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。
    应用代码参见示例DesSingleTest.java。
2.3DES
  3DES(即Triple DES)是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。
   之所以称为3DES,是因为该算法加解密时使用3个密钥k1,k2,k3,操作过程如下:
   加密过程:加密(使用k1)-解密(使用k2)-加密(使用k3)
   解密过程:解密(使用k3)-加密(使用k2)-解密(使用k1)
  加密/解密均操作了3次,相当于进行了3次DES加密/解密,所以叫做3DES,当然其需要的运算时间要比DES算法多。
   实际使用时,密钥长度需要为24个字节,这24个字节会被分为3个8字节段,k1,k2,k3均从8字节段中取56位得出。
   应用代码参见示例DesedeTest.java。
3.AES
    AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。AES是一个标准,并不是具体的加密算法。
  AES标准的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。1998年NIST开始AES第一轮分析、测试和征集,共产生了15个候选算法。1999年3月完成了第二轮AES2的分析、测试。2000年10月2日美国政府正式宣布选中比利时密码学家Joan Daemen 和 Vincent Rijmen 提出的一种密码算法RIJNDAEL 作为AES的标准算法,也叫RIJNDAEL算法。该算法支持密钥长度为128位。
    应用代码参见示例AesTest.java。
4.Twofish
    Twofish?则是counterpane?公司向NIST提交的一种满足AES要求的加密算法。Twofish采用128位数据块(128?bits?block),128-192-256-bit?可变长度密钥。这中算法比DES和RIJNDAEL算法速度更快,灵活性更高。
    应用代码参见示例TwoFishTest.java。
5.Blowfish
  Blowfish是1993年布鲁斯·施奈尔(Bruce Schneier)开发的对称密钥区块加密算法,区块长为64位,密钥为1至448位的可变长度。与DES等算法相比,其处理速度较快。因为其无须授权即可使用,作为一种自由授权的加密方式在SSH、文件加密软件等被广泛地使用。
   blowfish算法的密钥位长度位数必须为8的整数倍。
   应用代码参见示例BlowFishTest.java。
6.RC2
  RC2是由著名密码学家Ron Rivest设计的一种传统对称分组加密算法,它可作为DES算法的建议替代算法。它的输入和输出都是64比特。密钥的长度是从1字节到128字节可变。
   应用代码参见示例RC2Test.java、RC2JavaTest.java。
7.RC4
   RC4算法是一种在电子信息领域加密的技术手段,用于无线通信网络。RC4加密算法是大名鼎鼎的RSA三人组中的头号人物Ron Rivest在1987年设计的密钥长度可变的流加密算法。该算法的速度可以达到DES加密的10倍左右。密钥长度1-256字节。
  RC4广泛应用在安全套接字层(SSL)(用来保护网络上传输的数据)和WEP(无线网络数据保护)上。以色列魏茨曼研究所和美国思科公司的研究者发现,在使用“有线等效保密规则”(WEP)的无线网络中,在特定情况下,人们可以逆转RC4算法的加密过程,获取密钥,从而将己加密的信息解密。实现这一过程并不复杂,只需要使用一台个人电脑对加密的数据进行分析,经过几个小时的时间就可以破译出信息的全部内容。所以在设置无线网的密码加密方式时最好选择WPA加密方式,提高安全性。
   应用代码参见示例RC4Test.java。
8.RC5
   RC5分组密码算法是1994由麻萨诸塞技术研究所的Ronald L. Rivest教授发明的,并由RSA实验室分析。是一种非常快速且简单的算法,由块尺寸、运算轮数和密钥长度参数化,这些参数能被调整,以满足不同的安全需求。Bouncy Castle加密包提供块长度为32和642种方式。
     块长度:常用16,32,64位;运算轮数有效值:1-255;密钥字节长度有效值:1-255。
     应用代码参见示例RC5Test.java、RC5JavaTest.java。
9.RC6
   RC6算法是在RC5算法的基础上设计的,也是由麻萨诸塞技术研究所的Ronald L. Rivest教授设计,是根据AES标准在RC5算法的基础上实现的。因此,RC6也可以指定和RC5一样的块长度,运算轮数,密钥字节长度。
     有实验表明:
     ①从程序的执行效率来看,无论在加密还是在解密过程中,RC5算法都要比RC6算法执行效率高。因此,在一些非常注重程序执行效率,而对数据安全性要求不是非常高的情况下,应该采用RC5算法。
     ②从程序的执行时间来看,无论在加密过程还是在解密过程中,RC5算法都要比RC6算法省时。因此,在一些对程序执行时间长短要求很高,对数据安全性要求不是非常高的情况下,可以采用RC5算法。
     ③从程序的大小来看,无论在加密过程中还是在解密过程中,RC5算法都要比RC6算法更简洁。因此,在一些对程序所用空间大小要求很高,对数据安全性要求不是非常高的情况下,可以采用RC5算法。
     ④从安全性角度考虑,RC6算法是在RC5算法基础之上针对RC5算法中的漏洞,主要是循环移位的位移量并不取决于要移动次数的所有比特,通过采用引入乘法运算来决定循环移位次数的方法,对RC5算法进行了改进,从而大大提高了RC6算法的安全性。因此,在一些对数据安全性要求很高的情况下,应该采用RC6算法。
    应用代码参见示例RC6Test.java。
10.PBE
?    PBE—Password-based encryption(基于密码加密)。其特点在于口令由用户自己掌管,不借助任何物理媒体;由用户提供初始密码和初始盐(也可以看做是第二个密码),采用单向加密和对称加密算法混合加密,是一种简便、安全的加密方式。需要注意的是,盐只能是64位,8个字节,不能多于或者少于64位。密码长度不限。
    应用代码参见示例PBETest.java。
11.CAST
   CAST算法是由加拿大的Carlisle Adams(Entrust Technologies)和Stafford Tavares共同设计的。尽管CAST常常被看作算法,实际上它是用于构造算法的设计过程。  
CAST设计过程的细节已经向密码学界公布了,专家们可以评论和分析它,并且必须承受全部密码分析的尝试。各种各样的研究表明CAST比DES具有更强的抗攻击能力,而且在加密和解密上要更快一些。CAST算法比典型的DES算法大约快5-6倍。
     CAST算法是分组算法,它使用64位分组作为输入。CAST算法的设计允许可变的密钥长度,变化范围在40-256位。“CAST算法”使用的迭代轮数由设计者决定。报告已经显示一个仅仅使用8轮迭代的“CAST算法”比DES(使用16轮迭代)具有稍强一些的抗攻击能力。CAST算法已经被美国和加拿大政府接受作为代替DES的候选算法之一。
    Bouncy Castle实现支持2种方式:
    1)Cast5,64位分组,密钥长度1-128位,应用代码参见示例CAST5Test.java。
    2)Cast6,128位分组,密钥长度1-256位,应用代码参见示例CAST6Test.java。
12.IDEA
  IDEA(International Data Encryption Algorithm)是瑞士的James Massey,Xuejia Lai等人提出的加密算法,在密码学中属于数据块加密算法(Block Cipher)类。IDEA使用长度为128bit的密钥,数据块大小为64bit。从理论上讲,IDEA属于“强”加密算法,至今还没有出现对该算法的有效攻击算法。早在1990年,Xuejia Lai等人在EuroCrypt’90年会上提出了分组密码建议PES(Proposed Encryption Standard)。在EuroCrypt’91年会上, Xuejia Lai等人又提出了PES的修正版IPES(Improved PES)。目前IPES已经商品化,并改名为IDEA。IDEA已由瑞士的Ascom公司注册专利,以商业目的使用IDEA算法必须向该公司申请许可。
   应用代码参见示例IDEATest.java。
四、非对称加密算法
1. RSA  这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。

这种加密算法的特点主要是密钥的变化,上文我们看到DES只有一个密钥。相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了。RSA同时有两把钥匙,公钥与私钥。同时支持数字签名。数字签名的意义在于,对传输过来的数据进行校验。确保数据在传输工程中不被修改。
     数字签名在实际应用中需要数字证书,简单介绍下Java中数字证书的生成方法。
     1).jdk安装路径下有一个keytool的工具程序,这个工具就是用来生成数字证书的。
     2).生成私钥文件
     使用命令行,切换目录到keytool所在的文件夹,执行下面的命令
     keytool -genkey -validity 36000 -alias rsatest -keyalg RSA -keysize 1024 -storetype jks -keypass 123456 -storepass 123456 -keystore d:\log\test.jks
  其中    

-genkey表示生成密钥    

-validity指定证书有效期,这里是36000天    

-alias指定别名,这里是rsatest
-keyalg指定算法,这里是RSA
-keysize 指定生成的密钥长度,这里是1024
-storetype 指定私钥文件的格式,这里是常用的jks格式,如果不指定,则默认为keystore格式
-keypass指定私钥的访问密码,这里是123456
-storepass指定私钥文件的访问密码,这里是123456   

-keystore指定存储位置,这里是d:\log\test.jks
     3).导出公钥证书    
     执行下面的命令:
     keytool -export -keystore d:\log\test.jks -alias rsatest -storepass 123456 -file d:\log\test.cer -rfc
     其中   

-export指定为导出操作  

-keystore指定keystore文件    

-alias指定导出keystore文件中的别名
-storepass指定私钥访问密码,这里是123456    

-file指向导出路径    

-rfc以文本格式输出,也就是以BASE64编码输出    

生成了数字证书文件,就可以通过证书文件进行签名了。
应用代码参见示例RsaTest.java。
     4).CA认证
     我们自己导出的公钥证书只能作为测试用,如果要求在互联网上使用,则可以使用特殊手段伪造同样的证书,这样是不安全的,所以如果有一个被普遍信任的机构再对我们的证书进行一次签名,使得我们的证书无法伪造,就会比较安全。CA机构就是要解决这个问题的。
     CA机构,又称为证书授证(Certificate Authority)中心,作为电子商务交易中受信任的第三方,相当于公证人的角色。它承担公钥体系中公钥的合法性检验的责任。CA机构使用它的证书(又称为根证书)对用户提交的证书进行签名,使得攻击者不能伪造和篡改用户证书。一般各种浏览器都会安装主流CA机构的根证书,只要是由这些机构认证过的证书都被浏览器信任;否则,浏览器将给出警告。如果浏览器没有某个CA机构的根证书,可以由用户安装。(网上订过火车票的同事应该已经知道如何安装)
     申请CA机构的官方认证,需要提交证书申请文件,使用如下命令生成
     keytool -certreq -alias rsatest -file d:\log\test.csr -keystore d:\log\test.jks -storepass 123456 –v
     该命令会产生test.csr证书申请文件,把该文件提交给CA机构,就可以得到官方认证的公钥证书,多为p7b格式。
     应用代码参见示例RsaTest.java。
2.DH
Diffie-Hellman算法(D-H算法),密钥一致协议。是由公开密钥密码体制的奠基人Diffie和Hellman所提出的一种思想。DH算法综合使用了对称加密和非对称加密技术。DH算法的交互流程如下:
1.甲方构建密钥对儿,将公钥公布给乙方,将私钥保留;双方约定数据加密算法;乙方通过甲方公钥构建密钥对儿,将公钥公布给甲方,将私钥保留。?     2.甲方使用私钥、乙方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥加密数据,发送给乙方加密后的数据;乙方使用私钥、甲方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥对数据解密。?     3.乙方使用私钥、甲方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥加密数据,发送给甲方加密后的数据;甲方使用私钥、乙方公钥、约定数据加密算法构建本地密钥,然后通过本地密钥对数据解密。
应用代码参见示例DhTest.java。

3.DSA  
DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。如果数据和签名不匹配则认为验证失败!数字签名的作用就是校验数据在传输过程中不被修改。
DSA算法也可以使用文件形式的数字证书,制作方法同RSA证书,如:
keytool -genkey -validity 36000 -alias dsatest -keyalg DSA -keysize 1024 -storetype jks -keypass 123456 -storepass 123456 -keystore d:\log\dsatest.jks
导出证书:
keytool -export -keystore d:\log\dsatest.jks -alias dsatest -storepass 123456 -file d:\log\dsatest.cer -rfc
应用代码参见示例DsaTest.java。
4.ECC   ECC(Elliptic Curves Cryptography),椭圆曲线密码编码学,是目前已知的公钥体制中,对每比特所提供加密强度最高的一种体制。在软件注册保护方面起到很大的作用,一般的序列号通常由该算法产生。
ECC算法在jdk1.5后加入支持,目前仅仅只能完成密钥的生成与解析。 如果想要获得ECC算法实现,需要调用硬件完成加密/解密(ECC算法相当耗费资源,如果单纯使用CPU进行加密/解密,效率低下)。涉及到Java Card领域,PKCS#11。

附:安装bouncy castle算法包
  在java中实现很多加密算法的时候都需要使用到bouncy castle的算法包,可以使用如下代码添加该包提供的功能:
 Security.addProvider(new BouncyCastleProvider());
    为了方便使用,该算法包可以手工配置到jre环境中,简单介绍下配置方法。
 1.获取算法包
      bouncy castle官网:www.bouncycastle.org/,根据所使用的jdk,到该网站获取对应版本的jar包。我用的是jdk1.4,用的是bcprov-jdk14-139.jar。
 2.把bcprov-jdk14-139.jar复制到jdk安装目录\jre\lib\ext目录下

 3.编辑jdk安装目录\jre\lib\security下java.security文件
  使用编辑工具打开java.security文件后找到如下片段:    
security.provider.1=sun.security.provider.Sun
security.provider.2=com.sun.net.ssl.internal.ssl.Provider
security.provider.3=com.sun.rsajca.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvide
在最后声明security.provider的一行代码之后再添加一行:
rsecurity.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider
6,是由前面一行的数值加1得到的;org.bouncycastle.jce.provider.BouncyCastleProvider就是bouncy castle的算法提供者,jdk在前5个算法提供者中都找不到相应的算法时就会到该类中查找。

4.可以使用bouncy castle算法包了。

相关推荐