1. 程式人生 > >通過Jni實現AES的CBC模式加密解密

通過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