1. 程式人生 > >Android資料加密之Des加密

Android資料加密之Des加密

前言:

     端午節前有個同事諮詢我有關Android DES加密的相關實現,簡單的實現了一下,今天來總結一下。

     其他幾種加密方式:

DES加密介紹:

     DES是一種對稱加密演算法,所謂對稱加密演算法即:加密和解密使用相同金鑰的演算法。DES加密演算法出自IBM的研究,
後來被美國政府正式採用,之後開始廣泛流傳,但是近些年使用越來越少,因為DES使用56位金鑰,以現代計算能力,
24小時內即可被破解。

DES加密使用方式:

1.)DesUtil常量類介紹
    private final static String HEX = "0123456789ABCDEF";
    
private final static String TRANSFORMATION = "DES/CBC/PKCS5Padding";//DES是加密方式 CBC是工作模式 PKCS5Padding是填充模式 private final static String IVPARAMETERSPEC = "01020304";////初始化向量引數,AES 為16bytes. DES 為8bytes. private final static String ALGORITHM = "DES";//DES是加密方式 private static final String SHA1PRNG = "SHA1PRNG";////
SHA1PRNG 強隨機種子演算法, 要區別4.2以上版本的呼叫方法
1.)動態生成祕鑰

 長度不能夠小於8位位元組 因為DES固定格式為128bits,即8bytes。

    /*
 * 生成隨機數,可以當做動態的金鑰 加密和解密的金鑰必須一致,不然將不能解密
 */
    public static String generateKey() {
        try {
            SecureRandom localSecureRandom = SecureRandom.getInstance(SHA1PRNG);
            byte
[] bytes_key = new byte[20]; localSecureRandom.nextBytes(bytes_key); String str_key = toHex(bytes_key); return str_key; } catch (Exception e) { e.printStackTrace(); } return null; } //二進位制轉字元 public static String toHex(byte[] buf) { if (buf == null) return ""; StringBuffer result = new StringBuffer(2 * buf.length); for (int i = 0; i < buf.length; i++) { appendHex(result, buf[i]); } return result.toString(); } private static void appendHex(StringBuffer sb, byte b) { sb.append(HEX.charAt((b >> 4) & 0x0f)).append(HEX.charAt(b & 0x0f)); }
3.)處理祕鑰Key的兩種方式

    第一種:

    // 對金鑰進行處理
    private static Key getRawKey(String key) throws Exception {
        KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM);
        //for android
        SecureRandom sr = null;
        // 在4.2以上版本中,SecureRandom獲取方式發生了改變
        if (android.os.Build.VERSION.SDK_INT >= 17) {
            sr = SecureRandom.getInstance(SHA1PRNG, "Crypto");
        } else {
            sr = SecureRandom.getInstance(SHA1PRNG);
        }
        // for Java
        // secureRandom = SecureRandom.getInstance(SHA1PRNG);
        sr.setSeed(key.getBytes());
        kgen.init(64, sr); //DES固定格式為64bits,即8bytes。
        SecretKey skey = kgen.generateKey();
        byte[] raw = skey.getEncoded();
        return new SecretKeySpec(raw, ALGORITHM);
    }

   第二種:

   // 對金鑰進行處理
    private static Key getRawKey(String key) throws Exception {
        DESKeySpec dks = new DESKeySpec(key.getBytes());
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
        return keyFactory.generateSecret(dks);
    }
4.)加密實現
 /**
     * DES演算法,加密
     *
     * @param data 待加密字串
     * @param key  加密私鑰,長度不能夠小於8位
     * @return 加密後的位元組陣列,一般結合Base64編碼使用
     */
    public static String encode(String key, String data) {
        return encode(key, data.getBytes());
    }


    /**
     * DES演算法,加密
     *
     * @param data 待加密字串
     * @param key  加密私鑰,長度不能夠小於8位
     * @return 加密後的位元組陣列,一般結合Base64編碼使用
     */
    public static String encode(String key, byte[] data) {
        try {
            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
            IvParameterSpec iv = new IvParameterSpec(IVPARAMETERSPEC.getBytes());
            cipher.init(Cipher.ENCRYPT_MODE, getRawKey(key), iv);
            byte[] bytes = cipher.doFinal(data);
            return Base64.encodeToString(bytes, Base64.DEFAULT);
        } catch (Exception e) {
            return null;
        }
    }
5.)解密實現
    /**
     * 獲取編碼後的值
     *
     * @param key
     * @param data
     * @return
     */
    public static String decode(String key, String data) {
        return decode(key, Base64.decode(data, Base64.DEFAULT));
    }

    /**
     * DES演算法,解密
     *
     * @param data 待解密字串
     * @param key  解密私鑰,長度不能夠小於8位
     * @return 解密後的位元組陣列
     */
    public static String decode(String key, byte[] data) {
        try {
            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
            IvParameterSpec iv = new IvParameterSpec(IVPARAMETERSPEC.getBytes());
            cipher.init(Cipher.DECRYPT_MODE, getRawKey(key), iv);
            byte[] original = cipher.doFinal(data);
            String originalString = new String(original);
            return originalString;
        } catch (Exception e) {
            return null;
        }
    }

DES知識擴充套件:3DES

     3DES是DES加密演算法的一種模式,它使用3條64位的金鑰對資料進行三次加密。資料加密標準(DES)是美國的一種由來已久的加密標準,它使用對稱金鑰加密法。3DES(即Triple DES)是DES向AES過渡的加密演算法(1999年,NIST將3-DES指定為過渡的加密標準),是DES的一個更安全的變形。它以DES為基本模組,通過組合分組方法設計出分組加密演算法。

DES與AES比較:

      當時被問起採用DES加密內心深處我是拒絕的。單純從名字上看AES(Advanced Encryption Standard)高階加密標準,安全性要高於DES,其實AES的出現本身就是為了取代DES的,AES具有比DES更好的安全性、效率、靈活性,所以對稱加密優先採用AES。

相關推薦

Android資料加密Des加密

前言:      端午節前有個同事諮詢我有關Android DES加密的相關實現,簡單的實現了一下,今天來總結一下。      其他幾種加密方式: DES加密介紹:      DES是一種對稱加密演算法,所謂對稱加密演算法即:加密和解密使用相同金鑰的演算法。DES加密演算法出自IBM的研究,後來被

Android資料加密Aes加密

前言:     專案中除了登陸,支付等介面採用rsa非對稱加密,之外的採用aes對稱加密,今天我們來認識一下aes加密。      其他幾種加密方式: 什麼是aes加密?      高階加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijn

Android資料加密Rsa加密

前言:      最近無意中和同事交流資料安全傳輸的問題,想起自己曾經使用過的Rsa非對稱加密演算法,閒下來總結一下。      其他幾種加密方式: 什麼是Rsa加密? RSA演算法是最流行的公鑰密碼演算法,使用長度可以變化的金鑰。RSA是第一個既能用於資料加密也能用於數字簽名的演算法。RSA演算

Android資料加密MD5加密

前言:       專案中無論是密碼的儲存或者說判斷檔案是否是同一檔案,都會用到MD5演算法,今天來總結一下MD5加密演算法。 什麼是MD5加密?      MD5英文全稱“Message-Digest Algorithm 5”,翻譯過來是“訊息摘要演算法5”,由MD2、MD3、MD4演變過來的,是一種

Android資料儲存Sqlite採用SQLCipher資料庫加密實戰

前言:   最近研究了Android Sqlite資料庫(文章地址:http://www.cnblogs.com/whoislcj/p/5506294.html)以及ContentProvider程式間資料共享(http://www.cnblogs.com/whoislcj/p/5507928.html),

jdbc 加密 DES 演算法

1.沒有加密前,我們的 jdbc.propertites 檔案的資訊上這樣的: #沒有加密的 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/o2o?useUnicode=true

iOS、後臺、Android 三個一致的加密工具 ---------DES加密

首先是JAVA端的加密工具類,它同樣適用於Android端,無需任何修改,即可保證Java與Android端的加解密一致,並且中文不會亂碼。我經過和IOS共同測試,是沒有問題的 iOS端  程式碼       iOS端的加密工具

程式設計師網路安全系列(三):資料加密對稱加密演算法

系列目錄: 前文回顧 假如,明明和麗麗相互不認識,明明想給麗麗寫一封情書,讓隔壁老王送去 如何保證隔壁老王不能看到情書內容?(保密性) 如何保證隔壁老王不修改情書的內容?(完整性) 如何保證隔壁老王不冒充明明?(身份認證) 如何保證明明不能否認情書是自己寫的?(來源的不可否認) 上一節,我們使用了Ha

iOS常用加密RSA加密解密

pen style 工作 eight else mark 分段 load port 前言: iOS常用的加密有很多種,前兩天在工作中遇到了RSA加密,現在把代嗎分享出來。 RSA基本原理 RSA使用"秘匙對"對數據進行加密解密.在加密解密數據前,需要先生成公鑰(publi

Android 資料儲存 SQLite資料庫儲存

轉載自:https://www.cnblogs.com/woider/p/5136734.html ----------------------------------------SQLite資料庫---------------------------------------------- SQLite是一

Android資料儲存SQLite簡單用法

實現效果圖如下: activity_main.xml佈局檔案 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/a

Android 資料儲存File

public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { sup

加密演算法------DES加密演算法詳解

一、加密演算法的分類1.對稱加解密演算法a.通訊雙方同時掌握一個金鑰,加密解密都是由一個金鑰完成的(即加密金鑰等於解密金鑰,加解密金鑰可以相互推倒出來)。b.雙方通訊前共同擬定一個金鑰,不對第三方公開。c.不具有個體原子性,一個金鑰被共享,洩漏機率增大2.公私鑰加解密演算法a

Android資料儲存File

檔案儲存分為兩種: (1)內部儲存:  存放路徑為/data/data/package_name/files/ (2)外部儲存:  SD卡 (3)擴充對資源xml檔案的操作 一、內部儲存 1.兩個函式openFileOutput  寫入  許可權:MODE_PRIVATE,

Java 加密Desede加密(不用Base64)

專案中用到了DES加密,經過一番搜尋網上找到不少程式碼,但都用到了Base64編碼,可是這個東西是sun自用的包,不推薦使用的,心理彆扭就自己找到了不用它的方法。程式碼如下: import java.io.UnsupportedEncodingException; impo

Android資料儲存SharedPreferences詳細總結

Android中常見的幾種儲存方式: SharedPreferences SQLite資料庫儲存 檔案儲存 網路儲存 其中也許最常用的就是SharedPreferences儲存和檔案儲存了,今天總結一下SharedPreferences。帶著問題學習Sh

對稱加密AES加密

加密和解密過程中,我們一般使用byte,因為這樣不容易產生亂碼,如果直接是String型別,被加密解密後的String,對中文來說,前後的Unicode是否一致,就很難保證了。 之前說了使用異或運算子加密。在Java中,有API提供,讓我們實現AES對稱加密。

oracle MD5加密DES加密DES解密

MD5  加密  CREATE OR REPLACE FUNCTION MD5( passwd IN VARCHAR2) RETURN VARCHAR2 IS retval varchar2(32); BEGIN retval := utl_raw.cast_to_raw(DBMS_OBFUSCATION_

Android資料安全URLEncoder編碼

URLEncoder編碼 客戶端在進行網頁請求的時候,網址中可能會包含非ASCII碼形式的內容,比如中文、?、&等特殊字元。而直接把這些字元放到網址中請求是不允許的,容易和get請求的轉義符衝突,也容易出現丟失或亂碼的現象,所以需要用URLEnc

Android資料儲存SharedPreferences及如何安全儲存

前言:     最近一直在學習Android的資料儲存,當學習到SharedPreferences的時候讓我回想起了ios的NSUserDefaults,其實這兩個真是異曲同工的,實現方式都是通過xml儲存的,在ios裡叫plist檔案,裡面都是xml。 什麼是SharedPreferences儲存?