sm4加密 解密(oc)
前几天项目用到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
sm4加密 解密(oc)的更多相关文章
- SM4加密算法实现Java和C#相互加密解密
SM4加密算法实现Java和C#相互加密解密 近期由于项目需要使用SM4对数据进行加密,然后传给Java后台,Java后台使用的也是SM4的加密算法但是就是解密不正确,经过一步步调试发现Java中好多 ...
- Cryptopp iOS 使用 RSA加密解密和签名验证签名
Cryptopp 是一个c++写的功能完善的密码学工具,类似于openssl 官网:https://www.cryptopp.com 以下主要演示Cryptopp 在iOS上的RSA加密解密签名与验证 ...
- 手摸手带你认识https涉及的知识,并实现https加密解密,加签解签
目录 http访问流程 https访问流程 证书 加密/解密 加签/验签 Java实现https 拓展 @ 看完整的代码,直接去完整代码实现,看实现完后会遇到的坑,直接去测试过程中的问题,包括经过代理 ...
- Python常用加密解密算法
MD5加密 简介 这是一种使用非常广泛的加密方式,不可逆的,常见16位和32位一般都是md5 实现 import hashlib data = '你好' print(hashlib.md5(data. ...
- PHP的学习--RSA加密解密
PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了. 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了. 密码没加 ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- .NET和JAVA中BYTE的区别以及JAVA中“DES/CBC/PKCS5PADDING” 加密解密在.NET中的实现
场景:java 作为客户端调用已有的一个.net写的server的webservice,输入string,返回字节数组. 问题:返回的值不是自己想要的,跟.net客户端直接调用总是有差距 分析:平台不 ...
- php使用openssl进行Rsa长数据加密(117)解密(128) 和 DES 加密解密
PHP使用openssl进行Rsa加密,如果要加密的明文太长则会出错,解决方法:加密的时候117个字符加密一次,然后把所有的密文拼接成一个密文:解密的时候需要128个字符解密一下,然后拼接成数据. 加 ...
- c#和js互通的AES加密解密
一.使用场景 在使用前后端分离的框架中常常会进行传输数据相互加密解密以确保数据的安全性,如web Api返回加密数据客户端或web端进行解密,或者客户端或web端进行加密提交数据服务端解密数据等等. ...
随机推荐
- sleep和wait的区别?
sleep指线程被调用时,占着CPU不工作,形象地说明为"占着CPU睡觉",此时,系统的CPU部分资源被占用,其他线程无法进入,会增加时间限制.wait指线程处于进入等待状态,形象 ...
- @SuppressWarnings("deprecation")
在Java编译过程中会出现很多警告,有很多是安全的,但是每次编译有很多警告影响我们对error的过滤和修改,我们可以在代码中加上 @SuppressWarnings("XXXX") ...
- 强制span不换行
对于上一篇提到的overflow的问题我好像搞懂一些了.事情大概是这个样子的:如果用了float属性,那么元素就会脱离文本的束缚,无法无天起来,这肯定是猿类无法忍受的.要想让他们乖乖就范,要么用清除浮 ...
- word使用技巧-批量删除图片技巧
通过查找替换方法:ctrl+h,查找输入^g,替换输入空,然后替换即可. 今天看到一同事写的文档,发现里面很多word基础功能都不会用,比如同一级的标题居然有好几个样式,并且会级别搞错:列表里的数字居 ...
- centos 7 安装zabbix3.0
1.安装MySQL 从最新版本的linux系统开始,默认的是 Mariadb而不是mysql! 使用系统自带的repos安装很简单: # yum install -y mariadb mariadb- ...
- IOS-细节错误
当页面显示时一直奔溃,错误提示-[UICachedDeviceWhiteColor pointSize]: unrecognized selector sent to instance 原因是设置导航 ...
- open office操作word文档
前段时间工作需要使用open office往word中写文件,写图片,以及向footer也就是页尾中插入图片,已经封装成了类,直接调用即可,代码如下: package com.test.common. ...
- MyXls: 导出Excel的各种设置
MyXls是一个操作Excel的开源类库,支持设置字体.列宽.行高(由BOSSMA实现).合并单元格.边框.背景颜色.数据类型.自动换行.对齐方式等,通过众多项目的使用表现,证明MyXls对于创建简单 ...
- AngularJS---表达式
AngularJS的表达式是放在{{}}里面,用{{ }}符号将一个变量绑定到$scope上. angularJS中的表达式有如下特点: 1.只能在其所属作用域内部 所有的表达式都在其所属的作用域内部 ...
- MYSQL 内存报错 Use 'mysqld --thread_stack=#' to specify a bigger stack.
今天在使用mysql的过程中,连接数据库始终无法成功 最后发现是数据库无法执行增加修改的操作 :错误代码 Thread stack overrun: 11552 bytes used of a 13 ...