1. 程式人生 > >Android 檔案的加密及解密

Android 檔案的加密及解密

檔案加密及解密

1. 保護隱私資料不被未授權訪問; 什麼是加密  1. 保護隱私資料不被未授權訪問;  2. 用於隱藏真實資料,進行安全的資料傳遞;  3. 避免資料被第三方截獲; 2. 用於隱藏真實資料,進行安全的資料傳遞; 3. 避免資料被第三方截獲; 古代加密方式:置換(反序,替換) 加密演算法的歷史  古代加密方式:置換(反序,替換)  現代加密演算法:帶密碼的加密、兩套密碼的加密、動態密碼加密。  現代加密:對稱加密、非對稱加密 現代加密演算法:帶密碼的加密、兩套密碼的加密、動態密碼加密。 現代加密:對稱加密、非對稱加密 1. 能否通過一個密碼進行加密和解密的操作,如果能就是對稱加密。 對稱加密  1. 能否通過一個密碼進行加密和解密的操作,如果能就是對稱加密。  2. 對稱加密都有密碼。  3. 常用的加密方式DES, AES 2. 對稱加密都有密碼。 3. 常用的加密方式DES, AES DES 加密演算法  說明   DES 通過密碼,對資料進行大量迴圈方式的異或 操作,從而生成加密後的資料。 DES對資料依次進行加密,一次加密是8個位元組一起 因此,DES密碼,必須是64bit,也就是8個位元組  DES加密實現   1. DES加密之後的資料,不能夠直接生成字串的;   2. 加密:  M 明文, K 12345678, D 加密後資料              D = DES(M, K) 用K密碼對M進行加密生成D   3. 解密:M = DES(D, K)   4. 這種可以通過相同的密碼進行加密和解密的叫做對稱加密。  DES API   1. Cipher 加密/解密引擎,用於實際的處理   2. cipher.init(int mode, Key key) 設定加密還是解密   3. Key 對於DES需要使用 SecretKeyFactory 進行密碼建立   建立密碼物件用的是 DESKeySpec   4. Cipher update(byte[]) 每次呼叫都會返回一部分處理的資料,DES API doFinal 就只能返回最後一次的資料,不是完整的,   5. DES 加密推薦使用 doFinal 來完成。  DESede 加密方式   對於DES 或者 DESede 而言,如果實現DESede的話,那麼:Cipher 演算法調整為 DESede,SecretKeyFactory制定的演算法,同樣調整為 DESede, 其中需要使用 DESedeKeySpec 生成密碼,而且密碼的長度 24個位元組。 AES 加密演算法  特點   1. 速度快   2. 強度高   3. Java中預設支援 AES 128bit 加密    AES 256bit 美國軍方的標準;    AES 256bit 需要美國出口許可證才可以用。  DES, AES 特性 - 分塊加密   Padding: 加密的時候,分塊是資料按照固定長度一塊一塊處理,可以通過 Cipher 引數進行分塊的控制   NoPadding:如果資料不是塊長度的倍數,那麼不會填充   一般情況下,填充會自動向資料後面新增 位元組0 補齊  AES 常用的Cipher演算法   1. AES 預設可以使用,有時也會出現BadPaddingException,不建議使用   2. AES/ECB/PKCS5Padding  另外一種AES 加密形式,建議使用   3. AES/CBC/PKCS5Padding 內部的演算法模式不同。   4.演算法及密碼長度限制    演算法/模式/填充                16位元組加密後資料長度        不滿16位元組加密後長度      AES/CBC/NoPadding             16                          不支援      AES/CBC/PKCS5Padding          32                          16      AES/CBC/ISO10126Padding       32                          16      AES/CFB/NoPadding             16                          原始資料長度      AES/CFB/PKCS5Padding          32                          16      AES/CFB/ISO10126Padding       32                          16      AES/ECB/NoPadding             16                          不支援      AES/ECB/PKCS5Padding          32                          16      AES/ECB/ISO10126Padding       32                          16      AES/OFB/NoPadding             16                          原始資料長度      AES/OFB/PKCS5Padding          32                          16      AES/OFB/ISO10126Padding       32                          16      AES/PCBC/NoPadding            16                          不支援      AES/PCBC/PKCS5Padding         32                          16      AES/PCBC/ISO10126Padding      32                          16    AES API   1. Cipher 加密/解密引擎   2. 建立密碼生成器 KeyGenerator,設定密碼生成的密碼長度 128 bit和裝置安全隨機數 ,  如keyGenerator.init(128, new SecureRandom(password.getBytes()));   3.生成 SecretKey keyGenerator.generateKey()   4. 初始化 引擎 cipher.init(Cipher.ENCRYPT_MODE, secretKey)   5. 加密處理 cipher.doFinal(byte[] origData) 非對稱加密演算法  加密實現   1. M 明文 D 公鑰 E 金鑰 C 密文 n 公共模數 0x10001   2. C = M ^ E mod n   3. M = C ^ D mod n   4. 通常 E + n 作為 私鑰隱祕儲存   5. 通常 D + n 作為公鑰,可以給任何人。   6. 通過 C ^ D mon => M   7. E 通過計算兩個 1024bit 以上的整數(並且是素數),    公鑰  D = (素數1 - 1) * (素數2 - 1) E 包含兩個素數   D 安全性足夠高  非對稱加密的API   1. Cipher 可以進行加密,用的是 “RSA”, “DSA”   2. KeyPairGenerator 生成 公鑰和私鑰   3. cipher init 加密用 私鑰, init 解密 用的是公鑰初始化。 加密實現  1. M 明文 D 公鑰 E 金鑰 C 密文 n 公共模數 0x10001  2. C = M ^ E mod n  3. M = C ^ D mod n  4. 通常 E + n 作為 私鑰隱祕儲存  5. 通常 D + n 作為公鑰,可以給任何人。  6. 通過 C ^ D mon => M  7. E 通過計算兩個 1024bit 以上的整數(並且是素數),   公鑰  D = (素數1 - 1) * (素數2 - 1) E 包含兩個素數  D 安全性足夠高 非對稱加密的API  1. Cipher 可以進行加密,用的是 “RSA”, “DSA”  2. KeyPairGenerator 生成 公鑰和私鑰  3. cipher init 加密用 私鑰, init 解密 用的是公鑰初始化。 Base64、MD5編碼  android.util.Base64類   encode(byte[],flag)   encodeToString(byte[],flag) 編碼並轉換成字串   decode(byte[],flag) 解碼   flags標識    Base64.DEFAULT 預設,如果字串過長(超過76)時自動在中間加一個換行符,字串最後也會加一個換行符。可能會導致和其他模組對接時結果不一致,建議使用Base64.NO_WRAP    Base64.NO_WRAP 不換行處理    Base64.NO_PADDING 結束位置省略“==”  it.sauronsoftware.base64.Base64類   第三方Base64編碼、解碼工具類   Base64.decode(byte[]);   Base64.encode(byte[])  MD5   java.security.MessageDigest   MD5加密: