安卓實現魔改版 CRC32 算法

版權歸作者所有,如有轉發,請注明文章出處:https://cyrus-studio.github.io/blog/

關于 CRC32 算法介紹可以參考這篇文章:常用加解密算法介紹

標準 CRC32 算法

創建 crc32.cpp,使用 C++ 實現標準 CRC32 算法

#include <jni.h>
#include <string>
#include <android/log.h>#define TAG "CRC32"unsigned int crc32_table[256];// 初始化 CRC32 查找表
void init_crc32_table() {unsigned int crc;for (int i = 0; i < 256; i++) {crc = i;for (int j = 8; j > 0; j--) {if (crc & 1) {crc = (crc >> 1) ^ 0xedb88320;} else {crc >>= 1;}}crc32_table[i] = crc;}
}// 計算 CRC32
unsigned int crc32(const std::string& str) {unsigned int crc = 0xffffffff;for (size_t i = 0; i < str.size(); i++) {unsigned char byte = str[i];crc = (crc >> 8) ^ crc32_table[(crc ^ byte) & 0xff];}return ~crc;
}

kotlin 層聲明 native 方法

package com.cyrus.example.crc32class CRC32Utils {companion object {// 加載 native 庫init {System.loadLibrary("crc32")}// 聲明 native 靜態方法@JvmStaticexternal fun crc32(input: String): String}}

實現 native 方法并調用 crc32 方法進行加密并返回 hex 字符串

extern "C" JNIEXPORT jstring JNICALL
Java_com_cyrus_example_crc32_CRC32Utils_crc32(JNIEnv *env, jclass , jstring input) {// 初始化 CRC32 表(只需調用一次)static bool is_initialized = false;if (!is_initialized) {init_crc32_table();is_initialized = true;}// 獲取輸入的字符串const char* str = env->GetStringUTFChars(input, nullptr);std::string input_str(str);env->ReleaseStringUTFChars(input, str);// 計算 CRC32 值unsigned int crc = crc32(input_str);// 返回 CRC32 的十六進制字符串char crcHex[9];  // CRC32 是 32 位,最大為 8 位十六進制數snprintf(crcHex, sizeof(crcHex), "%08x", crc);return env->NewStringUTF(crcHex);
}

調用示例:

CRC32Utils.crc32("txj1Dc")

效果如下:

word/media/image1.png

自定義 Table 版 CRC32 算法

CRC32 Table 是通過 init_crc32_table 方法中 位移 和 異或 常量 0xedb88320 運算得來的

crc = (crc >> 1) ^ 0xedb88320;

標準的 CRC32 Table 如下:

 0, 0x77073096, 0xEE0E612C, 0x990951BA,0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D

我們可以通過修改常量值,實現自定義 Table,比如改成 0xd76aa478

#include <jni.h>
#include <string>
#include <android/log.h>#define TAG "CustomCRC32"unsigned int custom_crc32_table[256];// 初始化 CRC32 查找表
void init_custom_crc32_table() {unsigned int crc;for (int i = 0; i < 256; i++) {crc = i;for (int j = 8; j > 0; j--) {if (crc & 1) {crc = (crc >> 1) ^ 0xd76aa478;} else {crc >>= 1;}}custom_crc32_table[i] = crc;}
}// 計算 CRC32
unsigned int custom_crc32(const std::string& str) {unsigned int crc = 0xffffffff;for (size_t i = 0; i < str.size(); i++) {unsigned char byte = str[i];crc = (crc >> 8) ^ custom_crc32_table[(crc ^ byte) & 0xff];}return ~crc;
}extern "C" JNIEXPORT jstring JNICALL
Java_com_cyrus_example_crc32_CRC32Utils_customTableCRC32(JNIEnv *env, jclass , jstring input) {// 初始化 CRC32 表(只需調用一次)static bool is_initialized = false;if (!is_initialized) {init_custom_crc32_table();is_initialized = true;}// 獲取輸入的字符串const char* str = env->GetStringUTFChars(input, nullptr);std::string input_str(str);env->ReleaseStringUTFChars(input, str);// 計算 CRC32 值unsigned int crc = custom_crc32(input_str);// 返回 CRC32 的十六進制字符串char crcHex[9];  // CRC32 是 32 位,最大為 8 位十六進制數snprintf(crcHex, sizeof(crcHex), "%08x", crc);return env->NewStringUTF(crcHex);
}

效果如下:

word/media/image2.png

魔改版 CRC32 算法

魔改邏輯:

  • 修改常量 0xedb88320 改為 0x82F63B78

  • 初始值 0xffffffff 改為 0xDEADBEEF。

  • XOR 0xA5 擾動輸入。

  • 右移 7 位,而非 8 位。

  • 計算 CRC 時額外 XOR 0xA5A5A5A5 進一步擾動結果。

#include <jni.h>
#include <string>
#include <android/log.h>#define TAG "ModifiedCRC32"// 魔改版 CRC32 表
unsigned int modified_crc32_table[256];// 初始化魔改版 CRC32 查找表
void init_modified_crc32_table() {for (int i = 0; i < 256; i++) {unsigned int crc = i;for (int j = 8; j > 0; j--) {if (crc & 1) {crc = (crc >> 1) ^ 0x82F63B78;} else {crc >>= 1;}}modified_crc32_table[i] = crc;}
}// 魔改版 CRC32 計算
unsigned int modified_crc32(const std::string& str) {unsigned int crc = 0xDEADBEEF;  // 魔改初始值for (size_t i = 0; i < str.size(); i++) {unsigned char byte = str[i] ^ 0xA5;  // 額外擾動crc = ((crc >> 7) ^ modified_crc32_table[(crc ^ byte) & 0xff]) ^ 0xA5A5A5A5; // 變更位移方式 & 額外 XOR 干擾}return ~crc;
}extern "C" JNIEXPORT jstring JNICALL
Java_com_cyrus_example_crc32_CRC32Utils_modifiedCRC32(JNIEnv *env, jclass, jstring input) {// 初始化 CRC32 表(只需調用一次)static bool is_initialized = false;if (!is_initialized) {init_modified_crc32_table();is_initialized = true;}// 獲取輸入字符串const char* str = env->GetStringUTFChars(input, nullptr);std::string input_str(str);env->ReleaseStringUTFChars(input, str);// 計算魔改版 CRC32unsigned int crc = modified_crc32(input_str);// 返回十六進制格式的 CRC32 結果char crcHex[9];snprintf(crcHex, sizeof(crcHex), "%08x", crc);return env->NewStringUTF(crcHex);
}

效果如下:

word/media/image3.png

完整源碼

完整源碼地址:https://github.com/CYRUS-STUDIO/AndroidExample

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73210.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73210.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73210.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

OneHot編碼與OrdinalEncoder編碼的區別與應用解析

OneHot編碼和OrdinalEncoder編碼是兩種常見的類別特征編碼方式&#xff0c;它們的主要目的是將類別數據轉換為數值數據&#xff0c;以便機器學習算法能夠處理。下面是對這兩種編碼方式的詳細解釋和比較&#xff1a; 一、OneHot編碼 1. 定義&#xff1a; OneHot編碼是一種將每…

python離線安裝

Python Releases for Windows | Python.org 下載包地址widows一般是64bit的包 下載完成后雙擊&#xff0c;在彈出的首個頁面會看到下面的圖 第一步&#xff1a;建議手動安裝 第二步&#xff1a;一定要勾選把版本加入到Path路徑 然后就是無腦下一步&#xff0c;到這一步就可…

Web開發-PHP應用文件操作安全上傳下載任意讀取刪除目錄遍歷文件包含

知識點&#xff1a; 1、安全開發-原生PHP-文件安全操作 2、安全開發-原生PHP-上傳讀取刪除包含等 3、安全開發-原生PHP-代碼審計文件安全 一、演示案例-WEB開發-文件安全-上傳下載讀取 文件上傳 $_FILES&#xff1a;PHP中一個預定義的超全局變量&#xff0c;用于在上傳文件時…

自然語言處理:文本聚類

介紹 大家好&#xff0c;博主又來和大家分享自然語言處理領域的知識了。今天給大家分享的內容是自然語言處理中的文本聚類。 文本聚類在自然語言處理領域占據著重要地位&#xff0c;它能將大量無序的文本按照內容的相似性自動劃分成不同的類別&#xff0c;極大地提高了文本處…

JavaScript 運算符詳解

引言 在 JavaScript 編程中&#xff0c;運算符是用于對數據進行操作的特殊符號。通過使用運算符&#xff0c;我們可以實現各種計算、比較和邏輯判斷等功能。JavaScript 中的運算符種類豐富&#xff0c;涵蓋了算術、比較、邏輯、賦值等多個方面。下面將詳細介紹各類運算符及其使…

基于javaweb的SpringBoot個人健康管理系統小程序微信小程序設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論…

責任鏈模式的C++實現示例

核心思想 責任鏈模式是一種行為設計模式&#xff0c;允許多個對象都有機會處理請求&#xff0c;從而避免請求的發送者與接收者之間的耦合。請求沿著處理鏈傳遞&#xff0c;直到某個對象處理它為止。 解決的問題 ?解耦請求發送者與處理者&#xff1a;請求的發送者無需知道具…

Java 無 GUI 瀏覽器:HtmlUnit 入門及實戰 [特殊字符]

文章目錄 HtmlUnit 入門功能簡介入門案例更多功能HtmlUnit 實戰需求頁面分析編碼參考? 本文目標: HtmlUnit 框架入門HtmlUnit 框架實戰:實現 HtmlUnit 訪問 Web 頁面,并實現 Web 頁面按鈕點擊,同時獲取到下載的文件。HtmlUnit 入門 ?? 官網:https://htmlunit.sourcefo…

微軟 NativeAOT

微軟Native AOT&#xff08;Ahead-Of-Time&#xff09;是.NET平臺中一種新的運行模式&#xff0c;它直接將IL&#xff08;Intermediate Language&#xff0c;中間語言&#xff09;代碼編譯為目標平臺的機器碼發布&#xff0c;與JIT&#xff08;Just-In-Time&#xff0c;即時編譯…

Vue項目搜索引擎優化(SEO)終極指南:從原理到實戰

文章目錄 1. SEO基礎與Vue項目的挑戰1.1 為什么Vue項目需要特殊SEO處理&#xff1f;1.2 搜索引擎爬蟲工作原理 2. 服務端渲染&#xff08;SSR&#xff09;解決方案2.1 Nuxt.js框架實戰原理代碼實現流程圖 2.2 自定義SSR實現 3. 靜態站點生成&#xff08;SSG&#xff09;技術3.1…

Java 枚舉

一、簡介 Java 枚舉是一種強大的工具&#xff0c;其本質上是一個繼承自 java.lang.Enum 的類&#xff0c;用于定義一組固定的常量&#xff0c;每個枚舉常量都是該枚舉類的一個實例。枚舉不僅提供了類型安全性&#xff0c;還可以像普通類一樣擁有字段、方法和構造函數。枚舉的使…

CentOS7安裝DNS服務器bind

文章目錄 安裝DNS服務設置配置文件自定義域名解析完整配置 需求是公司內網服務器無法連接外網&#xff0c;需要在本地搭建DNS服務&#xff0c;這樣物理機器遷移到內網后&#xff0c;通過域名解析訪問服務 DNS服務器 172.25.14.215 ip域名172.25.14.216mysql.server172.25.14.2…

DFS刷題(25.3.13)

題目1——烤雞 題目描述 題解 這是一個簡單的暴搜題目&#xff0c;由于一共由10種配料&#xff0c;每種配料可以放1到3克&#xff0c;因此只需要用dfs對每種配料放入的質量進行暴力搜索即可&#xff0c;如果放入的配料質量之和等于題目給出的美味程度 n n n&#xff0c;記錄一…

C#中除了Dictionary,List,HashSet,HashTable 還有哪些可以保存列表的數據類型?

在 C# 中&#xff0c;除了 Dictionary、List、HashSet 和 Hashtable 之外&#xff0c;還有許多其他可以保存列表或集合類型的數據結構&#xff0c;具體包括以下幾類&#xff1a; &#x1f4cc; 數組類 1. Array&#xff08;數組&#xff09; 固定長度&#xff0c;性能高&…

《Python實戰進階》第21集:數據存儲:Redis 與 MongoDB 的使用場景

第21集&#xff1a;數據存儲&#xff1a;Redis 與 MongoDB 的使用場景 摘要 在現代應用開發中&#xff0c;數據存儲的選擇直接影響系統的性能、擴展性和成本。Redis 和 MongoDB 是兩種極具代表性的數據庫技術&#xff0c;它們分別擅長解決不同場景下的問題。本文將深入探討 Re…

三視圖轉stl導出 空心面片體 networkx shapely triangle numpy-stl

from shapely.geometry import Polygon import triangle from shapely.ops import unary_union from stl import mesh import numpy as np from collections import defaultdict from 三維投影線段尋找 import get_adjusted_clusters,get_clusters,get_intersect_lines import …

大摩閉門會:250312 學習總結報告

如果圖片分辨率不足&#xff0c;可右鍵圖片在新標簽打開圖片或者下載末尾源文件進行查看 本文只是針對視頻做相應學術記錄&#xff0c;進行學習討論使用

【51單片機】程序實驗15.DS18B20溫度傳感器

主要參考學習資料&#xff1a;B站【普中官方】51單片機手把手教學視頻 開發資料下載鏈接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 單片機套裝&#xff1a;普中STC51單片機開發板A4標準版套餐7 目錄 DS18B20介紹主要特性內部結構控制時序初始化時序寫時序讀時序…

ESP32芯片模組方案,設備物聯網無線通信,WiFi藍牙交互控制應用

在當下&#xff0c;物聯網正以前所未有的速度席卷全球&#xff0c;從繁華都市的智能建筑&#xff0c;到寧靜鄉村的智慧農業&#xff0c;從人們日常使用的可穿戴設備&#xff0c;到工業領域復雜精密的自動化生產線&#xff0c;物聯網的觸角已深入到生活與生產的每一個角落。 而…

Linux第二次練習

1.首先在根下面創建一個名為text的目錄 2.在根目錄下新建一個text目錄&#xff0c;然后在text目錄中新建上圖的一級目錄、二級目錄以及三級目錄 3.顯示/text目錄下文件的樹形拓撲圖 4.將linux樹狀結構圖中列出的所有文件用ll命令列出來