Java 對稱加密DES

DES


全稱為Data Encryption Standard蒋失,即數據加密標準型型,是一種使用密鑰加密的塊算法香璃,1976年被美國聯邦政府的國家標準局確定為聯邦資料處理標準(FIPS)替梨,隨后在國際上廣泛流傳開來。

DES算法的入口參數有三個:Key椅亚、DataMode舱污。

  • Key為7個字節(jié)共56位,是DES算法的工作密鑰呀舔;
  • Data為8個字節(jié)64位,是要被加密或被解密的數據;
  • Mode為DES的工作方式,有兩種:加密或解密。

DES算法把64位的明文輸入塊變?yōu)?4位的密文輸出塊,它所使用的密鑰也是56位扩灯,其算法主要分為兩步:

(1)初始置換

其功能是把輸入的64位數據塊按位重新組合,并把輸出分為L0媚赖、R0兩部分,每部分各長32位,其置換規(guī)則為將輸入的第58位換到第一位,第50位換到第2位……依此類推,最后一位是原來的第7位。L0驴剔、R0則是換位輸出后的兩部分省古,L0是輸出的左32位,R0是右32位,例:設置換前的輸入值為D1D2D3……D64,則經過初始置換后的結果為:L0=D58D50……D8;R0=D57D49……D7。

其置換規(guī)則見下表:
58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,
57,49,41,33,25,17,9,1,59,51,43,35,27,19,11,3,
61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7,

(2)逆置換

經過16次迭代運算后,得到L16丧失、R16,將此作為輸入,進行逆置換,逆置換正好是初始置換的逆運算豺妓,由此即得到密文輸出。
此算法是對稱加密算法體系中的代表,在計算機網絡系統中廣泛使用.

package com.stone.security; 
import java.security.Key; 
import java.security.SecureRandom; 
import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESKeySpec; 
import javax.crypto.spec.IvParameterSpec; 
  
/** 
 * DES 算法    1972美國IBM研制布讹,對稱加密算法 
 */
public class DES {  
  // 算法名稱 
  public static final String KEY_ALGORITHM = "DES"; 
  // 算法名稱/加密模式/填充方式 
  public static final String CIPHER_ALGORITHM_ECB = "DES/ECB/PKCS5Padding"; 
  public static final String CIPHER_ALGORITHM_CBC = "DES/CBC/PKCS5Padding"; 
    
  public static void main(String[] args) throws Exception { 
    /* 
     * 使用 ECB mode 
     * 密鑰生成器 生成密鑰 
     * ECB mode cannot use IV 
     */ 
    byte[] key = generateKey();  
    byte[] encrypt = encrypt("胃炎F#*(x)".getBytes(), key); 
    System.out.println(new String(decrypt(encrypt, key))); 
      
      
    /* 
     * 使用CBC mode 
     * 使用密鑰工廠生成密鑰琳拭,加密 解密 
     * iv: DES in CBC mode and RSA ciphers with OAEP encoding operation. 
     */ 
    DESKeySpec dks = new DESKeySpec(generateKey()); 
    SecretKeyFactory factory = SecretKeyFactory.getInstance(KEY_ALGORITHM); 
    SecretKey secretKey = factory.generateSecret(dks); 
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKey, new IvParameterSpec(getIV())); 
    byte[] enc = cipher.doFinal("胃炎A%F#*(x)".getBytes()); //加密 
      
    cipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(getIV())); 
    byte[] dec = cipher.doFinal(enc); // 解密 
    System.out.println(new String(dec)); 
  } 
    
  static byte[] getIV() { 
    String iv = "asdfivh7"; //IV length: must be 8 bytes long 
    return iv.getBytes(); 
  } 
  
  /** 
   * 生成密鑰 
   * 
   * @return 
   * @throws Exception 
   */ 
  private static byte[] generateKey() throws Exception { 
    KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_ALGORITHM); 
    keyGenerator.init(56); //des 必須是56, 此初始方法不必須調用 
    SecretKey secretKey = keyGenerator.generateKey(); 
    return secretKey.getEncoded(); 
  } 
  
  /** 
   * 還原密鑰 
   * 
   * @param key 
   * @return 
   * @throws Exception 
   */ 
  private static Key toKey(byte[] key) throws Exception { 
    DESKeySpec des = new DESKeySpec(key); 
    SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(KEY_ALGORITHM); 
    SecretKey secretKey = keyFactory.generateSecret(des); 
    return secretKey; 
  } 
    
  /** 
   * 加密 
   * @param data 原文 
   * @param key 
   * @return 密文 
   * @throws Exception 
   */ 
  public static byte[] encrypt(byte[] data, byte[] key) throws Exception { 
    Key k = toKey(key); 
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_ECB); 
    cipher.init(Cipher.ENCRYPT_MODE, k, new SecureRandom()); 
    return cipher.doFinal(data); 
  } 
  /** 
   * 解密 
   * @param data 密文 
   * @param key 
   * @return 明文、原文 
   * @throws Exception 
   */
  public static byte[] decrypt(byte[] data, byte[] key) throws Exception { 
    Key k = toKey(key); 
    Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM_ECB); 
    cipher.init(Cipher.DECRYPT_MODE, k, new SecureRandom()); 
    return cipher.doFinal(data); 
  } 
}

Java三重DES實現:

package com.stone.security; 
  
import javax.crypto.Cipher; 
import javax.crypto.KeyGenerator; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.DESedeKeySpec; 
import javax.crypto.spec.IvParameterSpec; 
  
/** 
 * 三重加密 3DES也作 Triple DES, 
 */
public class TripleDES { 
  // 算法名稱 
  public static final String KEY_ALGORITHM = "DESede"; 
  // 算法名稱/加密模式/填充方式 
  public static final String CIPHER_ALGORITHM_ECB = "DESede/ECB/PKCS5Padding"; 
  public static final String CIPHER_ALGORITHM_CBC = "DESede/CBC/PKCS5Padding"; 
    
  private KeyGenerator keyGen; 
  private SecretKey secretKey; 
  private SecretKey secretKey2; 
  private Cipher cipher; 
  private static byte[] encryptData; 
    
  public static void main(String[] args) throws Exception { 
    TripleDES tripleDES = new TripleDES("ECB"); 
    tripleDES.encrypt("sau8jzxlcvm,'123`98(*^&%^^JCB ZX>>A<S<}}{"); 
    System.out.println("加密后:" + new String(encryptData)); 
    System.out.println("解密后:"+ new String(tripleDES.decrypt(encryptData))); 
      
    tripleDES = new TripleDES("CBC"); 
    tripleDES.encrypt2("sau8jzxlc DQV#><?|vm,'123`98(*^&%^^JCB ZX>>A<S<}}{"); 
    System.out.println("加密后:" + new String(encryptData)); 
    System.out.println("解密后:"+ new String(tripleDES.decrypt2(encryptData))); 
  } 
    
  public TripleDES(String mode) throws Exception { 
    if ("ECB".equals(mode)) { 
//     cipher = Cipher.getInstance(KEY_ALGORITHM); 
      cipher = Cipher.getInstance(CIPHER_ALGORITHM_ECB); 
      keyGen = KeyGenerator.getInstance(KEY_ALGORITHM); 
      secretKey = keyGen.generateKey(); 
    } else if("CBC".equals(mode)) { 
      cipher = Cipher.getInstance(CIPHER_ALGORITHM_CBC); 
      keyGen = KeyGenerator.getInstance(KEY_ALGORITHM); 
      DESedeKeySpec spec = new DESedeKeySpec(keyGen.generateKey().getEncoded()); 
      secretKey2 = SecretKeyFactory.getInstance(KEY_ALGORITHM).generateSecret(spec); 
    } 
  } 
  /** 
   * 加密 
   * @param str 
   * @return 
   * @throws Exception 
   */
  public byte[] encrypt(String str) throws Exception { 
    cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
    return encryptData = cipher.doFinal(str.getBytes()); 
  } 
  /** 
   * 解密 
   * @param encrypt 
   * @return 
   * @throws Exception 
   */
  public byte[] decrypt(byte[] encrypt) throws Exception { 
    cipher.init(Cipher.DECRYPT_MODE, secretKey); 
    return encryptData = cipher.doFinal(encrypt); 
  } 
  byte[] getIV() { 
    return "administ".getBytes(); 
  } 
  /** 
   * 加密 
   * @param str 
   * @return 
   * @throws Exception 
   */
  public byte[] encrypt2(String str) throws Exception { 
    cipher.init(Cipher.ENCRYPT_MODE, secretKey2, new IvParameterSpec(getIV())); 
    return encryptData = cipher.doFinal(str.getBytes()); 
  } 
  /** 
   * 解密 
   * @param encrypt 
   * @return 
   * @throws Exception 
   */
  public byte[] decrypt2(byte[] encrypt) throws Exception { 
    cipher.init(Cipher.DECRYPT_MODE, secretKey2, new IvParameterSpec(getIV())); 
    return encryptData = cipher.doFinal(encrypt); 
  } 
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末描验,一起剝皮案震驚了整個濱河市白嘁,隨后出現的幾起案子,更是在濱河造成了極大的恐慌膘流,老刑警劉巖絮缅,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異呼股,居然都是意外死亡耕魄,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門彭谁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吸奴,“玉大人,你說我怎么就攤上這事缠局≡虬拢” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵狭园,是天一觀的道長读处。 經常有香客問我,道長唱矛,這世上最難降的妖魔是什么档泽? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任俊戳,我火速辦了婚禮,結果婚禮上馆匿,老公的妹妹穿的比我還像新娘。我一直安慰自己燥滑,他們只是感情好渐北,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著铭拧,像睡著了一般赃蛛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搀菩,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天呕臂,我揣著相機與錄音,去河邊找鬼肪跋。 笑死歧蒋,一個胖子當著我的面吹牛,可吹牛的內容都是我干的州既。 我是一名探鬼主播谜洽,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吴叶!你這毒婦竟也來了阐虚?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚌卤,失蹤者是張志新(化名)和其女友劉穎实束,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體逊彭,經...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡咸灿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了诫龙。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片析显。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖签赃,靈堂內的尸體忽然破棺而出谷异,到底是詐尸還是另有隱情,我是刑警寧澤锦聊,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布歹嘹,位于F島的核電站,受9級特大地震影響孔庭,放射性物質發(fā)生泄漏尺上。R本人自食惡果不足惜材蛛,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望怎抛。 院中可真熱鬧卑吭,春花似錦、人聲如沸马绝。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽富稻。三九已至掷邦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椭赋,已是汗流浹背抚岗。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哪怔,地道東北人宣蔚。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像蔓涧,于是被迫代替她去往敵國和親件已。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容