您好,欢迎访问三七文档
Java中的加密方法:基本的单向加密算法:BASE64严格地说,属于编码格式,而非加密算法MD5(MessageDigestalgorithm5,信息摘要算法)SHA(SecureHashAlgorithm,安全散列算法)HMAC(HashMessageAuthenticationCode,散列消息鉴别码)复杂的对称加密(DES、PBE)、非对称加密算法:DES(DataEncryptionStandard,数据加密算法)PBE(Password-basedencryption,基于密码验证)RSA(算法的名字以发明者的名字命名:RonRivest,AdiShamir和LeonardAdleman)DH(Diffie-Hellman算法,密钥一致协议)DSA(DigitalSignatureAlgorithm,数字签名)ECC(EllipticCurvesCryptography,椭圆曲线密码编码学)MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。对称加密算法:在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。对称加密算法,最常用的莫过于DES数据加密算法。DESDES-DataEncryptionStandard,即数据加密算法。是IBM公司于1975年研究成功并公开发表的。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位。优点:算法公开、计算量小、加密速度快、加密效率高。缺点:(1)交易双方都使用同样钥匙,安全性得不到保证。(2)每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。具体实现:1、工具类需要导入javabase64-1.3.1包importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.SecretKey;importjavax.crypto.SecretKeyFactory;importjavax.crypto.spec.DESKeySpec;publicclassDESCoder{privatestaticfinalbyte[]DES_KEY={21,1,-110,82,-32,-85,-128,-65};/***数据加密,算法(DES)**@paramdata*要进行加密的数据*@return加密后的数据*/publicstaticStringencryptBasedDes(Stringdata){StringencryptedData=null;try{//DES算法要求有一个可信任的随机数源SecureRandomsr=newSecureRandom();DESKeySpecdeskey=newDESKeySpec(DES_KEY);//创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance(DES);SecretKeykey=keyFactory.generateSecret(deskey);//加密对象Ciphercipher=Cipher.getInstance(DES);cipher.init(Cipher.ENCRYPT_MODE,key,sr);//加密,并把字节数组编码成字符串encryptedData=newsun.misc.BASE64Encoder().encode(cipher.doFinal(data.getBytes()));}catch(Exceptione){//log.error(加密错误,错误信息:,e);thrownewRuntimeException(加密错误,错误信息:,e);}returnencryptedData;}/***数据解密,算法(DES)**@paramcryptData*加密数据*@return解密后的数据*/publicstaticStringdecryptBasedDes(StringcryptData){StringdecryptedData=null;try{//DES算法要求有一个可信任的随机数源SecureRandomsr=newSecureRandom();DESKeySpecdeskey=newDESKeySpec(DES_KEY);//创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象SecretKeyFactorykeyFactory=SecretKeyFactory.getInstance(DES);SecretKeykey=keyFactory.generateSecret(deskey);//解密对象Ciphercipher=Cipher.getInstance(DES);cipher.init(Cipher.DECRYPT_MODE,key,sr);//把字符串解码为字节数组,并解密decryptedData=newString(cipher.doFinal(newsun.misc.BASE64Decoder().decodeBuffer(cryptData)));}catch(Exceptione){//log.error(解密错误,错误信息:,e);thrownewRuntimeException(解密错误,错误信息:,e);}returndecryptedData;}}2、测试类:publicclassTestDESCoder{publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubStringstr=0123456789abcdefg;System.out.println(原文:+str);//DES数据加密Strings1=DESCoder.encryptBasedDes(str);System.out.println(“加密后”+s1);//DES数据解密Strings2=DESCoder.decryptBasedDes(s1);System.err.println(“解密后”+s2);}}非对称加密算法非对称加密算法(asymmetriccryptographicalgorithm)又名“公开密钥加密算法”,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称算法加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。RSA:RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法,于1978年由美国麻省理工学院(MIT)的三位学着:RonRivest、AdiShamir和LeonardAdlessman共同提出它是第一个既能用于数据加密也能用于数字签名的算法.RSA同时有两把钥匙,公钥与私钥。同时支持数字签名。数字签名的意义在于,对传输过来的数据进行校验。确保数据在传输工程中不被修改。流程分析:1.甲方构建密钥对儿,将公钥公布给乙方,将私钥保留。2.甲方使用私钥加密数据,然后用私钥对加密后的数据签名,发送给乙方签名以及加密后的数据;乙方使用公钥、签名来验证待解密数据是否有效,如果有效使用公钥对数据解密。3.乙方使用公钥加密数据,向甲方发送经过加密后的数据;甲方获得加密数据,通过私钥解密。具体实现:[代码]加密常用的工具类跳至[1][2]?1234567891011121314151617181920212223242526272829303132333435363738394041importjava.io.UnsupportedEncodingException;importjava.security.InvalidKeyException;importjava.security.MessageDigest;importjava.security.NoSuchAlgorithmException;importjava.security.PrivateKey;importjava.security.PublicKey;importjava.security.SecureRandom;importjavax.crypto.BadPaddingException;importjavax.crypto.Cipher;importjavax.crypto.IllegalBlockSizeException;importjavax.crypto.KeyGenerator;importjavax.crypto.NoSuchPaddingException;importjavax.crypto.SecretKey;importcom.sun.mail.util.BASE64DecoderStream;importcom.sun.mail.util.BASE64EncoderStream;publicclassutil{/***传入名文和公钥钥对数据进行RSA解密*br生成时间:2014年5月2日下午2:38:13*br返回值:String*br@paramsrc*br@parampubkey*br@return*/publicstaticStringrsaEncoding(Stringsrc,PublicKeypubkey){try{Ciphercip=Cipher.getInstance(RSA);cip.init(cip.ENCRYPT_MODE,pubkey);byte[]by=cip.doFinal(src.getBytes());returnnewString(BASE64EncoderStream.encode(by));}catch(NoSuchAlgorithmExceptione){thrownewRuntimeException(e);}catch(NoSuchPaddingExceptione){thrownewRuntimeException(e);}catch(InvalidKeyExceptione){thrownewRuntimeExc
本文标题:证书及加密
链接地址:https://www.777doc.com/doc-2024913 .html