zoukankan      html  css  js  c++  java
  • Java实现加密和解密的源代码

    本文转载于网络,抄录下来只是为了方便以后查找。原文地址:http://snowolf.iteye.com/blog/379860

    加密解密,曾经是我一个毕业设计的重要组件。在工作了多年以后回想当时那个加密、解密算法,实在是太单纯了。
    言归正传,这里我们主要描述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,椭圆曲线密码编码学)


        本篇内容简要介绍BASE64MD5SHAHMAC几种方法。
    MD5SHAHMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法。我们通常只把他们作为加密的基础。单纯的以上三种的加密并不可靠。
    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代码实现如下:

    Java代码

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

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

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

    通过java代码实现如下:

    Java代码 收藏代码

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

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


    SHA
    SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。虽然,SHA与MD5通过碰撞法都被破解了,但是SHA仍然是公认的安全加密算法,较之MD5更为安全。

    通过java代码实现如下:

    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.     }  

    HMAC
    HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证等。

    通过java代码实现如下:

    Java代码 收藏代码

    1. /**
    2. * 初始化HMAC密钥
    3. * @return
    4. * @throws Exception
    5. */
    6. public static String initMacKey() throws Exception {  
    7.     KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
    8.     SecretKey secretKey = keyGenerator.generateKey();  
    9. return encryptBASE64(secretKey.getEncoded());  
    10. }  
    11. /**
    12. * HMAC加密
    13. * @param data
    14. * @param key
    15. * @return
    16. * @throws Exception
    17. */
    18. public static byte[] encryptHMAC(byte[] data, String key) throws Exception {  
    19.     SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);  
    20.     Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
    21.     mac.init(secretKey);  
    22. return mac.doFinal(data);  

    给出一个完整类,如下:

    Java代码 收藏代码

    1. import java.security.MessageDigest;  
    2. import javax.crypto.KeyGenerator;  
    3. import javax.crypto.Mac;  
    4. import javax.crypto.SecretKey;  
    5. import sun.misc.BASE64Decoder;  
    6. import sun.misc.BASE64Encoder;  
    7. /**
    8. * 基础加密组件
    9. * @author 梁栋
    10. * @version 1.0
    11. * @since 1.0
    12. */
    13. public abstract class Coder {  
    14. public static final String KEY_SHA = "SHA";  
    15. public static final String KEY_MD5 = "MD5";  
    16. /**
    17.      * MAC算法可选以下多种算法
    18.      * 
    19.      * <pre>
    20.      * HmacMD5 
    21.      * HmacSHA1 
    22.      * HmacSHA256 
    23.      * HmacSHA384 
    24.      * HmacSHA512
    25.      * </pre>
    26.      */
    27. public static final String KEY_MAC = "HmacMD5";  
    28. /**
    29.      * BASE64解密
    30.      * 
    31.      * @param key
    32.      * @return
    33.      * @throws Exception
    34.      */
    35. public static byte[] decryptBASE64(String key) throws Exception {  
    36. return (new BASE64Decoder()).decodeBuffer(key);  
    37.     }  
    38. /**
    39.      * BASE64加密
    40.      * 
    41.      * @param key
    42.      * @return
    43.      * @throws Exception
    44.      */
    45. public static String encryptBASE64(byte[] key) throws Exception {  
    46. return (new BASE64Encoder()).encodeBuffer(key);  
    47.     }  
    48. /**
    49.      * MD5加密
    50.      * 
    51.      * @param data
    52.      * @return
    53.      * @throws Exception
    54.      */
    55. public static byte[] encryptMD5(byte[] data) throws Exception {  
    56.         MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);  
    57.         md5.update(data);  
    58. return md5.digest();  
    59.     }  
    60. /**
    61.      * SHA加密
    62.      * 
    63.      * @param data
    64.      * @return
    65.      * @throws Exception
    66.      */
    67. public static byte[] encryptSHA(byte[] data) throws Exception {  
    68.         MessageDigest sha = MessageDigest.getInstance(KEY_SHA);  
    69.         sha.update(data);  
    70. return sha.digest();  
    71.     }  
    72. /**
    73.      * 初始化HMAC密钥
    74.      * 
    75.      * @return
    76.      * @throws Exception
    77.      */
    78. public static String initMacKey() throws Exception {  
    79.         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
    80.         SecretKey secretKey = keyGenerator.generateKey();  
    81. return encryptBASE64(secretKey.getEncoded());  
    82.     }  
    83. /**
    84.      * HMAC加密
    85.      * 
    86.      * @param data
    87.      * @param key
    88.      * @return
    89.      * @throws Exception
    90.      */
    91. public static byte[] encryptHMAC(byte[] data, String key) throws Exception {  
    92.         SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);  
    93.         Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
    94.         mac.init(secretKey);  
    95. return mac.doFinal(data);  
    96.     }  

    再给出一个测试类:

    Java代码 收藏代码

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

    控制台输出:

    Console代码 收藏代码

    1. 原文:  
    2. 简单加密  
    3. BASE64加密后:  
    4. 566A5Y2V5Yqg5a+G  
    5. BASE64解密后:  
    6. 简单加密  
    7. Mac密钥:  
    8. uGxdHC+6ylRDaik++leFtGwiMbuYUJ6mqHWyhSgF4trVkVBBSQvY/a22xU8XT1RUemdCWW155Bke  
    9. pBIpkd7QHg==  
    10. MD5:  
    11. -550b4d90349ad4629462113e7934de56  
    12. SHA:  
    13. 91k9vo7p400cjkgfhjh0ia9qthsjagfn  
    14. HMAC:  
    15. 2287d192387e95694bdbba2fa941009a 

    注意
    编译时,可能会看到如下提示:

    引用

    警告:sun.misc.BASE64Decoder 是 Sun 的专用 API,可能会在未来版本中删除
    import sun.misc.BASE64Decoder;
                   ^
    警告:sun.misc.BASE64Encoder 是 Sun 的专用 API,可能会在未来版本中删除
    import sun.misc.BASE64Encoder;
                   ^

    BASE64Encoder和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, javax 类库的基础,其中的实现大多数与底层平台有关,一般来说是不推荐使用的。
        BASE64的加密解密是双向的,可以求反解。
        MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。其中HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。
        单向加密的用途主要是为了校验数据在传输过程中是否被修改。

  • 相关阅读:
    SPOJ GSS4 Can you answer these queries IV ——树状数组 并查集
    SPOJ GSS3 Can you answer these queries III ——线段树
    SPOJ GSS2 Can you answer these queries II ——线段树
    SPOJ GSS1 Can you answer these queries I ——线段树
    BZOJ 2178 圆的面积并 ——Simpson积分
    SPOJ CIRU The area of the union of circles ——Simpson积分
    HDU 1724 Ellipse ——Simpson积分
    HDU 1071 The area ——微积分
    HDU 4609 3-idiots ——FFT
    BZOJ 2194 快速傅立叶之二 ——FFT
  • 原文地址:https://www.cnblogs.com/echochen/p/2310096.html
Copyright © 2011-2022 走看看