1. 程式人生 > >Android AES 加密、解密

Android AES 加密、解密

ASE 加密、解密的關鍵在於祕鑰、只有使用加密時使用的祕鑰,才可以解密。

生成祕鑰的程式碼網上一大堆,下面的程式碼可生成一個祕鑰

private SecretKey generateKey(String seed) throws Exception {
    // 獲取祕鑰生成器
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    // 通過種子初始化
    SecureRandom secureRandom = new SecureRandom();
    secureRandom.setSeed(seed.getBytes("UTF-8"
)); keyGenerator.init(128, secureRandom); // 生成祕鑰並返回 return keyGenerator.generateKey(); }

然後使用祕鑰進行加密

private byte[] encrypt(String content, SecretKey secretKey) throws Exception {
    // 祕鑰
    byte[] enCodeFormat = secretKey.getEncoded();
    // 建立AES祕鑰
    SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"
); // 建立密碼器 Cipher cipher = Cipher.getInstance("AES"); // 初始化加密器 cipher.init(Cipher.ENCRYPT_MODE, key); // 加密 return cipher.doFinal(content.getBytes("UTF-8")); }

解密

private byte[] decrypt(byte[] content, SecretKey secretKey) throws Exception {
    // 祕鑰
    byte[] enCodeFormat = secretKey.getEncoded();
    // 建立AES祕鑰
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); // 建立密碼器 Cipher cipher = Cipher.getInstance("AES"); // 初始化解密器 cipher.init(Cipher.DECRYPT_MODE, key); // 解密 return cipher.doFinal(content); }

通常,如果加密和解密都是在同一個平臺,比較簡單,我們生成一個祕鑰以後,將祕鑰儲存到本地,解密的時候直接獲取本地的祕鑰來解密就可以了,通常的使用場景為本地將xxx檔案加密後上傳儲存或備份,需要的時候,下載再解密。這樣上傳的檔案比較安全。

看上去很完美,下面問題來了,上述生產祕鑰的方法,每次執行生成的祕鑰都是不一樣的。也就是說,加密時的祕鑰如果沒有儲存到本地,解密的時候再次呼叫上述方法生成一個祕鑰,那麼將無法解密。

解決辦法也有,使用如下方式生成祕鑰,只要種子一樣,生成的祕鑰就是一樣的。

private SecretKey generateKey(String seed) throws Exception {
    // 獲取祕鑰生成器
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    // 通過種子初始化
    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG", "Crypto");
    secureRandom.setSeed(seed.getBytes("UTF-8"));
    keyGenerator.init(128, secureRandom);
    // 生成祕鑰並返回
    return keyGenerator.generateKey();
}

但是Android N(7.0)以後將不再支援,移除了Crypto

E/System:  ********** PLEASE READ ************ 
E/System:  * 
E/System:  * New versions of the Android SDK no longer support the Crypto provider.
E/System:  * If your app was relying on setSeed() to derive keys from strings, you
E/System:  * should switch to using SecretKeySpec to load raw key bytes directly OR
E/System:  * use a real key derivation function (KDF). See advice here : 
E/System:  * http://android-developers.blogspot.com/2016/06/security-crypto-provider-deprecated-in.html 
E/System:  *********************************** 
W/System.err: java.security.NoSuchProviderException: no such provider: Crypto

下面介紹另一種解決方案,我們不用種子生成祕鑰,直接將password作為祕鑰。

如下方法 Android測試可行,IOS如果有小夥測試有問題也可以反饋給我。

加密

private byte[] encrypt(String content, String password) throws Exception {
    // 建立AES祕鑰
    SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES/CBC/PKCS5PADDING");
    // 建立密碼器
    Cipher cipher = Cipher.getInstance("AES");
    // 初始化加密器
    cipher.init(Cipher.ENCRYPT_MODE, key);
    // 加密
    return cipher.doFinal(content.getBytes("UTF-8"));
}

解密

private byte[] decrypt(byte[] content, String password) throws Exception {
    // 建立AES祕鑰
    SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES/CBC/PKCS5PADDING");
    // 建立密碼器
    Cipher cipher = Cipher.getInstance("AES");
    // 初始化解密器
    cipher.init(Cipher.DECRYPT_MODE, key);
    // 解密
    return cipher.doFinal(content);
}

注意:必須必須要注意的是,這裡的password的長度,必須為128192256bits.也就是162432byte。否則會報出如下錯誤:

com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher$1: Key length not 128/192/256 bits.

至於數字、字母、中文都各自佔幾個位元組,相信小夥伴的都是瞭解的,就不廢話了。
也可以byte[] password = new byte[16/24/32];

最後:至於最開始提到生成祕鑰的方法,為什麼種子相同,所生成的祕鑰不同,還沒看具體實現。有知道的小夥伴還請先指點一二。

相關推薦

Android AES 加密解密

ASE 加密、解密的關鍵在於祕鑰、只有使用加密時使用的祕鑰,才可以解密。 生成祕鑰的程式碼網上一大堆,下面的程式碼可生成一個祕鑰 private SecretKey generateKey(String seed) throws Exception { // 獲取祕鑰生成器 Key

Android AES 加密解密

AES:高階加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。 那麼為什麼原來的DES會被取代

android AES 加密解密

import java.security.Provider; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.Secre

ORACLE 欄位AES演算法加密解密

ORACLE 欄位AES演算法加密、解密(解決中文亂碼問題)2014年02月12日 17:13:37 華智互聯 閱讀數:97971.加解密函式入口 CREATE OR REPLACE FUNCTION F_ZNMH_SMK_CRYPT(P_SRC IN VARCHAR2, P_TYPE IN NUMBER)

對稱加密----AES和DES加密解密

呼叫AES/DES加密演算法包最精要的就是下面兩句話:Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);CBC是工作模式,DES一共有電子密碼本模式(

android AES加密解密(最新版)

專案中要用到AES加密,百度上的AES壓根不能用,也不知道是那年的東西了,和後臺不相容,後來,後臺把他的AES程式碼拷給我  通過PHP程式碼找到了對應的Android程式碼 原文地址:http://www.funboxpower.com/php_android_ios_a

java實現對稱加密AES和DES的加密解密

        目前主流的加密方式有:1、對稱加密:AES、DES      2、非對稱加密:RSA、DSA。         本文主要講解java實現呼叫AES/DES加密演算法包,呼叫過程最精要的就是下面兩句話: Cipher cipher = Cipher.getIn

Android--AES加密解密

概念不再羅嗦,百度。主要就是三步:建立Cipher物件,初始化Cipher,加密解密 AES加密演算法模式有四種:ECB、CBC、CFB、OFB 要想AES加密,至少需要一個16位的金鑰,如果是非ECB模式的加密,至少還得需要金鑰偏移量。 AES工具類: packag

(原創)android使用AES加密解密檔案

package com.vsoontech.p2p.sample; import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.io.File; import java.io.FileInputStream; import

簡單的文件讀寫---文件簡單的加密解密

directory runt turn encrypt r+ spa style static cep 文件加密 package encryption; import java.io.File; import java.io.IOException; import j

使用Python進行AES加密解密

Coding color www tor 修改 1年 add 思想 href 摘錄於:http://blog.csdn.net/nurke/article/details/77267081 另外參考:http://www.cnblogs.com/kaituorensheng

JavaScript前端和Java後端的AES加密解密

proto creat eight prop pen 保持 超出範圍 system creator 在實際開發項目中,有些數據在前後端的傳輸過程中需要進行加密,那就需要保證前端和後端的加解密需要統一。這裏給大家簡單演示AES在JavaScript前端和Java後端是如何實現

C# 設置Word文檔保護(加密解密權限設置)

C# .NET Word API 控件 免費類庫 Word 加密、解密 對於一些重要的word文檔,出於防止資料被他人查看,或者防止文檔被修改的目的,我們在選擇文檔保護時可以選擇文檔打開添加密碼或者設置文檔操作權限等,在下面的文章中將介紹如何使用類庫Free Spire.Doc for .

VUE中的 AES加密解密

加密 pad aes加密 加密和解密 解密 如果 name con ase import CryptoJS from ‘crypto-js/crypto-js‘ // 默認的 KEY 與 iv 如果沒有給 const KEY = CryptoJS.enc.Utf8.pa

python3.6執行AES加密解密方法

abc 安裝 pytho south cipher while todo 運行 install python版本:3.6.2 首先安裝pycryptodome cmd執行命令:pip install pycryptodome 特別簡單,代碼如下: #!/usr/bin

免費線上PHP加密解密混淆原始碼工具-toolfk.com

    本文要推薦的[ToolFk]是一款程式設計師經常使用的線上免費測試工具箱,ToolFk 特色是專注於程式設計師日常的開發工具,不用安裝任何軟體,只要把內容貼上按一個執行按鈕,就能獲取到想要的內容結果。ToolFk還支援  BarCode條形碼線上生成、&nb

RSA加密解密簽名驗籤的原理及方法

二、RSA加密、簽名區別   加密和簽名都是為了安全性考慮,但略有不同。常有人問加密和簽名是用私鑰還是公鑰?其實都是對加密和簽名的作用有所混淆。簡單的說,加密是為了防止資訊被洩露,而簽名是為了防止資訊被篡改。這裡舉2個例子說明。 第一個場景:戰場上,B要給A傳遞一條訊息,內容為某一指令。 RSA的加密過

RSA加密解密簽名驗簽的原理及方法

發送消息 私鑰 簽名 兩個 篡改 方法 保留 即使 指令 二、RSA加密、簽名區別   加密和簽名都是為了安全性考慮,但略有不同。常有人問加密和簽名是用私鑰還是公鑰?其實都是對加密和簽名的作用有所混淆。簡單的說,加密是為了防止信息被泄露,而簽名是為了防止信息被篡改。這裏舉2

JavaScript線上美化(格式化)壓縮加密解密混淆工具-toolfk程式設計師工具網

    本文要推薦的[ToolFk]是一款程式設計師經常使用的線上免費測試工具箱,ToolFk 特色是專注於程式設計師日常的開發工具,不用安裝任何軟體,只要把內容貼上按一個執行按鈕,就能獲取到想要的內容結果。ToolFk還支援  BarCode條形碼線上生成、&nb

HTML實現線上程式碼格式化美化加密解密壓縮一鍵轉JavaScript功能工具-toolfk程式設計師工具網

 本文要推薦的[ToolFk]是一款程式設計師經常使用的線上免費測試工具箱,ToolFk 特色是專注於程式設計師日常的開發工具,不用安裝任何軟體,只要把內容貼上按一個執行按鈕,就能獲取到想要的內容結果。ToolFk還支援  BarCode條形碼線上生成、