1. 程式人生 > >Android實現3DES加密

Android實現3DES加密

1. 步驟

常量

 private final static String secretKey = "[email protected]$#963";//必須是至少24位

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. // 向量  
  2. private final static String iv = "12345678";  
  3. // 加解密統一使用的編碼方式  
  4. private final static String encoding = "utf-8";  
	// 向量
	private final static String iv = "12345678";
	// 加解密統一使用的編碼方式
	private final static String encoding = "utf-8";
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. private String data = "這是原始資料將被加密";  
        private String data = "這是原始資料將被加密";

1) 生成3DES演算法祕鑰

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. Key deskey = null;  
  2. DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());  
  3. SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede"
    );//定義加密演算法,可用des,desede,blowfish  
  4. deskey = keyfactory.generateSecret(spec);//生成祕鑰  
Key deskey = null;
DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");//定義加密演算法,可用des,desede,blowfish
deskey = keyfactory.generateSecret(spec);//生成祕鑰

2) 加密

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");// 演算法名稱/加密模式/填充方式  
  2.     IvParameterSpec ips = new IvParameterSpec(iv.getBytes());  
  3.     cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);  
  4.     byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));  
  5.     String encrypt = Base64.encode(encryptData);  
	Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");// 演算法名稱/加密模式/填充方式
		IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
		cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
		byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));
		String encrypt = Base64.encode(encryptData);

3)解密

解密獲取演算法祕鑰和加密過程的獲取演算法祕鑰過程一樣,不同的如下

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");  
  2.         IvParameterSpec ips = new IvParameterSpec(iv.getBytes());  
  3.         cipher.init(Cipher.DECRYPT_MODE, deskey, ips);  
  4.         byte[] decryptData = cipher.doFinal(Base64.decode(encryptText));  
  5.         String decrypt = new String(decryptData,encoding);  
Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
		IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
		cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
		byte[] decryptData = cipher.doFinal(Base64.decode(encryptText));
		String decrypt = new String(decryptData,encoding);

4) 整理

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. /** 
  2.      * 3DES加密 
  3.      * @param plainText 待加密文字 
  4.      * @param secretKey 約定的key,至少24位,例如:String secretKey = "[email protected]$#365"; 
  5.      * @param iv 向量 例如: String iv = "12345678"; 
  6.      * @return 密文 
  7.      * @throws Exception : 如果secretKey小於24位,InvalidKeyException 
  8.      */  
  9.     public static String encrypt(String plainText,String secretKey,String iv) throws Exception {  
  10.         Key deskey = null;  
  11.         DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());  
  12.         SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");  
  13.         deskey = keyfactory.generateSecret(spec);  
  14.         Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");  
  15.         IvParameterSpec ips = new IvParameterSpec(iv.getBytes());  
  16.         cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);  
  17.         byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));  
  18.         return Base64.encode(encryptData);  
  19.     }  
/**
	 * 3DES加密
	 * @param plainText 待加密文字
	 * @param secretKey 約定的key,至少24位,例如:String secretKey = "[email protected]$#365";
	 * @param iv 向量 例如: String iv = "12345678";
	 * @return 密文
	 * @throws Exception : 如果secretKey小於24位,InvalidKeyException
	 */
	public static String encrypt(String plainText,String secretKey,String iv) throws Exception {
		Key deskey = null;
		DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
		SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
		deskey = keyfactory.generateSecret(spec);

		Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
		IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
		cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
		byte[] encryptData = cipher.doFinal(plainText.getBytes(encoding));
		return Base64.encode(encryptData);
	}

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. /** 
  2.      * 3DES解密 
  3.      * @param encryptText 密文 
  4.      * @param secretKey 加密時的key 
  5.      * @param iv 加密時使用的向量 
  6.      * @return 返回解密後的明文 
  7.      * @throws Exception 
  8.      */  
  9.     public static String decrypt(String encryptText,String secretKey,String iv) throws Exception {  
  10.         Key deskey = null;  
  11.         DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());  
  12.         SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");  
  13.         deskey = keyfactory.generateSecret(spec);  
  14.         Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");  
  15.         IvParameterSpec ips = new IvParameterSpec(iv.getBytes());  
  16.         cipher.init(Cipher.DECRYPT_MODE, deskey, ips);  
  17.         byte[] decryptData = cipher.doFinal(Base64.decode(encryptText));  
  18.         return new String(decryptData, encoding);  
  19.     }  
/**
	 * 3DES解密
	 * @param encryptText 密文
	 * @param secretKey 加密時的key
	 * @param iv 加密時使用的向量
	 * @return 返回解密後的明文
	 * @throws Exception
	 */
	public static String decrypt(String encryptText,String secretKey,String iv) throws Exception {
		Key deskey = null;
		DESedeKeySpec spec = new DESedeKeySpec(secretKey.getBytes());
		SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
		deskey = keyfactory.generateSecret(spec);
		Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");
		IvParameterSpec ips = new IvParameterSpec(iv.getBytes());
		cipher.init(Cipher.DECRYPT_MODE, deskey, ips);

		byte[] decryptData = cipher.doFinal(Base64.decode(encryptText));

		return new String(decryptData, encoding);
	}
5)Base64工具類 [java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. import java.io.ByteArrayOutputStream;  
  2. import java.io.IOException;  
  3. import java.io.OutputStream;  
  4. /** 
  5.  * Base64編碼工具類 
  6.  *  
  7.  */  
  8. public class Base64 {  
  9.     private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();  
  10.     public static String encode(byte[] data) {  
  11.         int start = 0;  
  12.         int len = data.length;  
  13.         StringBuffer buf = new StringBuffer(data.length * 3 / 2);  
  14.         int end = len - 3;  
  15.         int i = start;  
  16.         int n = 0;  
  17.         while (i <= end) {  
  18.             int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 0x0ff) << 8) | (((int) data[i + 2]) & 0x0ff);  
  19.             buf.append(legalChars[(d >> 18) & 63]);  
  20.             buf.append(legalChars[(d >> 12) & 63]);  
  21.             buf.append(legalChars[(d >> 6) & 63]);  
  22.             buf.append(legalChars[d & 63]);  
  23.             i += 3;  
  24.             if (n++ >= 14) {  
  25.                 n = 0;  
  26.                 buf.append(" ");  
  27.             }  
  28.         }  
  29.         if (i == start + len - 2) {  
  30.             int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 255) << 8);  
  31.             buf.append(legalChars[(d >> 18) & 63]);  
  32.             buf.append(legalChars[(d >> 12) & 63]);  
  33.             buf.append(legalChars[(d >> 6) & 63]);  
  34.             buf.append("=");  
  35.         } else if (i == start + len - 1) {  
  36.             int d = (((int) data[i]) & 0x0ff) << 16;  
  37.             buf.append(legalChars[(d >> 18) & 63]);  
  38.             buf.append(legalChars[(d >> 12) & 63]);  
  39.             buf.append("==");  
  40.         }  
  41.         return buf.toString();  
  42.     }  
  43.     private static int decode(char c) {  
  44.         if (c >= 'A' && c <= 'Z')  
  45.             return ((int) c) - 65;  
  46.         else if (c >= 'a' && c <= 'z')  
  47.             return ((int) c) - 97 + 26;  
  48.         else if (c >= '0' && c <= '9')  
  49.             return ((int) c) - 48 + 26 + 26;  
  50.         else  
  51.             switch (c) {  
  52.             case '+':  
  53.                 return 62;  
  54.             case '/':  
  55.                 return 63;  
  56.             case '=':  
  57.                 return 0;  
  58.             default:  
  59.                 throw new RuntimeException("unexpected code: " + c);  
  60.             }  
  61.     }  
  62.     /** 
  63.      * Decodes the given Base64 encoded String to a new byte array. The byte array holding the decoded data is returned. 
  64.      */  
  65.     public static byte[] decode(String s) {  
  66.         ByteArrayOutputStream bos = new ByteArrayOutputStream();  
  67.         try {  
  68.             decode(s, bos);  
  69.         } catch (IOException e) {  
  70.             throw new RuntimeException();  
  71.         }  
  72.         byte[] decodedBytes = bos.toByteArray();  
  73.         try {  
  74.             bos.close();  
  75.             bos = null;  
  76.         } catch (IOException ex) {  
  77.             System.err.println("Error while decoding BASE64: " + ex.toString());  
  78.         }  
  79.         return decodedBytes;  
  80.     }  
  81.     private static void decode(String s, OutputStream os) throws IOException {  
  82.         int i = 0;  
  83.         int len = s.length();  
  84.         while (true) {  
  85.             while (i < len && s.charAt(i) <= ' ')  
  86.                 i++;  
  87.             if (i == len)  
  88.                 break;  
  89.             int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12) + (decode(s.charAt(i + 2)) << 6) + (decode(s.charAt(i + 3)));  
  90.             os.write((tri >> 16) & 255);  
  91.             if (s.charAt(i + 2) == '=')  
  92.                 break;  
  93.             os.write((tri >> 8) & 255);  
  94.             if (s.charAt(i + 3) == '=')  
  95.                 break;  
  96.             os.write(tri & 255);  
  97.             i += 4;  
  98.         }  
  99.     }  
  100. }  
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

/**
 * Base64編碼工具類
 * 
 */
public class Base64 {
	private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();

	public static String encode(byte[] data) {
		int start = 0;
		int len = data.length;
		StringBuffer buf = new StringBuffer(data.length * 3 / 2);

		int end = len - 3;
		int i = start;
		int n = 0;

		while (i <= end) {
			int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 0x0ff) << 8) | (((int) data[i + 2]) & 0x0ff);

			buf.append(legalChars[(d >> 18) & 63]);
			buf.append(legalChars[(d >> 12) & 63]);
			buf.append(legalChars[(d >> 6) & 63]);
			buf.append(legalChars[d & 63]);

			i += 3;

			if (n++ >= 14) {
				n = 0;
				buf.append(" ");
			}
		}

		if (i == start + len - 2) {
			int d = ((((int) data[i]) & 0x0ff) << 16) | ((((int) data[i + 1]) & 255) << 8);

			buf.append(legalChars[(d >> 18) & 63]);
			buf.append(legalChars[(d >> 12) & 63]);
			buf.append(legalChars[(d >> 6) & 63]);
			buf.append("=");
		} else if (i == start + len - 1) {
			int d = (((int) data[i]) & 0x0ff) << 16;

			buf.append(legalChars[(d >> 18) & 63]);
			buf.append(legalChars[(d >> 12) & 63]);
			buf.append("==");
		}

		return buf.toString();
	}

	private static int decode(char c) {
		if (c >= 'A' && c <= 'Z')
			return ((int) c) - 65;
		else if (c >= 'a' && c <= 'z')
			return ((int) c) - 97 + 26;
		else if (c >= '0' && c <= '9')
			return ((int) c) - 48 + 26 + 26;
		else
			switch (c) {
			case '+':
				return 62;
			case '/':
				return 63;
			case '=':
				return 0;
			default:
				throw new RuntimeException("unexpected code: " + c);
			}
	}

	/**
	 * Decodes the given Base64 encoded String to a new byte array. The byte array holding the decoded data is returned.
	 */

	public static byte[] decode(String s) {

		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		try {
			decode(s, bos);
		} catch (IOException e) {
			throw new RuntimeException();
		}
		byte[] decodedBytes = bos.toByteArray();
		try {
			bos.close();
			bos = null;
		} catch (IOException ex) {
			System.err.println("Error while decoding BASE64: " + ex.toString());
		}
		return decodedBytes;
	}

	private static void decode(String s, OutputStream os) throws IOException {
		int i = 0;

		int len = s.length();

		while (true) {
			while (i < len && s.charAt(i) <= ' ')
				i++;

			if (i == len)
				break;

			int tri = (decode(s.charAt(i)) << 18) + (decode(s.charAt(i + 1)) << 12) + (decode(s.charAt(i + 2)) << 6) + (decode(s.charAt(i + 3)));

			os.write((tri >> 16) & 255);
			if (s.charAt(i + 2) == '=')
				break;
			os.write((tri >> 8) & 255);
			if (s.charAt(i + 3) == '=')
				break;
			os.write(tri & 255);

			i += 4;
		}
	}
}

2. 3DES的加密、解密模式

CBC(key,iv,data)

ECB(key,data)

3. 補碼方式

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");// 演算法名稱/加密模式/填充方式   
Cipher cipher = Cipher.getInstance("desede/CBC/PKCS5Padding");// 演算法名稱/加密模式/填充方式 
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. Cipher cipher = Cipher.getInstance("desede/ECB/PKCS5Padding");  
Cipher cipher = Cipher.getInstance("desede/ECB/PKCS5Padding");

4. 加密後處理

為防止3DES加密後產生亂碼,對加密後的資料使用Base64.decode()一下。同樣的,解密前,對資料先Base64.decode();

[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. Base64.encode(encryptData);  
Base64.encode(encryptData);
[java] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. Base64.decode(encryptText);  
Base64.decode(encryptText);

5.注意:加密和解密方法,客戶端和後臺要使用同一套。不然很難除錯的。即使是同一串加密源和key,每次加密出來的密文也都是不一樣的。

相關推薦

Android實現3DES加密

1. 步驟 常量  private final static String secretKey = "[email protected]$#963";//必須是至少24位 [java] view plain copy print? // 向量  pri

aNDROID實現aEs加密技術

android java .com and androi aid ava lis 加密 JaVa%E9%9D%A2%E8%AF%95%E7%AC%94%E8%AF%95%E9%A2%98%E5%A4%A7%E6%B1%87%E6%80%BB%282%29 http://m

Android 實現SHA1加密演算法程式碼

實現SHA1加密程式碼 public static String getSecurityAppKey() { return encryptToSHA(RequestTools.AppId + "UZ" +

android java 3des加密 ECB/CBC

import java.security.Key; import javax.crypto.Cipher; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; impor

Java/Android中的3DES加密

3DES(或稱為Triple DES)是通過DES進行3次加密,金鑰的長度為DES的金鑰3倍,加密後的資料長度與DES加密長度相同。安全方面相對於DES加密更加安全,不容易被破解。 程式碼: /* 定義加密方式, DESede:加密演算法; ECB:工作模式 ; NOPad

php、java、android、ios通用的3des加密方法

 php、java、android、ios通用的3des方法 php <?php class DES3 { var $key = "my.oschina.net/penngo?#@"; var $iv = "01234567"; fu

Android 資料加密 ---- 3DES 加密

1. 前言 隨著計算機的發展,DES 很容易被暴力破解,DES 也一直在完善,在1999年10月25日,DES作為FIPS46-3第四次延長標準期限,其中規定優先使用 3DES,而普通DES只允許在遺留的系統中應用。 2. 介紹 密碼學中,三重資料加密演算法(英語:

[Python]實現DES加密演算法和3DES加密演算法

pyDes.py ############################################################################# # Documentation

基於java類庫的3DES加密演算法實現

別看3DES的程式碼很複雜,其實和DES程式碼一樣,核心程式碼就那麼幾行 加密部分的核心 Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.E

android中檔案加密和解密的實現

最近專案中需要用到加解密功能,言外之意就是不想讓人家在反編譯後通過不走心就能獲取檔案裡一些看似有用的資訊,但考慮到加解密的簡單實現,這裡並不使用AES或DES加解密  為了對Android中assets檔案裡的資料加密,我決定自己動手豐衣足食。  首先我們需要一個配置檔案命名為config.properti

Android比DES加密更安全的演算法——3DES加密演算法

    在前面的文章裡面,我們討論了DES演算法,同時也明白瞭如何才能保證不同平臺下的加密和解密結果的一致性。但是DES作為出現了很長時間的一種加密演算法,隨著計算機運算能力的加強,DES加密容易被暴力破解,其安全性變得有點低。於是,為了增強資料的安全性,3DES演算法

使用openssl庫實現des,3des加密

說明:最近工作中用到3des(Triple DES)加密,網上的資料大部分都是介紹演算法原理,沒什麼興趣,man了一下查到openssl提供DES_ecb3_encrypt方法,正合我意!提示:openssl庫支援很多加密演算法哦,如:AES/DES/MD5/RSA...,

java、android、io、php通用的3des加密方法

個人在使用的時候,測試java版本沒有問題,ios的需要注意base64轉換編碼的問題,會出現/+等字元轉義失敗的情況,詳情參考下面的參考檔案 ,下面的方法在專案中使用過 php未使用過。php<?php  class DES3 {      var$key = "my

Node.js 基於 ursa 模組的 RSA 加密解密(已與IOS,Android實現加密通訊)

前幾天除錯一個RSA加密,遇到一些問題,在網上找了好久好久,與Node.js相關的資源少得非常可憐,最後還是靠自己一步一步解決了,今天把程式碼和一些心得拿出來分享一下: cnode連結地址:https://cnodejs.org/topic/54d2de4cf

用CryptoJS 實現js端3des加密和解密,用openssl_encrypt實現php的3des加密解密,相容java和C#和c++等

       因為要開發社交平臺,涉及到聊天內容,這些敏感內容想用3des加密傳輸,百度了好多資料,測試了好多次,終於實現了功能,可以直接使用,這裡寫下來,希望幫助到其他朋友。      聽說微信小程式需要資料加密,相信這個能幫到大家。 這裡說一下,iv向量一般是8位

Android 實現異步加載圖片

nba while amp android pub 數據 bool 一段時間 代碼 麥洛開通博客以來,有一段時間沒有更新博文了.主要是麥洛這段時間因項目開發實在太忙了.今天周六還在公司加班,苦逼程序猿都是這樣生活的. 今天在做項目的時候,有一個實現異步加載圖片的功能,雖然比

Android實現音樂播放器(一)

simple ani call ket 打開文件 界面 方式 .cn 點擊 Graphical User Interface 本篇文章記錄了我實現Android簡單音樂播放器的過程,(一)中介紹了怎麽構建音樂播放器的前端頁面。首先大家看一下,界面最後是這樣的(界面有

Android實現一個自己定義相機的界面

content pic 圖片 log das img lis boolean xtend 我們先實現拍照button的圓形效果哈。Android開發中,當然能夠找美工人員設計圖片,然後直接拿進來。只是我們能夠自己寫代碼實現這個效果哈。最經常使用的的是用layout-

Android實現RecyclerView的下拉刷新和上拉載入很多其它

listen gre scheme void fadein 有一個 hot [] study 需求 先上效果圖, Material Design風格的下拉刷新和上拉載入很多其它。 源代碼地址(歡迎star) https://github.com

Android實現App版本自動更新

enqueue 返回值 watermark iss 界面 點擊 itl rar 執行 現在很多的App中都會有一個檢查版本的功能。例如鬥魚TV App的設置界面下: 當我們點擊檢查更新的時候,就會向服務器發起版本檢測的請求。一般的處理