前几天项目用到sm4加密解密,加密为十六进制字符串,再将十六进制字符串解密。网上百度了下,sm4是密钥长度和加密明文加密密文都为16个字节十六进制数据,网上的sm4 c语言算法很容易搜到,笔者刚开始没怎么理解,以为只能对16字节数据进行加密,并且不论是多少字节的数据加密出来都是16字节的。后来看了下源码,应该是加密的数据应该是16字节或者16的整数倍个字节的数据,若不够16倍数字节应该补0x00数据,最后加密出来的数据和输入数据的长度应该一致,即

密文长度=明文长度 

而且密钥长度一致,是16字节的。c的代码里面输入输出都是十六进制数据,需要将字符串转为char类型数组,并且保证长度是16整数倍

+(unsigned char*)hexEnc:(NSString*)strInput{NSData* data = [strInput dataUsingEncoding:NSUTF8StringEncoding];NSUInteger length = data.length;NSUInteger plusLength;if(length % 16 == 0){plusLength = 0;}else{plusLength = 16 - length % 16;}NSMutableString* new_str = [[NSMutableString alloc] initWithString:strInput];for (int i =0;i < plusLength;i++) {[new_str appendString:@" "];}NSUInteger new_length = length+plusLength;Uchar *input = (Uchar*)malloc(sizeof(Uchar)*new_length);Uchar *output = (Uchar*)malloc(sizeof(Uchar)*new_length);Uchar key[16] = KEY;const char *utfChar = [new_str UTF8String];memset(input, 0, new_length);memcpy(input, utfChar, new_length);sm4_context ctx;unsigned long i;sm4_setkey_enc(&ctx,key);sm4_crypt_ecb(&ctx,1,new_length,input,output);for(i=0;i<new_length;i++)printf("%02x ", output[i]);printf("\n");unsigned char* c_str = Hex2Str(output,new_length);printf("%s\n", c_str);free(input);free(output);return c_str;
}

  

解密时密文是十六进制字符串,需要将字符串先转为int类型数组,再作解密操作,具体代码  

+(unsigned char*)hexDec:(NSString*)strInput{int inputCharSize = strInput.length/2;Uchar* input = (Uchar*)malloc(sizeof(Uchar)*inputCharSize);Uchar* output = (Uchar*)malloc(sizeof(Uchar)*inputCharSize);for (int i = 0; i<inputCharSize; i++) {NSString* str = [strInput substringWithRange:NSMakeRange(i*2, 2)];NSString* gw = [str substringWithRange:NSMakeRange(0, 1)];NSString* dw = [str substringWithRange:NSMakeRange(1, 1)];int n_gw = [HexToStr str2Int:gw];int n_dw = [HexToStr str2Int:dw];int result = n_gw * 16 + n_dw;input[i] = result;}Uchar key[16] = KEY;sm4_context ctx;sm4_setkey_dec(&ctx,key);sm4_crypt_ecb(&ctx,0,inputCharSize,input,output);int kgPos = 0;for(int i=0;i<inputCharSize;i++){printf("%02x ", output[i]);if (output[i] == 32) {kgPos = i;output[i] = '\0';}}printf("\n");free(input);
//    free(output);return output;
}

  

demo地址:https://github.com/dinner/sm4

  

转载于:https://www.cnblogs.com/symen/p/6085486.html

sm4加密 解密(oc)相关推荐

  1. c++/c SM4加密解密算法代码实现

    #include <openssl/sms4.h>int main(void) {//加密参数初始化sms4_key_t sms4_key_enc;unsigned char *plain ...

  2. C#.NET 国密SM4加密解密 CBC ECB 2种模式

    注意点: 1.加密时,明文转 byte[] 时,不要用 Encoding.Default,一定要指定编码,如:UTF-8. 解密时,解出的 byte[] 转 string 同样要指定相同的编码. 2. ...

  3. 使用Bouncy Castle(pom版本:bcprov-jdk15on 1.59)中SM4 加密解密算法 ECB

    SM4 加密算法 加密 SM4算法是一种分组密码算法.其分组长度为128bit,密钥长度也为128bit. 加密算法与密钥扩展算法均采用32轮非线性迭代结构,以字(32位)为单位进行加密运算,每一次迭 ...

  4. 国密SM4,layui前端 和.net core后台 加密解密 .net加密解密

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.本文做用?? 二.SM4介绍 三.使用步骤 1.前台实现加密 2.后台实现解密 四 总结 前言 第一次分享,我是个 ...

  5. C#国密SM4 CBC加密解密

    ** C#国密SM4 CBC加密解密 在你得项目nuget引用程序集:KYSharp.SM 安装 2.0 版本,里面才有sm4的加密 ** static void Main(string[] args ...

  6. OC RSA加密解密

    好久好久没有更新了...你们等的急不急..这不,我就姗姗来迟了...本文重点讲解一下iOS系统下的RSA加密解密问题. 一般为了安全,私钥是不会给前端暴露出来 的,只会通过私钥生成一个公开的公钥提供给 ...

  7. [crypto]-53-openssl命令行的使用(aes/rsa签名校验/rsa加密解密/hmac)

    常用技巧 如何编写一个二进制规律性的文件, 比如你可以编写一个"0123456789abcdef"的文本文件,记得删除换行符然后用ultraedit打开,ctrl+H就可以看到二进 ...

  8. [crypto]-52-python3中rsa(签名验签加密解密)aes(ecb cbc ctr)hmac的使用,以及unittest测试用

    环境: 在ubuntu14.04下,记得安装:sudo pip3 install pycrypto 代码示例1: =========================== import base64 f ...

  9. 验证客户端和服务端可以传输经SM4加密的密文数据,从而验证发送数据已使用服务器密码机进行SM4加密,而不是随便的字符串乱码

    前提操作 搭建客户端和服务端  Socket代码实现服务端 和 客户端之间通信_CHYabc123456hh的博客-CSDN博客 使用wireshark进行数据的监听和测试https://blog.c ...

最新文章

  1. iOS指纹解锁和手势解锁
  2. 您的安全设置不允许网站使用安装在您的计算机上的ActiveX控件的解决方法
  3. 一眼毁三观:JS中令人发指的valueOf方法
  4. linux下搭建hadoop环境步骤分享
  5. 【ABAP】Smartforms无法打印特殊字符问题处理方案
  6. pagehelper 不分页几种情况的解决方法
  7. JavaWeb黑马旅游网-学习笔记09【旅游线路收藏】
  8. 2020 JVM生态报告
  9. 利用perspective 和 transform 里面的几个参数来实现旋转照片墙
  10. 玩转 SpringBoot 2 快速整合 Filter 注解版
  11. 虚拟函数-1、静态联编与动态联编,引入虚函数
  12. OpenCV图像处理基础操作(3)
  13. kindle 3 webbrowser破解,
  14. ansible常见模块
  15. 当当网商品详情API接口(当当商品详情接口,当当商品问答接口,当当抢购价接口,当当商品列表接口,当当商品评论接口)代码对接教程
  16. 聊一次跳槽被怼的经历
  17. 专访 | 刘嘉松:开源,互惠且共赢
  18. pygame-KidsCanCode系列jumpy-part12-platform图片
  19. java基于ssm开发的弹幕视频网站源码
  20. Pin API INS

热门文章

  1. AR模型在信号处理中的应用
  2. C++中substr函数的用法
  3. tensorflow安装教程
  4. java怎么加定时器,Spring中定时器实现
  5. php动态网页转换成html,怎么把动态的php文件转换成静态的html文件,html文件是php文件…...
  6. webstorm 不识别.config文件_webstorm好用的十款插件
  7. java中的排序算法——归并排序
  8. Android Studio 小技巧/快捷键 合集
  9. Android的事件分发实例分析
  10. 如何通过 macOS 恢复功能重新安装 macOS