Java加密技术(转)

Java加密技术(一)

.threadtags_tag {margin:0px !important;background:none !important;padding:12px 0 !important;color: #444 !important;}.threadtags_tag span {border:1px solid #EFEFEF; padding:10px 14px 10px 32px; background: url(http://images.5d6d.net/dz7/default/tag.gif) no-repeat 10px 50%;}.threadtags_tag a{color:#E77B0F !important;}
相关搜索: Java, 加密技术

加密解密,曾经是我一个毕业设计的重要组件。在工作了多年以后回想当时那个加密、解密算法,实在是太单纯了。
    言归正传,这里我们主要描述Java已经实现的一些加密解密算法。
    如基本的单向加密算法:

  • BASE64
  • MD5(Message-Digest algorithm 5,信息-摘要算法)
  • SHA(Secure Hash Algorithm,安全散列算法)


    复杂的对称加密(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,椭圆曲线密码编码学)



    本片内容简要介绍BASE64MD5SHA三种加密方法。
    这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。

BASE64
按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)
常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。

通过java代码

实现如下:

  1. /**
  2. * BASE64解密
  3. *
  4. * @param key
  5. * @return
  6. * @throws Exception
  7. */
  8. public static byte[] decryptBASE64(String key) throws Exception {
  9. return (new BASE64Decoder()).decodeBuffer(key);
  10. }
  11. /**
  12. * BASE64加密
  13. *
  14. * @param key
  15. * @return
  16. * @throws Exception
  17. */
  18. public static String encryptBASE64(byte[] key) throws Exception {
  19. return (new BASE64Encoder()).encodeBuffer(key);
  20. }
复制代码

主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字符数是8的倍数,如果不够位数以=符号填充。

MD5
MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。校验?不管文件多大,经过MD5后都能生成唯一的MD5值。好比现在的ISO校验,都是MD5校验。怎么用?当然是把ISO经过MD5后产生MD5的值。一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。就是用来验证文件是否一致的。

通过java代码实现如下:

  1. /**
  2.   * MD5加密
  3.   *
  4.   * @param data
  5.   * @return
  6.   * @throws Exception
  7.   */
  8. public static byte[] encryptMD5(byte[] data) throws Exception {
  9.   MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
  10.   md5.update(data);
  11.   return md5.digest();
  12. }
复制代码

通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。

SHA
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。
通过java代码实现如下:

  1. /**
  2.   * SHA加密
  3.   *
  4.   * @param data
  5.   * @return
  6.   * @throws Exception
  7.   */
  8. public static byte[] encryptSHA(byte[] data) throws Exception {
  9.   MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
  10.   sha.update(data);
  11.   return sha.digest();
  12. }
  13. }
复制代码

类似于MD5,我们不直接使用上述SHA加密。通常将SHA产生的字节数组交给BASE64再加密一把,得到相应的字符串。

给出一个完整类,如下:

  1. import java.security.MessageDigest;
  2. import sun.misc.BASE64Decoder;
  3. import sun.misc.BASE64Encoder;
  4. /**
  5. * 基础加密组件
  6. *
  7. * @author 梁栋
  8. * @version 1.0
  9. * @since 1.0
  10. */
  11. public abstract class Coder {
  12. public static final String KEY_SHA = "SHA";
  13. public static final String KEY_MD5 = "MD5";
  14. /**
  15. * BASE64解密
  16. *
  17. * @param key
  18. * @return
  19. * @throws Exception
  20. */
  21. public static byte[] decryptBASE64(String key) throws Exception {
  22. return (new BASE64Decoder()).decodeBuffer(key);
  23. }
  24. /**
  25. * BASE64加密
  26. *
  27. * @param key
  28. * @return
  29. * @throws Exception
  30. */
  31. public static String encryptBASE64(byte[] key) throws Exception {
  32. return (new BASE64Encoder()).encodeBuffer(key);
  33. }
  34. /**
  35. * MD5加密
  36. *
  37. * @param data
  38. * @return
  39. * @throws Exception
  40. */
  41. public static byte[] encryptMD5(byte[] data) throws Exception {
  42. MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
  43. md5.update(data);
  44. return md5.digest();
  45. }
  46. /**
  47. * SHA加密
  48. *
  49. * @param data
  50. * @return
  51. * @throws Exception
  52. */
  53. public static byte[] encryptSHA(byte[] data) throws Exception {
  54. MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
  55. sha.update(data);
  56. return sha.digest();
  57. }
  58. }
复制代码

再给出一个测试类:

  1. import static org.junit.Assert.*;
  2. import org.junit.Test;
  3. /**
  4. *
  5. * @author 梁栋
  6. * @version 1.0
  7. * @since 1.0
  8. */
  9. public class CoderTest {
  10. @Test
  11. public void test() throws Exception {
  12. String inputStr = "简单加密";
  13. System.err.println("原文:/n/n" + inputStr);
  14. byte[] inputData = inputStr.getBytes();
  15. String code = Coder.encryptBASE64(inputData);
  16. System.err.println("BASE64加密后:/n/n" + code);
  17. byte[] output = Coder.decryptBASE64(code);
  18. String outputStr = new String(output);
  19. System.err.println("BASE64解密后:/n/n" + outputStr);
  20. // 验证BASE64加密解密一致性
  21. assertEquals(inputStr, outputStr);
  22. // 验证MD5对于同一内容加密是否一致
  23. assertArrayEquals(Coder.encryptMD5(inputData), Coder
  24. .encryptMD5(inputData));
  25. // 验证SHA对于同一内容加密是否一致
  26. assertArrayEquals(Coder.encryptSHA(inputData), Coder
  27. .encryptSHA(inputData));
  28. }
  29. }
复制代码

控制台输出
Console代码

  1. 原文:
  2. 简单加密
  3. BASE64加密后:
  4. 566A5Y2V5Yqg5a+G
  5. BASE64解密后:
  6. 简单加密
复制代码

BASE64的加密解密是双向的,可以求反解,而MD5和SHA是单向加密,任何数据加密后只会产生唯一的一个加密串。

更多加密方法见:http://www.groovycn.cn/forum-21-1.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值