通過Jni實現AES的CBC模式加密解密
AES加密方式基本實現,出現一個問題就是程式碼的安全性。我們知道java層程式碼很容易被反編譯,很有可能洩漏我們加密方式與金鑰 內容,那我們該怎麼辦呢?我們可以使用c/c++實現加密,編譯成So庫的形式,可供java實現呼叫,這樣就大大增強程式安全性,因為so反編譯結果是 arm指令,沒有java中smali那麼易懂。完全使用c/c++實現可能會比較麻煩,其實我們也可以簡化一部分,只將金鑰使用jni實現,其它還是用java實現,這樣會簡單一些,下面是具體操作;
(1)新建專案aes
在java類中新增native介面,注意寫好native介面和System.loadLibrary()即可。程式碼如下:
public synchronized static native String getFromNativeIv(); public synchronized static native String getStringFromNative();
(2)根據class檔案生成相應的.h標頭檔案,執行如下命令即可
javah -d jni -classpath c:\Users\sodinochen\AppData\Local\Android\sdk\platforms
\android-16\android.jar;..\..\build\intermediates\classes\debug com.aes.jniaes.MainActivity
3)接下來在app module目錄下的build.gradle中設定庫檔名(生成的so檔名)。找到gradle檔案的defaultConfig這項,在裡面新增如下內容:
defaultConfig { applicationId "com.aes.jniaes" minSdkVersion 15 targetSdkVersion 22 versionCode 1 versionName "1.0" ndk { moduleName "aesjni" //生成的so名字 abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定三種abi體系結構下的so庫。目前可有可無。 } }
(4)最後就是新增靜態初始化loadLibrary程式碼,新增如下:
static { System.loadLibrary("checkapp-jni"); //so檔案的名字 }
(5)加密解密類AesUtil:
public class AesUtils { // 加密 public static String Encrypt(String sSrc, String sKey, String sIv) throws Exception { if (sKey == null) { System.out.print("Key為空null"); return null; } // 判斷Key是否為16位 if (sKey.length() != 16) { System.out.print("Key長度不是16位"); return null; } byte[] raw = sKey.getBytes(); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");// "演算法/模式/補碼方式" IvParameterSpec iv = new IvParameterSpec(sIv.getBytes());// 使用CBC模式,需要一個向量iv,可增加加密演算法的強度 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encrypted = cipher.doFinal(sSrc.getBytes()); String mm = new String(Base64.encode(encrypted, Base64.DEFAULT)); return mm;// 此處使用BASE64做轉碼功能,同時能起到2次加密的作用。 } // 解密 public static String Decrypt(String sSrc, String sKey, String sIv) throws Exception { try { // 判斷Key是否正確 if (sKey == null) { System.out.print("Key為空null"); return null; } // 判斷Key是否為16位 if (sKey.length() != 16) { System.out.print("Key長度不是16位"); return null; } byte[] raw = sKey.getBytes("UTF-8"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec iv = new IvParameterSpec( sIv.getBytes()); cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); byte[] encrypted1 = Base64.decode(sSrc, Base64.DEFAULT); try { byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original); return originalString; } catch (Exception e) { System.out.println(e.toString()); return null; } } catch (Exception ex) { System.out.println(ex.toString()); return null; } } }
相關推薦
通過Jni實現AES的CBC模式加密解密
AES加密方式基本實現,出現一個問題就是程式碼的安全性。我們知道java層程式碼很容易被反編譯,很有可能洩漏我們加密方式與金鑰 內容,那我們該怎麼辦呢?我們可以使用c/c++實現加密,編譯成So庫的形式,可供java實現呼叫,這樣就大大增強程式安全性,因為so反編譯結果是 arm指令,沒有jav
C# 實現 JAVA AES加密解密[原創]
com base gets tran con spec ole tor 技術分享 以下是網上普遍能收到的JAVA AES加密解密方法。 因為裏面用到了KeyGenerator 和 SecureRandom,但是.NET 裏面沒有這2個類。無法使用安全隨機數生成KEY。 我們
Javascript實現前端AES加密解密功能
西安人 才網 西安人才網掌握的HTML中的js前端AES加密最近因為項目需求做了一次MITM,俄然即便發現運用HTTPS,也不能確保數據傳輸過程中的安全性。 經過中間人進犯,能夠直接獲取到Http協議的一切內容。 所以開端嘗試做一些簡略的加密,在一定程度上確保安全性。本次選用AES加密數據,所以客戶端
php利用32進位制實現對id加密解密
前言 最近在專案中遇到一個問題,當前使用者分享一個邀請碼給好友,好友根據邀請碼註冊成為新使用者之後,則成為當前使用者的下級,特定條件下,可以得到下級使用者的一系列返利。這裡要實現的就是根據當前使用者的id,生成一個加密串,並且可以反向解密。經過不斷的測試調整,終於得到了最後的結果。如: id = 12
python 實現rsa 的加密解密存讀取
廢話不多說直接上程式碼 import rsa # (pubkey, privkey) = rsa.newkeys(1024) # pub = pubkey.save_pkcs1() # with open('public.pem','wb+')as f: #
使用js實現5種加密解密演算法(凱撒密碼、字母倒排序、單表置換、維基利亞、轉換加密演算法)
在學習作業系統的時候,我們會學到系統安全的章節,而在這一塊會有關於加密解密演算法的學習。 一共有5種常見的加密解密演算法:凱撒密碼、字母倒排序、單表置換、維基利亞、轉換加密演算法。 我使用了js實現了這5種演算法,而且做了視覺化處理、輸入輸出格式化處理,使得操作起來非常
用java實現文件加密解密
文件加密 import java.io.*; public class ToSecret { public static void main(String[] args) throws Exception { FileInputStre
Javascript實現base64的加密解密【轉】
場景 這幾天使用PHP向前端傳值的時候,遇到一個問題,要將程式碼傳過去賦值。如果使用urlencode()和urldecode()函式,就會出現js無法解碼的情況,因為php和js的相關函式演算法不一致。於是準備使用通用的base64加密解密。 javascript base64 加密解密 下方是b
[原始碼和文件分享]基於MFC實現的AES加密解密程式
1 演算法背景及介紹 1.1 背景 高階加密標準(Advanced Encryption Standard,AES)作為傳統對稱加密演算法標準DES的替代者,由美國國家標準與技術研究所(NIST)於1997年提出徵集該演算法的公告。1999年3月22日,NIST從15個候選演算法中公佈了5個
Java實現置換密碼加密解密
Java實現置換密碼加密解密 思路 程式碼 思路 置換密碼只不過是簡單的換位而已,這裡寫的是一個分組長度為7的置換密碼因為所學知識有限,寫的比較麻煩,這裡先簡單介紹一下思路: 1.因為置換密碼首先要將其進行分組,這裡分組長度為7,不足的位數補
Android 通過JNI C++進行MD5加密
最近升級了Android Studio 3.0.1。版本升級,越是覺得好用了。 Android Studio使用JNI之前覺得是一件比較麻煩的事,官方文件也不多,有點無從下手。本篇以CMake方式說說如何利用JNI方式使用C++進行MD5加密,這樣經過
Android開發 通過JNI實現JAVA與C/C++程式間的呼叫和回撥
在一些Android應用的開發中,需要通過JNI和 Android NDK工具實現JAVA和C/C++之間的相互呼叫。 Java Native Interface (JNI)標準是java平臺的一部分,它允許Java程式碼和其他語言寫的程式碼進行
Android 通過JNI實現守護程序,使Service服務不被殺死
開發一個需要常住後臺的App其實是一件非常頭疼的事情,不僅要應對國內各大廠商的ROM,還需要應對各類的安全管家... 雖然不斷的研究各式各樣的方法,但是效果並不好,比如工作管理員把App幹掉,服務就起不來了... 網上搜尋一番後,主要的方法有以下幾種方法,但其實也都
Java實現SSH模式加密原理及程式碼
一、SSH加密原理 SSH是先通過非對稱加密告訴服務端一個對稱加密口令,然後進行驗證使用者名稱和密碼的時候,使用雙方已經知道的加密口令進行加密和解密,見下圖: 解釋:SSH中為什麼要使用非對稱加密,又使用對稱加密,到底有什麼用處?到底安全不安全?既然後來又使用了對稱加密,開始的時候為什麼還要用非對稱加密?
NDK+OpenSSl,通過JNI技術開發so加密庫
以下是個人在做加密演算法庫時一些經驗總結,今天把它寫下來分享給大家,希望對大家以後再做類似的開發工作時能有所幫助,少走些彎路。 主要從以下5個方面進行闡述: 1. Openssl安裝,1.0.1與1.0.2使用時的區別 2. Linux下gcc的使用方法,及可能遇到的問題
SpringBoot使用自定義註解實現簡單引數加密解密(註解+HandlerMethodArgumentResolver)
# 前言 > 我黃漢三又回來了,快半年沒更新部落格了,這半年來的經歷實屬不易, > 疫情當頭,本人實習的公司沒有跟員工共患難,直接辭掉了很多人。 > 作為一個實習生,本人也被無情開除了。所以本人又得重新準備找工作了。 > 算了,感慨一下,本來想昨天發的,但昨天是清明,哀悼時期,就留到了今天發。 話不多說,
CTR分組模式實現AES加密解密(go語言)
版權宣告:本文為作者原創,如需轉載,請註明出處 https://blog.csdn.net/weixin_42940826 AES演算法簡介 AES演算法是為了取代DES演算法而生,雖然3DES演算法仍然可以使用,但是效率比較低下,AES演算法是在眾多演算法中選拔
C++呼叫openssl實現DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式
============================================== des cbc 加密 zeropadding填充方式 ============================================== //加密 cbc ze
通過ios實現RSA加密和解密
在加密和解密中,我們需要了解的知識有什麼事openssl;RSA加密演算法的基本原理;如何通過openssl生成最後我們需要的der和p12檔案。 廢話不多說,直接寫步驟: 第一步:openssl來生成公鑰和私鑰證書,最後需要得到公鑰證書和私鑰證書。這是在mac OX系統
init.rc文件中面啟動c++程序,通過jni調用java實現
mini val sni ril urn runtime sport mco env </pre><p>註:假設是自己的myself.jar包,還要修改例如以下:</p><p>target/product/core_bas