已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java中的加密方法:基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法MD5(Message Digest algorithm 5,信息摘要算法)SHA(Secure Hash Algorithm,安全散列算法)HMAC(Hash Message Authentication Code,散列消息鉴别码)复杂的对称加密(DES、PBE)、非对称加密算法: DES(Data Encryption Standard,数据加密算法)PBE(Password-based encryption,基于密码验证)RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)DH(Diffie-Hellman算法,密钥一致协议)DSA(Digital Signature Algorithm,数字签名)ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。对称加密算法:在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。对称加密算法,最常用的莫过于DES数据加密算法。DESDES-Data Encryption Standard,即数据加密算法。是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包import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;public class DESCoder private static final byte DES_KEY = 21, 1, -110, 82, -32, -85, -128, -65 ; /* * 数据加密,算法(DES) * * param data * 要进行加密的数据 * return 加密后的数据 */ public static String encryptBasedDes(String data) String encryptedData = null; try / DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); DESKeySpec deskey = new DESKeySpec(DES_KEY); / 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey key = keyFactory.generateSecret(deskey); / 加密对象 Cipher cipher = Cipher.getInstance(DES); cipher.init(Cipher.ENCRYPT_MODE, key, sr); / 加密,并把字节数组编码成字符串 encryptedData = new sun.misc.BASE64Encoder().encode(cipher.doFinal(data.getBytes(); catch (Exception e) / log.error(加密错误,错误信息:, e); throw new RuntimeException(加密错误,错误信息:, e); return encryptedData; /* * 数据解密,算法(DES) * * param cryptData * 加密数据 * return 解密后的数据 */ public static String decryptBasedDes(String cryptData) String decryptedData = null; try / DES算法要求有一个可信任的随机数源 SecureRandom sr = new SecureRandom(); DESKeySpec deskey = new DESKeySpec(DES_KEY); / 创建一个密匙工厂,然后用它把DESKeySpec转换成一个SecretKey对象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES); SecretKey key = keyFactory.generateSecret(deskey); / 解密对象 Cipher cipher = Cipher.getInstance(DES); cipher.init(Cipher.DECRYPT_MODE, key, sr); / 把字符串解码为字节数组,并解密 decryptedData = new String(cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(cryptData); catch (Exception e) / log.error(解密错误,错误信息:, e); throw new RuntimeException(解密错误,错误信息:, e); return decryptedData; 2、 测试类:public class TestDESCoder public static void main(String args) / TODO Auto-generated method stub String str=0123456789abcdefg; System.out.println(原文:+str); / DES数据加密 String s1=DESCoder.encryptBasedDes(str); System.out.println(“加密后”+s1); / DES数据解密 String s2=DESCoder.decryptBasedDes(s1); System.err.println(“解密后”+s2); 非对称加密算法非对称加密算法(asymmetric cryptographic algorithm)又名“公开密钥加密算法”,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称算法加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。RSA: RSA加密算法是一种典型的非对称加密算法,它基于大数的因式分解数学难题,它也是应用最广泛的非对称加密算法,于1978年由美国麻省理工学院(MIT)的三位学着:Ron Rivest、Adi Shamir 和 Leonard Adlessman 共同提出它是第一个既能用于数据加密也能用于数字签名的算法.RSA同时有两把钥匙,公钥与私钥。同时支持数字签名。数字签名的意义在于,对传输过来的数据进行校验。确保数据在传输工程中不被修改。流程分析:1. 甲方构建密钥对儿,将公钥公布给乙方,将私钥保留。2. 甲方使用私钥加密数据,然后用私钥对加密后的数据签名,发送给乙方签名以及加密后的数据;乙方使用公钥、签名来验证待解密数据是否有效,如果有效使用公钥对数据解密。3. 乙方使用公钥加密数据,向甲方发送经过加密后的数据;甲方获得加密数据,通过私钥解密。具体实现:代码加密常用的工具类跳至12?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.security.PrivateKey;import java.security.PublicKey;import java.security.SecureRandom;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import com.sun.mail.util.BASE64DecoderStream;import com.sun.mail.util.BASE64EncoderStream;public class util /* 传入名文和公钥钥对数据进行RSA解密* 生成时间:2014年5月2日 下午2:38:13* 返回值:String* param src* param pubkey* return*/public static String rsaEncoding(String src,PublicKey pubkey)try Cipher cip = Cipher.getInstance(RSA);cip.init(cip.ENCRYPT_MODE, pubkey);byte by = cip.doFinal(src.getBytes();return new String(BASE64EncoderStream.encode(by); catch (NoSuchAlgorithmException e) throw new RuntimeException(e); catch (NoSuchPaddingException e) throw new RuntimeException(e); catch (InvalidKeyException e) throw new RuntimeException(e); catch (IllegalBlockSizeException e) throw new RuntimeException(e); catch (BadPaddingException e) throw new RuntimeException(e);/* 传入RSA密文和私钥对数据进行解密* 生成时间:2014年5月2日 下午2:37:08* 返回值:String* param sec* param privkey* return*/public static String rsaDeEncoding(String sec,PrivateKey privkey)try Cipher cip = Cipher.getInstance(RSA);cip.init(cip.DECRYPT_MODE, privkey);byte by = BASE64DecoderStream.decode(sec.getBytes();return new String(cip.doFinal(by); catch (NoSuchAlgorithmException e) throw new RuntimeException(e); catch (NoSuchPaddingException e) throw new RuntimeException(e); catch (InvalidKeyException e) throw new RuntimeException(e); catch (IllegalBlockSizeException e) throw new RuntimeException(e); catch (BadPaddingException e) throw new RuntimeException(e);/* 传入字符串、密钥,并加密字符串(对称加密加密),支持:DES、AES、DESede(3DES)* 生成时间:2014年5月2日 下午12:05:44* 返回值:String 密文* param src* param key* param method(DES、AES、DESede)* return*/对称加密加密public static String doubKeyEncoding(String src,String keysrc,String method) SecretKey key;try /生成密钥KeyGenerator kg = KeyGenerator.getInstance(method);/初始化此密钥生成器。kg.init(new SecureRandom(keysrc.getBytes(utf-8);key = kg.generateKey();/加密Cipher ciph = Cipher.getInstance(method);ciph.init(Cipher.ENCRYPT_MODE, key);ciph.update(src.getBytes(utf-8);/使用64进行编码,一避免出现丢数据情景byte by = BASE64EncoderStream.encode(ciph.doFinal();return new String(by); catch (NoSuchAlgorithmException e) throw new RuntimeException(e); catch (NoSuchPaddingException e) throw new RuntimeException(e); catch (InvalidKeyException e) throw new RuntimeException(e); catch (IllegalBlockSizeException e) throw new RuntimeException(e); catch (BadPaddingException e) throw new RuntimeException(e); catch (UnsupportedEncodingException e) throw new RuntimeException(e);/* 传入字符串、密钥、加密方式,并解密字符串(对称加密解密密),支持:DES、AES、DESede(3DES)* 生成时间:2014年5月2日 下午1:12:13* 返回值:String 密钥原文* param sec* param key* param method(DES、AES、DESede)* return*/public static String doubKeyDencoding(String sec,String keysrc,String method) SecretKey key;try /生成密钥KeyGenerator kg = KeyGenerator.getInstance(method);/初始化此密钥生成器。kg.init(new SecureRandom(keysrc.getBytes(utf-8);key = kg.generateKey();/加密Cipher ciph = Cipher.getInstance(method);ciph.init(ciph.DECRYPT_MODE, key);/使用64进行解码,一避免出现丢数据情景byte by = BASE64DecoderStream.decode(sec.getBytes();ciph.update(by);return new String(ciph.doFinal(); catch (NoSuchAlgorithmException e) throw new RuntimeException(e); catch (NoSuchPaddingException e) throw new RuntimeException(e); catch (InvalidKeyException e) throw new RuntimeException(e); catch (IllegalBlockSizeException e) throw new RuntimeException(e); catch (BadPaddingException e) throw new RuntimeException(e); catch (UnsupportedEncodingException e) throw new RuntimeException(e);/* 单向信息加密(信息摘要),支持:md5、md2、SHA(SHA-1,SHA1)、SHA-256、SHA-384、SHA-512,* 生成时间:2014年5月2日 上午11:13:44* 返回值:String 加密后的密文* param src 传入加密字符串(明文)* param method 指定算法(md5、md2、SHA(SHA-1,SHA1)、SHA-256、SHA-384、SHA-512)* return*/public static String ecodingPasswd(String src,String method)try /信息摘要算法MessageDigest md5 = MessageDigest.getInstance(method);md5.update(src.getBytes();byte encoding = md5.digest();/使用64进行编码,一避免出现丢数据情景return new String(BASE64EncoderStream.encode(encoding); catch (NoSuchAlgorithmException e) throw new RuntimeException(e+加密失败!);完整代码实现:1、A加密解密JAVA类的具体实现。?123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354importjava.security.MessageDigest;importsun.misc.BASE64Decoder;importsun.misc.BASE64Encoder;publicclassCoderpublicstaticfinalStringKEY_SHA=SHA;publicstaticfinalStringKEY_MD5=MD5;/*BASE64解密*paramkey*return*throwsException*/publicstaticbytedecryptBASE64(Stringkey)throwsExceptionreturn(newBASE64Decoder().decodeBuffer(key);/*BASE64加密*paramkey*return*throwsException*/publicstaticStringencryptBASE64(bytekey)throwsExceptionreturn(newBASE64Encoder().encodeBuffer(key);/*MD5加密*paramdata*return*throwsException*/publicstaticbyteencryptMD5(bytedata)throwsExceptionMessageDigestmd5=MessageDigest.getInstance(KEY_MD5);md5.update(data);returnmd5.digest();/*SHA加密*paramdata*return*throwsException*/publicstaticbyteencryptSHA(bytedata)throwsExceptionMessageDigestsha=MessageDigest.getInstance(KEY_SHA);sha.update(data);returnsha.digest();先提供Coder编码类,该类封装了基本的Base64、md5和SHA加密解密算法。Java对这些算法的实现提供了很好的API封装,开发人员只需调用这些API就可很简单方便的实现数据的加密与解密。 下面提供RSA加密解密类,该类为Coder类子类,因为其中对RSA公私密钥的保存进行了一层Base64加密处理。RSA加密解密类静态常量?12345publicstaticfinalStringKEY_ALGORTHM=RSA;/publicstaticfinalStringSIGNATURE_ALGORITHM=MD5withRSA;publicstaticfinalStringPUBLIC_KEY=RSAPublicKey;/公钥publicstaticfinalStringPRIVATE_KEY=RSAPrivateKey;/私钥RSA加密解密的实现,需要有一对公私密钥,公私密钥的初始化如下:?123456789101112131415161718192021/*初始化密钥*return*throwsException*/publicstaticMapinitKey()throwsExceptionKeyPairGeneratorkeyPairGenerator=KeyPairGenerator.getInstance(KEY_ALGORTHM);keyPairGenerator.initialize(1024);KeyPairkeyPair=keyPairGenerator.generateKeyPair();/公钥RSAPublicKeypublicKey=(RSAPublicKey)keyPair.getPublic();/私钥RSAPrivateKeyprivateKey=(RSAPrivateKey)keyPair.getPrivate();MapkeyMap=newHashMap(2);keyMap.put(PUBLIC_KEY,publicKey);keyMap.put(PRIVATE_KEY,privateKey);returnkeyMap; 从代码中可以看出密钥的初始化长度为1024位,密钥的长度越长,安全性就越好,但是加密解密所用的时间就会越多。而一次能加密的密文长度也与密钥的长度成正比。一次能加密的密文长度为:密钥的长度/8-11。所以1024bit长度的密钥一次可以加密的密文为1024/8-11=117bit。所以非对称加密一般都用于加密对称加密算法的密钥,而不是直接加密内容。对于小文件可以使用RSA加密,但加密过程仍可能会使用分段加密。 从map中获取公钥、私钥?123456789101112131415161718192021/*取得公钥,并转化为String类型*paramkeyMap*return*throwsException*/publicstaticStringgetPublicKey(MapkeyMap)throwsExceptionKeykey=(Key)keyMap.get(PUBLIC_KEY);returnencryptBASE64(key.getEncoded();/*取得私钥,并转化为String类型*paramkeyMap*return*throwsException*/publicstaticStringgetPrivateKey(MapkeyMap)throwsExceptionKeykey=(Key)keyMap.get(PRIVATE_KEY);returnencryptBASE64(key.getEncoded(); 对于RSA产生的公钥、私钥,我们可以有两种方式可以对信息进行加密解密。私钥加密-公钥解密 和 公钥加密-私钥解密。 私钥加密?123456789101112131415161718192021/*用私钥加密*paramdata 加密数据*paramkey 密钥*return*throwsException*/publicstaticbyteencryptByPrivateKey(bytedata,Stringkey)throwsException/解密密钥bytekeyBytes=decryptBASE64(key);/取私钥PKCS8EncodedKeySpecpkcs8EncodedKeySpec=newPKCS8EncodedKeySpec(keyBytes);KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORTHM);KeyprivateKey=keyFactory.generatePrivate(pkcs8EncodedKeySpec);/对数据加密Ciphercipher=Cipher.getInstance(keyFactory.getAlgorithm();cipher.init(Cipher.ENCRYPT_MODE,privateKey);returncipher.doFinal(data);私钥解密?12345678910111213141516171819/*用私钥解密*paramdata 加密数据*paramkey 密钥*return*throwsException*/publicstaticbytedecryptByPrivateKey(bytedata,Stringkey)throwsException/对私钥解密bytekeyBytes=decryptBASE64(key);PKCS8EncodedKeySpecpkcs8EncodedKeySpec=newPKCS8EncodedKeySpec(keyBytes);KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORTHM);KeyprivateKey=keyFactory.generatePrivate(pkcs8EncodedKeySpec);/对数据解密Ciphercipher=Cipher.getInstance(keyFactory.getAlgorithm();cipher.init(Cipher.DECRYPT_MODE,privateKey);returncipher.doFinal(data); 公钥加密?123456789101112131415161718192021/*用公钥加密*paramdata 加密数据*paramkey 密钥*return*throwsException*/publicstaticbyteencryptByPublicKey(bytedata,Stringkey)throwsException/对公钥解密bytekeyBytes=decryptBASE64(key);/取公钥X509EncodedKeySpecx509EncodedKeySpec=newX509EncodedKeySpec(keyBytes);KeyFactoryke
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 酒店员工绩效管理与激励措施
- 职工劳动合同签订流程与注意事项
- 2026年河南职业技术学院单招职业适应性测试必刷测试卷附答案
- 2026年常州机电职业技术学院单招综合素质考试题库及答案1套
- 2026年四川水利职业技术学院单招职业技能测试题库新版
- 2026年山东铝业职业学院单招综合素质考试必刷测试卷新版
- 2026年松原职业技术学院单招职业倾向性考试题库必考题
- 2026年潍坊护理职业学院单招职业适应性考试必刷测试卷必考题
- 2026年廊坊卫生职业学院单招职业技能测试必刷测试卷及答案1套
- 2026年甘肃省平凉地区单招职业倾向性测试必刷测试卷新版
- 国企物业考试试题及答案
- 安全评估任务书的风险评估3篇
- 测绘学概论讲解课件
- 健康食品购买免责声明合同
- 屋面爬梯施工合同协议
- 国家综合性消防救援队伍《处分条令》解读-条令学习月专题授课
- 机务非正常行车应急处置办法79课件
- 建筑劳务财务管理制度
- 口腔科牙周炎护理个案
- 智慧树知到《Office高效办公(西安欧亚学院)》2025章节测试附答案
- T-CET 411-2024 铁路场所LED 照明技术规范
评论
0/150
提交评论