当前位置: 首页 > news >正文

网站运营工作内容wordpress 长页面

网站运营工作内容,wordpress 长页面,wordpress app应用,监控直播网站开发近期的一个项目需要用到SM3加密算法#xff0c;需要在iOS中使用Objective-C实现SM3国密加密算法。 SM3#xff1a;是中国国家密码管理局发布的密码杂凑算法标准#xff0c;适用于商用密码应用中的数字签名和验证、消息认证码的生成与验证以及随机数的生成等 由于iOS系统并未…近期的一个项目需要用到SM3加密算法需要在iOS中使用Objective-C实现SM3国密加密算法。 SM3是中国国家密码管理局发布的密码杂凑算法标准适用于商用密码应用中的数字签名和验证、消息认证码的生成与验证以及随机数的生成等 由于iOS系统并未内置SM3算法我们需要使用第三方开源库或自己实现 GMObjC库 是一个基于 OpenSSL 的国密SM2、SM3、SM4算法的 Objective-C 开源库适用于 iOS 和 macOS 开发。它封装了中国国家密码管理局发布的多种加密算法包括 1. SM2 支持基于椭圆曲线ECC的加解密密钥协商ECDH和签名算法 2. SM3 类似 SHA 系列的国密哈希算法包含 SM3 和 HMAC 等 3. SM4 实现对称分组加密算法 **GmSSL库**GmSSL是由北京大学自主开发的国产商用密码开源库实现了对国密算法、标准和安全通信协议的全面功能覆盖支持包括移动端在内的主流操作系统和处理器支持密码钥匙、密码卡等典型国产密码硬件提供功能丰富的命令行工具及多种编译语言编程接口 方案一使用第三方库GMObjC 集成GMObjC集成GMObjC方法 因为我们的项目是SDK不便用CocoaPods方法因此我只能选择直接集成和手动编译为 Framework。 1.直接集成 (demo) 1.从 Git 下载最新代码找到和 README 同级的 GMObjC 文件夹将 GMObjC 文件夹拖入项目 2.找到和 README 同级的 Frameworks 文件夹将项目 Frameworks/OpenSSL.xcframework 拖入项目 3.在需要使用的地方导入头文件 GMObjC.h 即可使用 SM2、SM4 加解密签名验签计算 SM3 摘要等 注意事项 GMObjC 依赖 OpenSSL可直接拖入 Frameworks/OpenSSL.xcframework 或通过pod GMOpenSSL安装 OpenSSL。 如果项目中已集成 OpenSSL 1.1.1l 以上版本可共用同一个 OpenSSL否则需要使用 Carthage 将 GMObjC 编译为动态库。 我按照以上步骤将文件导入后报错 OpenSSL.xcframework 签名验证失败 终端执行强制重签名命令 codesign --force --deep --sign - 你的路径/OpenSSL.xcframework 返回你的路径/OpenSSL.xcframework: replacing existing signature 现在就可以运行测试了 #import GMObjC.hNSString *str 1231234; NSString *digest [GMSm3Utils hashWithText:str]; NSLog(%, digest);2.手动编译为 Framework (demo) 1.动态库‌ 从 GitHub 下载源码打开项目GMObjC-master/Frameworks/GMObjC.xcframework把这个拖入项目 在 Xcode 的 General → Frameworks, Libraries, and Embedded Content 中需标记为 Embed Sign #import GMObjC/GMObjC.hNSString *digest1 [GMSm3Utils hashWithText:str]; NSLog(%, digest1);2.静态库 从 GitHub 下载源码打开项目 GMObjC.xcodeproj设置 Build Settings - Linking-General - Mach-O Type 为 Static Library 手动编译为静态库 GMObjC.framework **合并为 XCFramework**通过xcodebuild -create-xcframework命令来合并为 XCFramework通过合并 GMObjC 库的模拟器和真机版本来演示 # 创建合并包 GMObjC.xcframeworkxcodebuild -create-xcframework \-framework Release-iphoneos/GMObjC.framework \-framework Release-iphonesimulator/GMObjC.framework \-output GMObjC.xcframework把生成的GMObjC.xcframework拖入项目即可 3.CocoaPods安装GMObjC (GMObjC-demo) (GMDynamic-demo) GMObjC 和 GMDynamic 只能安装其中一个二者不能同时安装。 GMObjC 为静态库GMDynamic 为编译好的 GMObjC 动态库版本。 # 安装 GMObjC 的源码和 GMOpenSSL.xcframework (静态库) pod GMObjC, ~ 4.0.3# 当 Podfile 中使用 use_frameworks! 时安装 GMObjC.xcframework (动态库) pod GMDynamic, ~ 4.0.3方案二使用第三方库GmSSL(demo) 集成GmSSL 但是我用这种方法不行我用了其他的方法。 我们使用GmSSL 3.xmaster分支来编译iOS的静态库libcrypto.a和libssl.a。由于3.x版本采用了CMake构建系统因此流程与2.x不同。 GmSSL 3.x 的构建系统已经发生了变化生成的库文件名为 libgmssl.a 而不是传统的 libcrypto.a 和 libssl.a。 如果项目必须使用 libcrypto.a 和 libssl.a请回退到 GmSSL 2.x 克隆代码并切换到master分支或最新的稳定标签 配置CMake工具链文件为iOS交叉编译 分别编译arm64真机和x86_64模拟器架构 使用lipo合并成通用静态库 将生成的静态库和头文件集成到iOS项目中。 创建编译脚本 build_ios.sh放在GmSSL根目录 #!/bin/bash set -e# 确保使用正确的路径 export PATH/usr/local/bin:$PATH# 设置环境变量 export XCODE_PATH$(xcode-select -p) export IOS_SDK$XCODE_PATH/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk export SIM_SDK$XCODE_PATH/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk# 创建输出目录 OUTPUT_DIRbuild-ios rm -rf $OUTPUT_DIR mkdir -p $OUTPUT_DIR# 编译函数 compile_arch() {ARCH$1SDK$2BUILD_DIR${OUTPUT_DIR}/${ARCH}mkdir -p $BUILD_DIRpushd $BUILD_DIR /dev/nullecho ▸ 配置 $ARCH...cmake ../.. \-DCMAKE_SYSTEM_NAMEiOS \-DCMAKE_OSX_ARCHITECTURES$ARCH \-DCMAKE_OSX_SYSROOT$SDK \-DCMAKE_OSX_DEPLOYMENT_TARGET13.0 \-DCMAKE_BUILD_TYPERelease \-DBUILD_SHARED_LIBSOFF \-DENABLE_SM2ON \-DENABLE_SM3ON \-DENABLE_SM4ON \-DENABLE_SM9ON \-G Ninjaecho ▸ 编译 $ARCH...ninja# 关键修改GmSSL 3.x 生成的库是 libgmssl.amkdir -p libcp bin/libgmssl.a lib/popd /dev/null }# 编译各架构 compile_arch arm64 $IOS_SDK compile_arch x86_64 $SIM_SDK# 合并通用库 UNIVERSAL_DIR${OUTPUT_DIR}/universal mkdir -p $UNIVERSAL_DIR/lib# 合并为单个库 (GmSSL 3.x 只生成一个库) lipo -create \${OUTPUT_DIR}/arm64/lib/libgmssl.a \${OUTPUT_DIR}/x86_64/lib/libgmssl.a \-output $UNIVERSAL_DIR/lib/libgmssl.a# 复制头文件 if [ -d ${OUTPUT_DIR}/arm64/include ]; thencp -R ${OUTPUT_DIR}/arm64/include $UNIVERSAL_DIR/ elif [ -d ../../include ]; thencp -R ../../include $UNIVERSAL_DIR/ elseecho ⚠️ 警告: 找不到头文件目录 fiecho ✅ 编译成功 echo 库文件位置: $UNIVERSAL_DIR/lib/libgmssl.a echo 头文件位置: $UNIVERSAL_DIR/include# 验证文件 file $UNIVERSAL_DIR/lib/*.a lipo -info $UNIVERSAL_DIR/lib/libgmssl.a然后按照以下步骤进行执行 # 安装构建工具 brew install cmake ninja pkg-config# 获取最新代码 git clone https://github.com/guanzhi/GmSSL.git cd GmSSL git checkout master # 确保使用最新版本 git pull# 2. 执行编译 chmod x build_ios.sh ./build_ios.sh将GmSSL/build-ios/universal/lib/libgmssl.a 拖入项目 将GmSSL/include/gmssl 拖入项目 import “sm3.h” 封装方法 interface GmSSLEncryptorSM3 : NSObject (NSString *)sm3HashWithString:(NSString *)input;(NSData *)sm3HashWithData:(NSData *)data;endimplementation GmSSLEncryptorSM3 (instancetype)encryptor {return [[GmSSLEncryptorSM3 alloc] init]; } (NSData *)sm3HashWithData:(NSData *)data {// 初始化 SM3 上下文SM3_CTX ctx;sm3_init(ctx);// 添加数据到哈希计算sm3_update(ctx, data.bytes, data.length);// 准备存储结果的缓冲区 (SM3 输出为 32 字节)uint8_t dgst[SM3_DIGEST_SIZE];// 完成哈希计算sm3_finish(ctx, dgst);// 转换为 NSDatareturn [NSData dataWithBytes:dgst length:SM3_DIGEST_SIZE]; } (NSString *)sm3HashWithString:(NSString *)input {NSData *inputData [input dataUsingEncoding:NSUTF8StringEncoding];// 计算 SM3 哈希NSData *hashData [GmSSLEncryptorSM3 sm3HashWithData:inputData];// 转换为十六进制字符串显示NSMutableString *hexString [NSMutableString string];const uint8_t *bytes (const uint8_t *)hashData.bytes;for (NSUInteger i 0; i hashData.length; i) {[hexString appendFormat:%02x, bytes[i]];}return hexString; } end就可以在项目中使用了 NSString *encryptor [GmSSLEncryptorSM3 sm3HashWithString:str]; NSLog(%, encryptor);方案三纯 Objective-C 实现无依赖(demo) SM3本质上不是加密算法它是是一种杂凑函数是在[SHA-256]基础上改进实现的一种算法它不是对数据进行加密然后再解密而是生成一个256位的散列值因此SM3适用于内容摘要数字签名验证或密码验证等。 SM3算法的执行过程 根据SM3标准文档GM/T 0004-2012 **消息扩展**将16个32位字扩展为68个字W和64个字W1使用P1宏。 **压缩函数**64轮迭代更新寄存器A-H每轮使用FF1/GG1等宏。 **常量**压缩函数中的常量0x7A879D8ATJ的固定值。 **结果输出**将最终状态寄存器转换为大端序字节流256位。 // // SM3Encryptor.m // testDemo // // Created by wt on 2025/6/12. //#import SM3Encryptor.h #include stdint.h// SM3 上下文结构 typedef struct {uint32_t state[8]; // 8个32位寄存器A-Huint64_t totalLength; // 总消息长度位uint8_t buffer[64]; // 当前数据块缓存uint32_t bufferLength; // 当前缓冲区长度 } SM3Context;// 循环左移 static inline uint32_t ROTL(uint32_t x, uint8_t n) {return (x n) | (x (32 - n)); }// 布尔函数 FF00≤j≤15 static inline uint32_t FF0(uint32_t x, uint32_t y, uint32_t z) {return x ^ y ^ z; }// 布尔函数 FF116≤j≤63 static inline uint32_t FF1(uint32_t x, uint32_t y, uint32_t z) {return (x y) | (x z) | (y z); }// 布尔函数 GG00≤j≤15 static inline uint32_t GG0(uint32_t x, uint32_t y, uint32_t z) {return x ^ y ^ z; }// 布尔函数 GG116≤j≤63 static inline uint32_t GG1(uint32_t x, uint32_t y, uint32_t z) {return (x y) | ((~x) z); }// 置换函数 P0 static inline uint32_t P0(uint32_t x) {return x ^ ROTL(x, 9) ^ ROTL(x, 17); }// 置换函数 P1 static inline uint32_t P1(uint32_t x) {return x ^ ROTL(x, 15) ^ ROTL(x, 23); }// 初始化SM3上下文 void SM3Init(SM3Context *context) {// SM3标准初始值context-state[0] 0x7380166F;context-state[1] 0x4914B2B9;context-state[2] 0x172442D7;context-state[3] 0xDA8A0600;context-state[4] 0xA96F30BC;context-state[5] 0x163138AA;context-state[6] 0xE38DEE4D;context-state[7] 0xB0FB0E4E;context-totalLength 0;context-bufferLength 0;memset(context-buffer, 0, 64); }// 处理单个64字节块压缩函数核心 void SM3Compress(SM3Context *context, const uint8_t block[64]) {// 1. 消息扩展16字 → 68字W 64字W1uint32_t W[68], W1[64];// 初始化前16字大端序转换for (int i 0; i 16; i) {W[i] (uint32_t)block[i*4] 24 |(uint32_t)block[i*41] 16 |(uint32_t)block[i*42] 8 |(uint32_t)block[i*43];}// 计算W[16]-W[67]for (int j 16; j 68; j) {uint32_t temp W[j-16] ^ W[j-9] ^ ROTL(W[j-3], 15);W[j] P1(temp) ^ ROTL(W[j-13], 7) ^ W[j-6];}// 计算W1[0]-W1[63]for (int j 0; j 64; j) {W1[j] W[j] ^ W[j4];}// 2. 寄存器初始化A-Huint32_t A context-state[0];uint32_t B context-state[1];uint32_t C context-state[2];uint32_t D context-state[3];uint32_t E context-state[4];uint32_t F context-state[5];uint32_t G context-state[6];uint32_t H context-state[7];// 3. 64轮迭代严格遵循标准for (int j 0; j 64; j) {uint32_t SS1, SS2, TT1, TT2;// 常量选择关键修正uint32_t TJ (j 16) ? 0x79CC4519 : 0x7A879D8A;// 计算SS1/SS2修正了TJ参数SS1 ROTL(ROTL(A, 12) E ROTL(TJ, j % 32), 7);SS2 SS1 ^ ROTL(A, 12);// 计算TT1/TT2使用内联函数if (j 16) {TT1 FF0(A, B, C) D SS2 W1[j];TT2 GG0(E, F, G) H SS1 W[j];} else {TT1 FF1(A, B, C) D SS2 W1[j];TT2 GG1(E, F, G) H SS1 W[j];}// 更新寄存器严格顺序D C;C ROTL(B, 9);B A;A TT1;H G;G ROTL(F, 19);F E;E P0(TT2);}// 4. 更新最终状态与初始IV异或context-state[0] ^ A;context-state[1] ^ B;context-state[2] ^ C;context-state[3] ^ D;context-state[4] ^ E;context-state[5] ^ F;context-state[6] ^ G;context-state[7] ^ H; }// 更新数据可分多次调用 void SM3Update(SM3Context *context, const uint8_t *data, size_t length) {context-totalLength length * 8; // 更新总位数字节转位// 处理缓冲区中的剩余空间if (context-bufferLength 0) {size_t copySize MIN(64 - context-bufferLength, length);memcpy(context-buffer context-bufferLength, data, copySize);context-bufferLength copySize;data copySize;length - copySize;if (context-bufferLength 64) {SM3Compress(context, context-buffer);context-bufferLength 0;}}// 处理完整块while (length 64) {SM3Compress(context, data);data 64;length - 64;}// 缓存剩余数据if (length 0) {memcpy(context-buffer, data, length);context-bufferLength length;} }// 完成哈希计算 void SM3Final(SM3Context *context, uint8_t output[32]) {// 计算填充长度SM3标准补位1 k个0 64位长度size_t totalBits context-totalLength;size_t paddingBits (context-bufferLength 56) ?(56 - context-bufferLength) :(120 - context-bufferLength);// 构建填充数据uint8_t padding[128] {0};padding[0] 0x80; // 补位起始位二进制10000000// 添加填充SM3Update(context, padding, paddingBits);// 添加消息长度大端序64位uint64_t bitCount CFSwapInt64HostToBig(totalBits);SM3Update(context, (uint8_t *)bitCount, 8);// 确保最后一个块被处理if (context-bufferLength 0) {memset(context-buffer context-bufferLength, 0, 64 - context-bufferLength);SM3Compress(context, context-buffer);}// 输出最终哈希256位大端序for (int i 0; i 8; i) {output[i*4] (uint8_t)(context-state[i] 24);output[i*4 1] (uint8_t)(context-state[i] 16);output[i*4 2] (uint8_t)(context-state[i] 8);output[i*4 3] (uint8_t)(context-state[i]);} }// Objective-C 封装接口 implementation SM3Encryptor (NSData *)hashWithData:(NSData *)inputData {SM3Context context;SM3Init(context);// 处理输入数据SM3Update(context, inputData.bytes, inputData.length);// 获取结果uint8_t output[32];SM3Final(context, output);return [NSData dataWithBytes:output length:32]; } (NSString *)hexStringWithData:(NSData *)inputData {NSData *hashData [self hashWithData:inputData];const uint8_t *bytes (const uint8_t *)hashData.bytes;NSMutableString *hex [NSMutableString string];for (NSUInteger i 0; i hashData.length; i) {[hex appendFormat:%02X, bytes[i]];}return [hex copy]; } (NSString *)hexStringWithInput:(NSString *)inputStr {NSData *inputData [inputStr dataUsingEncoding:NSUTF8StringEncoding];NSData *hashData [self hashWithData:inputData];const uint8_t *bytes (const uint8_t *)hashData.bytes;NSMutableString *hex [NSMutableString string];for (NSUInteger i 0; i hashData.length; i) {[hex appendFormat:%02X, bytes[i]];}return [hex copy]; }end
http://www.hkea.cn/news/14283586/

相关文章:

  • 龙华网网站建筑网站图纸
  • 锦州网站建设渠道网站模板怎么弄的
  • 医疗网站建设 中企动力百度网站官网入口
  • 2019一个网站开发要多少钱wordpress运行加速
  • 瑞金网站建设推广二级栏目网站
  • 上海网站建设找哪家seo做的最好的网站
  • 微商的自己做网站叫什么软件下载iis 配置 wordpress
  • 响应式网站 768 320黑河做网站
  • 筑梦网站建设wordpress zh_cn.po
  • 网站关键词是什么沈阳模板建站
  • 西安建设网站公司app在线制作平台有哪些
  • html5开发的网站怎样做产品推广
  • 网站怎样制作吸引人wordpress文章展示相册
  • 做美工比较好的网站网站建设 深圳
  • 网站在百度上搜不到了网站主页设计素材
  • 临沂网站服务器价格专业网站设计联系方式
  • 婚庆公司网站设计注册个体可以做网站吗
  • 网站开发及后期维护404做的好的网站
  • 芜湖南陵网站建设建设多语种网站
  • 河南网站托管win10优化工具
  • 网站开发知识产权归属成都兼职做网站
  • 网站的关键词策略wordpress宝宝模板
  • 简述网站建设方案类型微信手机网站源码
  • 商务网站的特点金数字网站建设
  • 网站logo更换注册了域名之后如何建立一个网站
  • 做汽车网站怎么挣钱推广网站广告有哪些
  • 在线动画手机网站模板下载东道设计logo
  • 泉州网站建设哪里优惠清新wordpress主题
  • 备案网站名称怎么写手机建网站软件
  • 购物网站开发 需求分析莱芜网络推广公司排行