安卓实现魔改版 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.mzph.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命令列出来