1. 程式人生 > >Android端可用的AES加密/解密,已直接封裝為檔案加密

Android端可用的AES加密/解密,已直接封裝為檔案加密

主要功能類 AESHelper .java

import android.util.Log;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import
java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.SecureRandom; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.KeyGenerator; import javax.crypto.NoSuchPaddingException; import
javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AESHelper { private static final String TAG = AESHelper.class.getSimpleName(); public boolean AESCipher(int cipherMode, String sourceFilePath, String targetFilePath, String seed) { boolean
result = false; FileChannel sourceFC = null; FileChannel targetFC = null; try { if (cipherMode != Cipher.ENCRYPT_MODE && cipherMode != Cipher.DECRYPT_MODE) { return false; } Cipher mCipher = Cipher.getInstance("AES/CFB/NoPadding"); byte[] rawkey = getRawKey(seed.getBytes("UTF-8")); File sourceFile = new File(sourceFilePath); File targetFile = new File(targetFilePath); sourceFC = new RandomAccessFile(sourceFile, "r").getChannel(); targetFC = new RandomAccessFile(targetFile, "rw").getChannel(); SecretKeySpec secretKey = new SecretKeySpec(rawkey, "AES"); mCipher.init(cipherMode, secretKey, new IvParameterSpec( new byte[mCipher.getBlockSize()])); ByteBuffer byteData = ByteBuffer.allocate(1024); while (sourceFC.read(byteData) != -1) { // 通過通道讀寫交叉進行。 // 將緩衝區準備為資料傳出狀態 byteData.flip(); byte[] byteList = new byte[byteData.remaining()]; byteData.get(byteList, 0, byteList.length); //此處,若不使用陣列加密解密會失敗,因為當byteData達不到1024個時,加密方式不同對空白位元組的處理也不相同,從而導致成功與失敗。 byte[] bytes = mCipher.doFinal(byteList); targetFC.write(ByteBuffer.wrap(bytes)); byteData.clear(); } result = true; } catch (IOException | NoSuchAlgorithmException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException | NoSuchPaddingException | NoSuchProviderException e) { Log.d(TAG, e.getMessage()); } finally { try { if (sourceFC != null) { sourceFC.close(); } if (targetFC != null) { targetFC.close(); } } catch (IOException e) { Log.d(TAG, e.getMessage()); } } return result; } /** * 使用一個安全的隨機數來產生一個密匙,密匙加密使用的 * * @param seed 金鑰種子(位元組) * @return 得到的安全金鑰 * @throws NoSuchAlgorithmException */ private byte[] getRawKey(byte[] seed) throws NoSuchAlgorithmException, NoSuchProviderException { // 獲得一個隨機數,傳入的引數為預設方式。 SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "Crypto"); //網上部落格新增"Crypto" 後方能使用 // 設定一個種子,一般是使用者設定的密碼 sr.setSeed(seed); // 獲得一個key生成器(AES加密模式) KeyGenerator keyGen = KeyGenerator.getInstance("AES"); // 設定密匙長度128位 keyGen.init(128, sr); // 獲得密匙 SecretKey key = keyGen.generateKey(); // 返回密匙的byte陣列供加解密使用 return key.getEncoded(); } }

為避免執行緒阻塞,在介面裡的子執行緒中呼叫以下方法

  AESHelper mAESHelper = new AESHelper();
        //自定義金鑰,字母和數字混合
        String mSeed = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
//Cipher.ENCRYPT_MODE表示加密模式,Cipher.DECRYPT_MODE表示解密模式
        String  result = mAESHelper.AESCipher(Cipher.ENCRYPT_MODE, SourceFilePath,
                        NewFilePath + NewFileName, mSeed) ? "加密已完成" : "加密失敗!";

已經完成,親測可用,無法使用的童鞋請留下評論

相關推薦

Android可用AES加密/解密直接封裝檔案加密

主要功能類 AESHelper .java import android.util.Log; import java.io.File; import java.io.IOException; import java.io.RandomAccessFi

小程式前端js , AES加密解密java後加密解密

最近涉及到小程式前端加密解密。網上了解了一下,程式碼要麼是js,要麼是java後端。沒有一套前後端加密解密的演算法。自己整理了一下。希望對大家有用 解密和加密的方式很多,我用到的AES 小程式前端程式碼 var fun_aes = require('../../utils/aes.js') Pag

Node.js 基於 ursa 模組的 RSA 加密解密與IOSAndroid實現加密通訊)

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

python實現aes加密解密RSA簽名和驗籤RSA加密解密並呼叫介面

用python實現呼叫介面的示例程式碼,過程涉及到很多的加密演算法,值得分享一下。首先公鑰和私鑰如何生成,並且能相容java平臺,嘗試了很多方法。最終決定用openssl命令前提,需要安裝openssl,Crypto庫生成公鑰私鑰對過程:生成私鑰: openssl ge

aes加密解密含 128、192、256位cbc、cfb、ecb、ofb、pcbc模式

AES加解密總共有以下這些 演算法/模式/填充 位元組加密後資料長度 不滿16位元組加密後長度 AES/CBC/NoPadding 16

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

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

python進行des加密解密而且可以與JAVA進行互相加密解密

odi times pla dea details names ideal cati encrypt import binasciifrom pyDes import des, CBC, PAD_PKCS5import uuidimport time# pip instal

AES解密相容win和linux平臺

AES加密 此文采用對稱加密演算法-AES,所謂對稱是說傳送方和接收方的金鑰是一樣的。 據說實現該演算法的時候,設定金鑰長度大於128會出現錯誤:Illegal key size or default parameters,這是因為美國的出口限制,Sun通過許可權檔案(local_polic

Python下RSA加密/解密 簽名/

import rsa # 生成金鑰 (pubkey, privkey) = rsa.newkeys(1024) # 儲存金鑰 with open('public.pem','w+') as f: f.write(pubkey.save_pkcs1().de

微信小程式3des加密解密這個需要看我上一遍文章微信小程式不支援window物件跟navigator物件... 本加密是存在問題的加密java有時候不能解開

var base64ende = require('../utils/Base64.js'); /** * @description 3DES加密解密 */ function des(key, message, encrypt, mode, iv, padding

前後實現AES解密(一):java後實現

首先需要匯入一個第三方jsr包,commons-codec.jar 下面是一個寫好的工具類,呼叫該類的方法,實現使用指定金鑰對明文進行加解密: package util; import java.io.UnsupportedEncodingExceptio

Android獲取可用記憶體(系統sd卡u盤)

/** *通過反射獲取不同儲存卡的路徑,主要是用來獲取外掛sd卡路徑,內建sd卡路徑可通過Environment類的方法獲得 */ public static boolean hasEnoughStor

PDF的加密解密解密後隨便怎麼玩

摘要: 首先,我們要清楚PDF的加密型別和方式:PDF的密碼常規分為兩類:user password 和 owner password, user password(使用者密碼):我們要開啟/檢視/獲取任何該PDF的資訊所需要的密碼,也就是任何

jsp開發中中文傳值加密解密解決亂碼問題

一: 頁面使用js加密: user = window.encodeURI(user); user = window.encodeURI(user);

RSA加密解密String轉PublicKey、PrivateKey;附Base64.JAR

網路請求的資料需要加密,伺服器給的他們那一套在Android一直報錯,自己寫了一個;package com.cc.common.util; import javax.crypto.Cipher; import java.security.*; import java.se

資料庫加密解密SQLServerException:將截斷字串或二進位制資料的解決方法:

在做冬奧組委專案中,甲方要求加密資料庫明文資訊,在執行中因為資料中有異常資訊,如大字型資料,造成上面的問題 主要原因就是你增加的資料欄位長度超過資料庫中欄位所定義長度,去檢視一下自己資料庫中的欄位的長度,一般是誤寫出來的,檢視一下自己資料庫中需要自己設定欄位型別

一個最簡單的加密解密演算法 人人能懂 異或加密

                #include <iostream>// KEY 非常重要,不能對公眾洩露KEY值// 傳送端和接收端提前祕密約定好KEY值#define KEY 1313113 // 萬歲萬歲萬萬歲using namespace std;// 加密演算法可以公開int encr

關於android R.layout 中找不到存在的佈局檔案問題的解決

今天下午遇到一個很蛋疼的問題,打R.layout.,居然不會提示已經寫好的佈局檔案,自己把xml檔名打下去後,居然提示錯誤. 開始以為是R檔案中沒有自動生成關於佈局檔案對應的整型,看了R檔案,其實是有生成的,找了很久都不知道什麼原因. 後來發現原來是在複製的時候把andro

android編譯surface c++程式時報錯缺少.o檔案

最近在研究Android的surface系統,寫了個小demo,編譯的時候,一直報錯,說是缺少.o檔案,但是看程式碼一直沒問題,後來發現原來是在window下編寫的,然後在linux編譯的時候,字尾多了^M,所以導致編譯不過。 其實提示類似的錯誤,肯定是程式碼那塊地方出現了

android基於開源網絡框架asychhttpclient,二次封裝通用網絡請求組件

定義 pen ntc ucc 編寫 stat ner href face 網絡請求是全部App都不可缺少的功能,假設每次開發都重寫一次網絡請求或者將曾經的代碼拷貝到新的App中,不是非常合理,出於此目的,我希望將整個網絡請求框架獨立出來,與業務邏輯分隔開,這