1. 程式人生 > >Java中常用的加密與解密方法《轉載》

Java中常用的加密與解密方法《轉載》

加密,是以某種特殊的演算法改變原有的資訊資料,使得未授權的使用者即使獲得了已加密的資訊,但因不知解密的方法,仍然無法瞭解資訊的內容。大體上分為雙向加密和單向加密,而雙向加密又分為對稱加密和非對稱加密(有些資料將加密直接分為對稱加密和非對稱加密)。 

雙向加密大體意思就是明文加密後形成密文,可以通過演算法還原成明文。而單向加密只是對資訊進行了摘要計算,不能通過演算法生成明文,單向加密從嚴格意思上說不能算是加密的一種,應該算是摘要演算法吧。具體區分可以參考: 
(本人解釋不清呢 …… ) 
http://security.group.iteye.com/group/wiki/1710-one-way-encryption-algorithm 

一、雙向加密

(一)、對稱加密

採用單鑰密碼系統的加密方法,同一個金鑰可以同時用作資訊的加密和解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。 
需要對加密和解密使用相同金鑰的加密演算法。由於其速度,對稱性加密通常在訊息傳送方需要加密大量資料時使用。對稱性加密也稱為金鑰加密。 
所謂對稱,就是採用這種加密方法的雙方使用方式用同樣的金鑰進行加密和解密。金鑰是控制加密及解密過程的指令。 

演算法是一組規則,規定如何進行加密和解密。因此對稱式加密本身不是安全的。    
常用的對稱加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES演算法等 

對稱加密一般java類中中定義成員

Java程式碼

  1. //KeyGenerator 提供對稱金鑰生成器的功能,支援各種演算法
  2. private KeyGenerator keygen;
  3. //SecretKey 負責儲存對稱金鑰
  4. private SecretKey deskey;
  5. //Cipher負責完成加密或解密工作
  6. private Cipher c;
  7. //該位元組陣列負責儲存加密的結果
  8. private byte[] cipherByte;
在建構函式中初始化

Java程式碼

  1. Security.addProvider(new com.sun.crypto.provider.SunJCE());
  2. //例項化支援DES演算法的金鑰生成器(演算法名稱命名需按規定,否則丟擲異常)
  3. keygen = KeyGenerator.getInstance("DES"
    );//
  4. //生成金鑰
  5. deskey = keygen.generateKey();
  6. //生成Cipher物件,指定其支援的DES演算法
  7. c = Cipher.getInstance("DES");

1. DES演算法

DES演算法為密碼體制中的對稱密碼體制,又被成為美國資料加密標準,是1972年美國IBM公司研製的對稱密碼體制加密演算法。 明文按64位進行分組, 金鑰長64位,金鑰事實上是56位參與DES運算(第8、16、24、32、40、48、56、64位是校驗位, 使得每個金鑰都有奇數個1)分組後的明文組和56位的金鑰按位替代或交換的方法形成密文組的加密方法。 

Java程式碼

  1. import java.security.InvalidKeyException;
  2. import java.security.NoSuchAlgorithmException;
  3. import java.security.Security;
  4. import javax.crypto.BadPaddingException;
  5. import javax.crypto.Cipher;
  6. import javax.crypto.IllegalBlockSizeException;
  7. import javax.crypto.KeyGenerator;
  8. import javax.crypto.NoSuchPaddingException;
  9. import javax.crypto.SecretKey;
  10. public class EncrypDES {
  11. //KeyGenerator 提供對稱金鑰生成器的功能,支援各種演算法
  12. private KeyGenerator keygen;
  13. //SecretKey 負責儲存對稱金鑰
  14. private SecretKey deskey;
  15. //Cipher負責完成加密或解密工作
  16. private Cipher c;
  17. //該位元組陣列負責儲存加密的結果
  18. private byte[] cipherByte;
  19. public EncrypDES() throws NoSuchAlgorithmException, NoSuchPaddingException{
  20. Security.addProvider(new com.sun.crypto.provider.SunJCE());
  21. //例項化支援DES演算法的金鑰生成器(演算法名稱命名需按規定,否則丟擲異常)
  22. keygen = KeyGenerator.getInstance("DES");
  23. //生成金鑰
  24. deskey = keygen.generateKey();
  25. //生成Cipher物件,指定其支援的DES演算法
  26. c = Cipher.getInstance("DES");
  27. }
  28. /**
  29. * 對字串加密
  30. *
  31. * @param str
  32. * @return
  33. * @throws InvalidKeyException
  34. * @throws IllegalBlockSizeException
  35. * @throws BadPaddingException
  36. */
  37. public byte[] Encrytor(String str) throws InvalidKeyException,
  38. IllegalBlockSizeException, BadPaddingException {
  39. // 根據金鑰,對Cipher物件進行初始化,ENCRYPT_MODE表示加密模式
  40. c.init(Cipher.ENCRYPT_MODE, deskey);
  41. byte[] src = str.getBytes();
  42. // 加密,結果儲存進cipherByte
  43. cipherByte = c.doFinal(src);
  44. return cipherByte;
  45. }
  46. /**
  47. * 對字串解密
  48. *
  49. * @param buff
  50. * @return
  51. * @throws InvalidKeyException
  52. * @throws IllegalBlockSizeException
  53. * @throws BadPaddingException
  54. */
  55. public byte[] Decryptor(byte[] buff) throws InvalidKeyException,
  56. IllegalBlockSizeException, BadPaddingException {
  57. // 根據金鑰,對Cipher物件進行初始化,DECRYPT_MODE表示加密模式
  58. c.init(Cipher.DECRYPT_MODE, deskey);
  59. cipherByte = c.doFinal(buff);
  60. return cipherByte;
  61. }
  62. /**
  63. * @param args
  64. * @throws NoSuchPaddingException
  65. * @throws NoSuchAlgorithmException
  66. * @throws BadPaddingException
  67. * @throws IllegalBlockSizeException
  68. * @throws InvalidKeyException
  69. */
  70. public static void main(String[] args) throws Exception {
  71. EncrypDES de1 = new EncrypDES();
  72. String msg ="郭XX-搞笑相聲全集";
  73. byte[] encontent = de1.Encrytor(msg);
  74. byte[] decontent = de1.Decryptor(encontent);
  75. System.out.println("明文是:" + msg);
  76. System.out.println("加密後:" + new String(encontent));
  77. System.out.println("解密後:" + new String(decontent));
  78. }
  79. }

2. 3DES

 3DES又稱Triple DES,是DES加密演算法的一種模式,它使用3條56位的金鑰對3DES 
資料進行三次加密。資料加密標準(DES)是美國的一種由來已久的加密標準,它使用對稱金鑰加密法,並於1981年被ANSI組織規範為ANSI X.3.92。DES使用56位金鑰和密碼塊的方法,而在密碼塊的方法中,文字被分成64位大小的文字塊然後再進行加密。比起最初的DES,3DES更為安全。    
3DES(即Triple DES)是DES向AES過渡的加密演算法(1999年,NIST將3-DES指定為過渡的加密標準),是DES的一個更安全的變形。它以DES為基本模組,通過組合分組方法設計出分組加密演算法,其具體實現如下: 
設Ek()和Dk()代表DES演算法的加密和解密過程,K代表DES演算法使用的金鑰,P代表明文,C代表密文, 
這樣,    
3DES加密過程為:C=Ek3(Dk2(Ek1(P))) 
3DES解密過程為:P=Dk1((EK2(Dk3(C))) 

Java程式碼

  1. import java.security.InvalidKeyException;
  2. import java.security.NoSuchAlgorithmException;
  3. import java.security.Security;
  4. import javax.crypto.BadPaddingException;
  5. import javax.crypto.Cipher;
  6. import javax.crypto.IllegalBlockSizeException;
  7. import javax.crypto.KeyGenerator;
  8. import javax.crypto.NoSuchPaddingException;
  9. import javax.crypto.SecretKey;
  10. public class EncrypDES3 {
  11. // KeyGenerator 提供對稱金鑰生成器的功能,支援各種演算法
  12. private KeyGenerator keygen;
  13. // SecretKey 負責儲存對稱金鑰
  14. private SecretKey deskey;
  15. // Cipher負責完成加密或解密工作
  16. private Cipher c;
  17. // 該位元組陣列負責儲存加密的結果
  18. private byte[] cipherByte;
  19. public EncrypDES3() throws NoSuchAlgorithmException, NoSuchPaddingException {
  20. Security.addProvider(new com.sun.crypto.provider.SunJCE());
  21. // 例項化支援DES演算法的金鑰生成器(演算法名稱命名需按規定,否則丟擲異常)
  22. keygen = KeyGenerator.getInstance("DESede");
  23. // 生成金鑰
  24. deskey = keygen.generateKey();
  25. // 生成Cipher物件,指定其支援的DES演算法
  26. c = Cipher.getInstance("DESede");
  27. }
  28. /**
  29. * 對字串加密
  30. *
  31. * @param str
  32. * @return
  33. * @throws InvalidKeyException
  34. * @throws IllegalBlockSizeException
  35. * @throws BadPaddingException
  36. */
  37. public byte[] Encrytor(String str) throws InvalidKeyException,
  38. IllegalBlockSizeException, BadPaddingException {
  39. // 根據金鑰,對Cipher物件進行初始化,ENCRYPT_MODE表示加密模式
  40. c.init(Cipher.ENCRYPT_MODE, deskey);
  41. byte[] src = str.getBytes();
  42. // 加密,結果儲存進cipherByte
  43. cipherByte = c.doFinal(src);
  44. return cipherByte;
  45. }
  46. /**
  47. * 對字串解密
  48. *
  49. * @param buff
  50. * @return
  51. * @throws InvalidKeyException
  52. * @throws IllegalBlockSizeException
  53. * @throws BadPaddingException
  54. */
  55. public byte[] Decryptor(byte[] buff) throws InvalidKeyException,
  56. IllegalBlockSizeException, BadPaddingException {
  57. // 根據金鑰,對Cipher物件進行初始化,DECRYPT_MODE表示加密模式
  58. c.init(Cipher.DECRYPT_MODE, deskey);
  59. cipherByte = c.doFinal(buff);
  60. return cipherByte;
  61. }
  62. /**
  63. * @param args
  64. * @throws NoSuchPaddingException
  65. * @throws NoSuchAlgorithmException
  66. * @throws BadPaddingException
  67. * @throws IllegalBlockSizeException
  68. * @throws InvalidKeyException
  69. */
  70. public static void main(String[] args) throws Exception {
  71. EncrypDES3 des = new EncrypDES3();
  72. String msg ="郭XX-搞笑相聲全集";
  73. byte[] encontent = des.Encrytor(msg);
  74. byte[] decontent = des.Decryptor(encontent);
  75. System.out.println("明文是:" + msg);
  76. System.out.println("加密後:" + new String(encontent));
  77. System.out.println("解密後:" + new String(decontent));
  78. }
  79. }

3. AES

AES密碼學中的高階加密標準(Advanced Encryption Standard,AES),又稱 高階加密標準 
Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。經過五年的甄選流程,高階加密標準由美國國家標準與技術研究院(NIST)於2001年11月26日釋出於FIPS PUB 197,並在2002年5月26日成為有效的標準。2006年,高階加密標準已然成為對稱金鑰加密中最流行的演算法之一。   該演算法為比利時密碼學家Joan Daemen和Vincent Rijmen所設計,結合兩位作者的名字,以Rijndael之命名之,投稿高階加密標準的甄選流程。(Rijdael的發音近於 "Rhinedoll"。) 

Java程式碼:

  1. import java.security.InvalidKeyException;
  2. import java.security.NoSuchAlgorithmException;
  3. import java.security.Security;
  4. import javax.crypto.BadPaddingException;
  5. import javax.crypto.Cipher;
  6. import javax.crypto.IllegalBlockSizeException;
  7. import javax.crypto.KeyGenerator;
  8. import javax.crypto.NoSuchPaddingException;
  9. import javax.crypto.SecretKey;
  10. public class EncrypAES {
  11. //KeyGenerator 提供對稱金鑰生成器的功能,支援各種演算法
  12. private KeyGenerator keygen;
  13. //SecretKey 負責儲存對稱金鑰
  14. private SecretKey deskey;
  15. //Cipher負責完成加密或解密工作
  16. private Cipher c;
  17. //該位元組陣列負責儲存加密的結果
  18. private byte[] cipherByte;
  19. public EncrypAES() throws NoSuchAlgorithmException, NoSuchPaddingException{
  20. Security.addProvider(new com.sun.crypto.provider.SunJCE());
  21. //例項化支援DES演算法的金鑰生成器(演算法名稱命名需按規定,否則丟擲異常)
  22. keygen = KeyGenerator.getInstance("AES");
  23. //生成金鑰
  24. deskey = keygen.generateKey();
  25. //生成Cipher物件,指定其支援的DES演算法
  26. c = Cipher.getInstance("AES");
  27. }
  28. /**
  29. * 對字串加密
  30. *
  31. * @param str
  32. * @return
  33. * @throws InvalidKeyException
  34. * @throws IllegalBlockSizeException
  35. * @throws BadPaddingException
  36. */
  37. public byte[] Encrytor(String str) throws InvalidKeyException,
  38. IllegalBlockSizeException, BadPaddingException {
  39. // 根據金鑰,對Cipher物件進行初始化,ENCRYPT_MODE表示加密模式
  40. c.init(Cipher.ENCRYPT_MODE, deskey);
  41. byte[] src = str.getBytes();
  42. // 加密,結果儲存進cipherByte
  43. cipherByte = c.doFinal(src);
  44. return cipherByte;
  45. }
  46. /**
  47. * 對字串解密
  48. *
  49. * @param buff
  50. * @return
  51. * @throws InvalidKeyException
  52. * @throws IllegalBlockSizeException
  53. * @throws BadPaddingException
  54. */
  55. public byte[] Decryptor(byte[] buff) throws InvalidKeyException,
  56. IllegalBlockSizeException, BadPaddingException {
  57. // 根據金鑰,對Cipher物件進行初始化,DECRYPT_MODE表示加密模式
  58. c.init(Cipher.DECRYPT_MODE, deskey);
  59. cipherByte = c.doFinal(buff);
  60. return cipherByte;
  61. }
  62. /**
  63. * @param args
  64. * @throws NoSuchPaddingException
  65. * @throws NoSuchAlgorithmException
  66. * @throws BadPaddingException
  67. * @throws IllegalBlockSizeException
  68. * @throws InvalidKeyException
  69. */
  70. public static void main(String[] args) throws Exception {
  71. EncrypAES de1 = new EncrypAES();
  72. String msg ="郭XX-搞笑相聲全集";
  73. byte[] encontent = de1.Encrytor(msg);
  74. byte[] decontent = de1.Decryptor(encontent);
  75. System.out.println("明文是:" + msg);
  76. System.out.println("加密後:" + new String(encontent));
  77. System.out.println("解密後:" + new String(decontent));
  78. }
  79. }

(二)、非對稱加密

1976年,美國學者Dime和Henman為解決資訊公開傳送和金鑰管理問題,提出一種新的金鑰交換協議,允許在不安全的媒體上的通訊雙方交換資訊,安全地達成一致的金鑰,這就是“公開金鑰系統”。相對於“對稱加密演算法”這種方法也叫做“非對稱加密演算法”。 與對稱加密演算法不同,非對稱加密演算法需要兩個金鑰:公開金鑰(publickey)和私有金鑰 (privatekey)。公開金鑰與私有金鑰是一對,如果用公開金鑰對資料進行加密,只有用對應的私有金鑰才能解密;如果用私有金鑰對資料進行加密,那麼只有用對應的公開金鑰才能解密。因為加密和解密使用的是兩個不同的金鑰,所以這種演算法叫作非對稱加密演算法。 

1. RSA 公鑰加密演算法

RSA 公鑰加密演算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美國麻省理工學院)開發的。RSA取名來自開發他們三者的名字。RSA是目前最有影響力的公鑰加密演算法,它能夠抵抗到目前為止已知的所有密碼攻擊,已被ISO推薦為公鑰資料加密標準。RSA演算法基於一個十分簡單的數論事實:將兩個大素數相乘十分容易,但那時想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密金鑰。 

Java程式碼:

  1. import java.security.InvalidKeyException;
  2. import java.security.KeyPair;
  3. import java.security.KeyPairGenerator;
  4. import java.security.NoSuchAlgorithmException;
  5. import java.security.interfaces.RSAPrivateKey;
  6. import java.security.interfaces.RSAPublicKey;
  7. import javax.crypto.BadPaddingException;
  8. import javax.crypto.Cipher;
  9. import javax.crypto.IllegalBlockSizeException;
  10. import javax.crypto.NoSuchPaddingException;
  11. public class EncrypRSA {
  12. /**
  13. * 加密
  14. *

    相關推薦

    Java常用加密解密方法轉載

    加密,是以某種特殊的演算法改變原有的資訊資料,使得未授權的使用者即使獲得了已加密的資訊,但因不知解密的方法,仍然無法瞭解資訊的內容。大體上分為雙向加密和單向加密,而雙向加密又分為對稱加密和非對稱加密(有些資料將加密直接分為對稱加密和非對稱加密)。 雙向加密大體意思就是明文加密

    Java常用加密解密方法

    加密,是以某種特殊的演算法改變原有的資訊資料,使得未授權的使用者即使獲得了已加密的資訊,但因不知解密的方法,仍然無法瞭解資訊的內容。大體上分為雙向加密和單向加密,而雙向加密又分為對稱加密和非對稱加密(有些資料將加密直接分為對稱加密和非對稱加密)。 雙向加密大體意思就是明文加

    Java 課堂作業 加密解密

    源代碼 main nextline 流程 選擇 rgs mage put ext 1.設計思路 首先根據提示輸入一段字符串 利用charAt()將字符串的每個字符分解出來,要加密的話轉換成int類型後加3,解密的話轉換成int類型後減3,然後再轉化為char類型 新定義一個

    3. 深入研究 UCenter API 之 加密解密轉載

    method href img 破解 cti subst != efault times 1. 深入研究 UCenter API 之 開篇 (轉載) 2. 深入研究 UCenter API 之 通訊原理(轉載) 3. 深入研究 UCenter API 之

    php和java加密解密

    padding 而不是 bsp enc openss 解密 div des算法 -c 遇到的java代碼如下: Cipher cipher=Cipher.getInstance("DESede/CBC/PKCS5Padding"); 在php中使用des算法 始終校驗不

    golangRSA加密解密演算法

    package main import ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/base64" "encoding/pem" "errors" "fmt" ) // 可通過openssl產生

    Java實現MD5加密解密

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class TestMD5 {public static void Md5(String plainText){try { Me

    Java的列舉values()方法

    在編寫Java程式時經常會用到列舉(後面統一用enum描述)型別,今天我們就來看一下enum中常用到的values()方法。 首先,我們在Eclipse中編寫一個簡單的類: public class EnumTest { private enum D

    Java常用日期操作及方法

    第一周 當前 計算 sys print border str2 入門教程 註意 前言 涉及到日期計算和字符串與日期轉換,轉來轉去很是麻煩,於是歸納總結一下。以下都可以用。 一、Dateformat類的常用格式 y 年 Year 1996; 96 M 年中的月份

    jasypt加密解密

    沒什麼好說的了,直接看demo。 新增依賴 <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt

    用javascriptjava進行RSA加密解密

    這幾天一直做安全登入,網上查了好多資料,不盡如意。 具體實現思路如下: 1。服務端生成公鑰與私鑰,儲存。 2。客戶端在請求到登入頁面後,隨機生成一字串。 3。後此隨機字串作為金鑰加密密碼,再用從服務端獲取到的公鑰加密生成的隨機字串。 4。將此兩段密文傳入服務端,服務端用私鑰

    Java的Stringintern方法

    常量池 在理解Java中的String之前有一個必須要知道的概念-常量池 在java的class檔案中,有一塊常量集中存放的區域,這塊地方被稱為常量池。常量池中儲存的常量通常包括關於類,方法,介面等中的常量,以及字串常量,如String s = “java”

    java delphi aes 加密解密檔案相容演算法

    本文在oracle jdk 1.8, delphi xe3下面測試加密與解密模式都成功通過。 java端加密與解密演算法程式碼 package com.shit; import java.io.ByteArrayOutputStream; import java.io

    JavaMD5加密解密工具類

    length pri 一個 stringbu util new ron abc 轉換 package org.hzp.util; import java.io.UnsupportedEncodingException; import java.security.

    C#開發常用加密解密方法解析

    一、MD5加密演算法 我想這是大家都常聽過的演算法,可能也用的比較多。那麼什麼是MD5演算法呢?MD5全稱是message-digest algorithm 5,簡單的說就是單向的加密,即是說無法根據密文推匯出明文。 MD5主要用途: 1、對一段資訊生成資訊摘要,該摘要對該資訊具有唯一性

    Java和C#3DES的加密解密

    最近在工作中遇到將Java環境的一個使用者ID用表單形式傳遞給.net環境做校驗,考慮到不能將使用者ID作為明文傳遞,因此利用簡單的3DES進行加密解密操作。 需要注意的就是: (1)兩種環境下3DES加密解密的一致性問題:C#會對解密生成的byte在不滿足長度16時,自動

    Java常用加密算法小結

    單向 安全 加密算法 對稱 digest iges 公鑰加密 非對稱加密 algorithm 散列算法(單向散列,不可逆) MD5(Message Digest Algorithm 5) SHA(Secure Hash Algorithm) 對稱加密(加密解密

    Java加密解密筆記(二) 對稱加密

    解決 理解 span ring println key ted utf-8 rate 前面的僅僅是做了編碼或者摘要,下面看看真正的加密技術。 DES public class DESUtil { static final String ALGORITHM = "

    Java加密解密筆記(三) 非對稱加密

    arr 內容 phy 資料 密碼 load esp uid user 非對稱的特點是加密和解密時使用的是不同的鑰匙。密鑰分為公鑰和私鑰,用公鑰加密的數據只能用私鑰進行解密,反之亦然。 另外,密鑰還可以用於數字簽名。數字簽名跟上文說的消息摘要是一個道理,通過一定方法對數據內容

    Java學習~實現輸入字元的加密解密

    步驟 1.新建專案第四章 2.新建包例子 3.新建類加密 package example; import java.util.Scanner; public class Encryption { public static void main (String[]