`

Java加密解密快速入门下篇【包括MD5、BASE64、DES、RSA等算法】

    博客分类:
  • Java
阅读更多

在上一篇博客中已经简要的介绍了MD5、BASE64、DES、RSA等算法在Java中的具体应用。现在可以考虑对这些代码封装成一个工具类EncryptUtil吻,然后再补充一下Commons Codec对BASE64的扩展支持!微笑

 

<一>. EncryptUtil工具类:

 1. 使用commons-logging记录异常日志。

 2. 提取常量字段、公共字段。

 3. 提取公共方法: 

Java代码 
  1. //创建密钥  
  2. createSecretKey(String key):Key   
  3. //加密解密  
  4. processCipher(byte[] processData, Key key, int opsMode, String algorithm):byte[]  

  4. EncryptUtil类的完整代码:大笑 

Java代码 
  1. /* 
  2.  * Copyright (c) 2014, Nick Xu, All rights reserved. 
  3.  */  
  4. package com.excelsoft.common.crypto;  
  5.   
  6. import java.io.IOException;  
  7. import java.security.Key;  
  8. import java.security.KeyPair;  
  9. import java.security.KeyPairGenerator;  
  10. import java.security.MessageDigest;  
  11. import java.security.NoSuchAlgorithmException;  
  12. import java.security.PrivateKey;  
  13. import java.security.PublicKey;  
  14. import java.security.SecureRandom;  
  15. import java.security.Signature;  
  16.   
  17. import javax.crypto.Cipher;  
  18. import javax.crypto.SecretKey;  
  19. import javax.crypto.SecretKeyFactory;  
  20. import javax.crypto.spec.DESKeySpec;  
  21.   
  22. import org.apache.commons.logging.Log;  
  23. import org.apache.commons.logging.LogFactory;  
  24.   
  25. import sun.misc.BASE64Decoder;  
  26. import sun.misc.BASE64Encoder;  
  27.   
  28. /** 
  29.  * 功能简述: 加密解密工具类,对MD5/BASE64/DES/RSA等算法提供了包装. 
  30.  * @author Nick Xu 
  31.  * @version 1.0 
  32.  */  
  33. public class EncryptUtil {  
  34.     private static Log logger = LogFactory.getLog(EncryptUtil.class);  
  35.       
  36.     private static final int KEY_SIZE = 1024;  
  37.     private static final String  MD5_ALGORITHM= "md5";  
  38.     private static final String  DES_ALGORITHM= "des";  
  39.     private static final String  RSA_ALGORITHM= "rsa";  
  40.     private static final String  SIGNATURE_ALGORITHM= "MD5withRSA";  
  41.       
  42.     private static MessageDigest md5;  
  43.     private static BASE64Encoder encoder;  
  44.     private static BASE64Decoder decoder;  
  45.     private static SecureRandom random;  
  46.     private static KeyPair keyPair;  
  47.       
  48.     private EncryptUtil() {  
  49.     }  
  50.       
  51.     static {  
  52.         try {  
  53.             md5 = MessageDigest.getInstance(MD5_ALGORITHM);  
  54.               
  55.             KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM);  
  56.             keyPairGenerator.initialize(KEY_SIZE);  
  57.             keyPair = keyPairGenerator.generateKeyPair();  
  58.         }  
  59.         catch (NoSuchAlgorithmException e) {  
  60.             // Exception handler  
  61.             logger.error(e);  
  62.         }  
  63.         encoder = new BASE64Encoder();  
  64.         decoder = new BASE64Decoder();  
  65.         random = new SecureRandom();  
  66.     }  
  67.       
  68.     /** 
  69.      * 功能简述: 使用md5进行单向加密. 
  70.      */  
  71.     public static String encryptMD5(String plainText) {  
  72.         byte[] cipherData = md5.digest(plainText.getBytes());  
  73.         StringBuilder builder = new StringBuilder();  
  74.         for(byte cipher : cipherData) {  
  75.             String toHexStr = Integer.toHexString(cipher & 0xff);  
  76.             builder.append(toHexStr.length() == 1 ? "0" + toHexStr : toHexStr);  
  77.         }  
  78.         return builder.toString();  
  79.     }  
  80.       
  81.     /** 
  82.      * 功能简述: 使用BASE64进行加密. 
  83.      * @param plainData 明文数据 
  84.      * @return 加密之后的文本内容 
  85.      */  
  86.     public static String encryptBASE64(byte[] plainData) {  
  87.         return encoder.encode(plainData);  
  88.     }  
  89.       
  90.     /** 
  91.      * 功能简述: 使用BASE64进行解密. 
  92.      * @param cipherText 密文文本 
  93.      * @return 解密之后的数据 
  94.      */  
  95.     public static byte[] decryptBASE64(String cipherText) {  
  96.         byte[] plainData = null;  
  97.         try {  
  98.             plainData =  decoder.decodeBuffer(cipherText);  
  99.         }  
  100.         catch (IOException e) {  
  101.             // Exception handler  
  102.             logger.error(e);  
  103.         }  
  104.         return plainData;  
  105.     }  
  106.       
  107.     /** 
  108.      * 功能简述: 使用DES算法进行加密. 
  109.      * @param plainData 明文数据 
  110.      * @param key   加密密钥 
  111.      * @return   
  112.      */  
  113.     public static byte[] encryptDES(byte[] plainData, String key) {  
  114.         return processCipher(plainData, createSecretKey(key), Cipher.ENCRYPT_MODE, DES_ALGORITHM);  
  115.     }  
  116.       
  117.     /** 
  118.      * 功能简述: 使用DES算法进行解密. 
  119.      * @param cipherData    密文数据 
  120.      * @param key   解密密钥 
  121.      * @return 
  122.      */  
  123.     public static byte[] decryptDES(byte[] cipherData, String key) {  
  124.         return processCipher(cipherData, createSecretKey(key), Cipher.DECRYPT_MODE, DES_ALGORITHM);  
  125.     }  
  126.       
  127.     /** 
  128.      * 功能简述: 根据key创建密钥SecretKey. 
  129.      * @param key  
  130.      * @return 
  131.      */  
  132.     private static SecretKey createSecretKey(String key) {  
  133.         SecretKey secretKey = null;  
  134.         try {  
  135.             DESKeySpec keySpec = new DESKeySpec(key.getBytes());  
  136.             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);  
  137.             secretKey = keyFactory.generateSecret(keySpec);  
  138.         }  
  139.         catch (Exception e) {  
  140.             // Exception handler  
  141.             logger.error(e);  
  142.         }  
  143.         return secretKey;  
  144.     }  
  145.       
  146.     /** 
  147.      * 功能简述: 加密/解密处理流程. 
  148.      * @param processData   待处理的数据 
  149.      * @param key   提供的密钥 
  150.      * @param opsMode   工作模式 
  151.      * @param algorithm   使用的算法 
  152.      * @return   
  153.      */  
  154.     private static byte[] processCipher(byte[] processData, Key key, int opsMode, String algorithm) {  
  155.         try{   
  156.             Cipher cipher = Cipher.getInstance(algorithm);  
  157.             cipher.init(opsMode, key, random);  
  158.             return cipher.doFinal(processData);  
  159.         }  
  160.         catch (Exception e) {  
  161.             // Exception handler  
  162.             logger.error(e);  
  163.         }  
  164.         return null;  
  165.     }  
  166.       
  167.     /** 
  168.      * 功能简述: 创建私钥,用于RSA非对称加密. 
  169.      * @return 
  170.      */  
  171.     public static PrivateKey createPrivateKey() {  
  172.         return keyPair.getPrivate();  
  173.     }  
  174.       
  175.     /** 
  176.      * 功能简述: 创建公钥,用于RSA非对称加密. 
  177.      * @return 
  178.      */  
  179.     public static PublicKey createPublicKey() {  
  180.         return keyPair.getPublic();  
  181.     }  
  182.       
  183.     /** 
  184.      * 功能简述: 使用RSA算法加密. 
  185.      * @param plainData 明文数据 
  186.      * @param key   密钥 
  187.      * @return 
  188.      */  
  189.     public static byte[] encryptRSA(byte[] plainData, Key key) {  
  190.         return processCipher(plainData, key, Cipher.ENCRYPT_MODE, RSA_ALGORITHM);  
  191.     }  
  192.       
  193.     /** 
  194.      * 功能简述: 使用RSA算法解密. 
  195.      * @param cipherData    密文数据 
  196.      * @param key   密钥 
  197.      * @return 
  198.      */  
  199.     public static byte[] decryptRSA(byte[] cipherData, Key key) {  
  200.         return processCipher(cipherData, key, Cipher.DECRYPT_MODE, RSA_ALGORITHM);  
  201.     }  
  202.       
  203.     /** 
  204.      * 功能简述: 使用私钥对加密数据创建数字签名. 
  205.      * @param cipherData     已经加密过的数据 
  206.      * @param privateKey    私钥 
  207.      * @return 
  208.      */  
  209.     public static byte[] createSignature(byte[] cipherData, PrivateKey privateKey) {  
  210.         try {  
  211.             Signature signature  = Signature.getInstance(SIGNATURE_ALGORITHM);  
  212.             signature.initSign(privateKey);  
  213.             signature.update(cipherData);  
  214.             return signature.sign();  
  215.         }  
  216.         catch (Exception e) {  
  217.             // Exception handler  
  218.             logger.error(e);   
  219.         }  
  220.         return null;  
  221.     }  
  222.       
  223.     /** 
  224.      * 功能简述: 使用公钥对数字签名进行验证. 
  225.      * @param signData  数字签名 
  226.      * @param publicKey 公钥 
  227.      * @return 
  228.      */  
  229.     public static boolean verifySignature(byte[] cipherData, byte[] signData, PublicKey publicKey) {  
  230.         try {  
  231.             Signature signature  = Signature.getInstance(SIGNATURE_ALGORITHM);  
  232.             signature.initVerify(publicKey);  
  233.             signature.update(cipherData);  
  234.             return signature.verify(signData);  
  235.         }  
  236.         catch (Exception e) {  
  237.             // Exception handler  
  238.             logger.error(e);  
  239.         }  
  240.         return false;  
  241.     }  
  242. }  

 

<二>. Commons Codec对BASE64的扩展支持:

      JDK提供了对BASE64的标准支持,每隔76个字符进行换行\r\n,并且包含+、=、/等特殊字符不适合作为url参数传递。因此通常都会使用Commons Codec来进行BASE64的加密和解密。下载commons-codec-1.8.jar并添加到lib下面,注意选择高版本,低版本有些方法不支持。天真

 1. 是否换行:

Java代码 
  1. byte[] cipherData = Base64.encodeBase64(plainText.getBytes()); //默认不换行    
  2. byte[] cipherData = Base64.encodeBase64(plainText.getBytes(), false); //取消换行  
  3. byte[] cipherData = Base64.encodeBase64Chunked(plainText.getBytes()); //进行换行  
  4. String cipherText = Base64.encodeBase64String(plainText.getBytes()); //转为字符串  

  2. 安全的url:转换+为-、/为_、将多余的=去掉

Java代码 
  1. byte[] cipherData = Base64.encodeBase64(plainText.getBytes(), falsetrue);  
  2. byte[] cipherData = Base64.encodeBase64URLSafe(plainText.getBytes());  
  3. String cipherText = Base64.encodeBase64URLSafeString(plainText.getBytes());  

 

0
0
分享到:
评论

相关推荐

    Delphi AES DES MD5 RSA BASE64等加密算法源码实例集.rar

    包括了Delphi AES DES MD5 RSA BASE64 2DES 3DES Blowfish CRC32-Static SHA等 常用的加密算法用法实例,比较不错的Delphi加密实例代码了,浅显易懂而且实用的常见加密算法实例,包括字符串和文件加密解密等。

    android studio JNI RSA DES AES base64 MD5 加解密.rar

    本资源提供了在Android Studio项目中使用JNI实现RSA、DES、AES以及Base64和MD5的示例。 1. **RSA**: RSA是一种非对称加密算法,它基于两个密钥——公钥和私钥。公钥可以公开,用于加密数据;而私钥必须保密,用于...

    Vue-常用加密(MD5,DES,SHA256,BASE64,SHA1,RSA)

    在 Vue 中,常见的加密算法包括 MD5、DES、SHA256、BASE64、SHA1、RSA 等。BASE64 只是一种编码格式,并不是加密算法,但常用于在 HTTP 环境下传递较长的标识信息。 加密算法的选择需要根据实际情况进行选择,考虑...

    C#和Java实现互通的RSA&DES加解密算法

    2. 加密过程:C#使用RSA公钥或DES密钥加密数据,Java接收并解密。 3. 解密过程:Java使用RSA私钥或DES密钥加密数据,C#接收并解密。 在实现过程中,还需要注意以下几点: - 对于RSA,确保使用相同的模数和指数进行...

    Delphi加密算法大全2DES_3DES_3DES3_AES_BASE64_BLOWFISH_CRC_DES_MD5_RSA_SHA

    本资料包涵盖了多个常见的加密算法,包括2DES、3DES、3DES3、AES、Base64、Blowfish、CRC、DES、MD5以及RSA和SHA系列。以下将对这些算法进行详细介绍。 1. **2DES(双密钥数据加密标准)**:基于DES(Data ...

    C# 对接 Java 3des md5WithRsa

    本篇文章将详细讲解如何在C#中实现与Java的3DES加密以及MD5withRSA签名的对接。 3DES(Triple Data Encryption Algorithm)是一种对称加密算法,它使用了DES(Data Encryption Standard)算法三次,增强了加密强度...

    Base64工具类(加密、解密 )以及MD5加密

    这样的工具类在实际开发中非常实用,开发者可以方便地对字符串进行Base64编码解码,同时也可以进行MD5、DES和AES的加密解密操作,以满足不同层次的安全需求。 使用这些加密技术时,需要注意以下几点: - 对于敏感...

    java 文件加密解密 DES PBE RSA DH DSA ECC 等算法代码

    本文将详细介绍Java中常用的几种加密算法,包括但不限于DES、PBE、RSA、DH、DSA和ECC等,并提供部分示例代码以加深理解。 #### 二、基本概念 在深入讨论各种加密算法之前,我们先来了解一些基本的概念: - **加密...

    C#加密解密DeEncryptHelper.zip

    MD5 单向加密 SHA1 单向加密 DES 双向,可解密 加密字符串 ...RSA加密解密及RSA签名和验证 RSA 的密钥产生 产生私钥 和公钥 RSA 方式加密 RSA的解密函数 获取Hash描述表 RSA签名 RSA 签名验证

    Android利用C++实现RSA-DES-AES-BASE64-MD5

    综上所述,Android利用C++实现RSA、DES、AES、BASE64和MD5涉及多个层面的知识,包括加密理论、数值计算、数据编码以及JNI接口设计。实际应用中,这些技术可以结合使用,为Android应用提供高效且安全的数据保护机制。

    MD5算法,URLEncoding,Base64编码,AES,DES,DESede,RSA加密解密工具类和使用实例

    本话题主要涉及了MD5算法、URLEncoding、Base64编码以及几种对称和非对称加密算法AES、DES、DESede和RSA的工具类与使用实例。接下来,我们将深入探讨这些知识点。 1. **MD5算法**:MD5(Message-Digest Algorithm 5...

    DESC RSA MD5等加密解密例子

    本文将深入探讨标题"DESC RSA MD5等加密解密例子"所涉及的关键概念,包括DES、RSA、MD5和数字签名,以及它们在实际应用中的作用。 首先,DES(Data Encryption Standard)是一种经典的对称加密算法,它使用相同的...

    JS端与java(android)端3DES加密解密和Base64编码解码文件

    本文将深入探讨如何在JavaScript(JS)客户端和Java(Android)端实现3DES加密解密以及Base64编码解码,这对于保护用户敏感信息和实现安全通信至关重要。 首先,3DES(Triple Data Encryption Standard)是一种加强...

    java-android:AES加密,RAS加密,DES加密,MD5加密,Base64加密,异或加密

    本文将详细介绍Java中常见的几种加密算法,包括AES加密、RSA加密、DES加密、MD5哈希加密、Base64编码以及异或(XOR)加密。理解并掌握这些算法对于开发安全的应用至关重要。 首先,AES(Advanced Encryption Standard...

    ava加密解密 DES PBE RSA DH DSA ECC 等算法

    本文将主要介绍几种常见的加密解密算法,包括DES、PBE、RSA、DH、DSA以及ECC,并提供简单的代码示例。 首先,我们来看基本的单向加密算法。这些算法主要用于生成不可逆的散列值,以验证数据的完整性和一致性。 1. ...

    Delphi_d7加密算法大全.rar

    这个压缩包包含了MD5、Base64、CRC32、DES、AES、Blowfish、RSA以及SHA等算法的详细使用案例,为开发者提供了丰富的参考资料。 1. **MD5(Message-Digest Algorithm 5)**:MD5是一种广泛使用的哈希函数,它将任意...

    RSA和DES加密算法资料

    2. RSA算法的详细描述,包括数学基础、加密解密过程和安全性分析。 3. RSA密钥生成和管理的指导,如如何生成公钥和私钥对。 4. RSA在实际应用中的案例,如数字签名和SSL/TLS协议中的使用。 5. DES加密算法的详解,...

    android JNI RSA 3DES BASE64 加解密实现

    本教程主要涉及的是在Android平台上通过JNI(Java Native Interface)使用RSA、3DES和BASE64算法进行加解密操作,这些技术都是在Native层实现的,以提供更高的性能和安全性。 首先,我们来了解这些加密算法: 1. *...

    很强的Java加密解密算法源码

    JCE包括了各种加密、解密算法,如对称加密(如AES、DES)、非对称加密(如RSA、DSA)、哈希函数(如MD5、SHA)以及消息认证码(如HMAC)等。在Java中,我们可以直接使用Cipher类进行加解密操作,该类提供了初始化、...

    java的加密解密封装

    本文将详细讨论标题和描述中提及的几种加密算法:DEC(DES),RSA,MD5和SHA,以及如何在Java中对它们进行封装以实现安全的数据处理。 1. DEC(Data Encryption Standard):也称为DES,是一种对称加密算法,基于64...

Global site tag (gtag.js) - Google Analytics