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端进行加密提交数据服务端解密数据等等. ...
随机推荐
- CI框架 CodeIgniter 伪静态 htaccess设置和Nginx伪静态方法2
1.在根目录西下 新建.htaccess 文件 RewriteEngine on RewriteCond $1 !^(index\.php|images|robots\.txt) RewriteRu ...
- 计算bean的和(java)
bean中的属性过多时,要计算一个bean的list之和是一件非常麻烦的事情,可以用java的反射机制解决这件事情,代码如下: package com.jzzhcs.utils; import jav ...
- shh简化
对于SSH框架中部分的操作简化我分为两大类: 一:操作 1. 在SSH的struts.xml里 name="Action类_*" class="注入的实例"(同 ...
- Linux makefile 教程 非常详细,且易懂
最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...
- easyui datagrid 动态添加columns属性
公司在项目设计的时候,有一个需求,就是查出来的表的字段不唯一,一张表的字段可能是三个,也可能是五个,但是却要把它显示到页面,这个给我做ui的带来一点麻烦.因为以前一般用easyui 的datagrid ...
- .net framework 3.5 序列化
1.JSON序列化. 首先,引用程序集 System.Runtime.Serialization, 我们要使用System.Runtime.Serialization.Json,默认点不出来,这应该是 ...
- [JBoss] - 解决URI提交时乱码问题
JBoss 7 AS解决url提交数据乱码的问题: 打开jboss-as-7.1.1.Final\standalone\configuration\standalone.xml文件,在<exte ...
- E 最熟悉的陌生人 (纪念当年就读的梅州市江南高级中学)
最熟悉的陌生人 作者:张慧桥 枪与玫瑰” 负责审讯的兄弟真是好样的,回来后的第四天上午就让黄志深那小子招了出来. 这可真的不容易! 现在公安部对我们审讯工作有很多的规定,其中一条就是不准刑讯逼供,就是 ...
- sublime text2在windows中以命令行启动
sublime text2在windows中以命令行启动 把执行文件添加到PATH中即可,如图: 如果你和我一样习惯了mac下的简写subl,那么需要在程序目录中新建一个批处理文件subl.bat ...
- 梦想还是要有的-纪念正式成为csdn博客专家暨年中总结
csdn博客:http://blog.csdn.net/tuzongxun 我的csdn历程(坚持总会有收获): 一年零三个月之前,2015年3月3日,我在csdn写下第一篇技术博客,只是记录了一 ...