博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用CommonCrypto计算MD5和SHA
阅读量:7051 次
发布时间:2019-06-28

本文共 1792 字,大约阅读时间需要 5 分钟。

编程时经常需要和MD5、SHA等hash算法打交道,搜了一下后我发现iOS SDK中自带了CommonCrypto,于是就无需自己实现或用第三方库了。

首先来看MD5,它的输出结果是128位的,因此需要16个8位的char来存储。而输入参数我就直接用const char *了,反正NSString和NSData都能与它相互转换:

#include 
static inline char hexChar(unsigned char c) {
return c < 10 ? '0' + c : 'a' + c - 10; } static inline void hexString(unsigned char *from, char *to, NSUInteger length) {
for (NSUInteger i = 0; i < length; ++i) {
unsigned char c = from[i]; unsigned char cHigh = c >> 4; unsigned char cLow = c & 0xf; to[2 * i] = hexChar(cHigh); to[2 * i + 1] = hexChar(cLow); } to[2 * length] = '\0'; } NSString * md5(const char *string) {
static const NSUInteger LENGTH = 16; unsigned char result[LENGTH]; CC_MD5(string, (CC_LONG)strlen(string), result); char hexResult[2 * LENGTH + 1]; hexString(result, hexResult, LENGTH); return [NSString stringWithUTF8String:hexResult]; } NSLog(@"%@", md5("test"));

这里首先是调用CC_MD5()来计算,不过它的计算结果是字符数组,而一般我们是使用16进制格式的字符串。

因此只好再创建一个字符串,长度为33位(以'\0'结尾),再分别取每个字符的高16位和低16位来转化成16进制。算法也很简单,0~9直接加上'0',a~f则减10后加上'a'。
接着发现debug模式下不能直接使用inline函数,于是只好加上static修饰。
不怕辛苦的也可以用NSString的stringWithFormat:方法来构造,不过要写17个参数也很累,而且不知道效率如何。
接下来再来看SHA。CommonCrypto支持计算SHA1、SHA224、SHA256、SHA384和SHA512,考虑到目前SHA1已足够安全了,于是就以它为例。
和MD5不同的是,它的输出结果是160位的,所以需要20个8位的char来存储:

NSString * sha1(const char *string) {
static const NSUInteger LENGTH = 20; unsigned char result[LENGTH]; CC_SHA1(string, (CC_LONG)strlen(string), result); char hexResult[2 * LENGTH + 1]; hexString(result, hexResult, LENGTH); return [NSString stringWithUTF8String:hexResult]; } NSLog(@"%@", sha1("test"));

逻辑几乎是一样的,所以就不再解释了。

不过既然代码都差不多,自然可以更进一步,做个更通用的hash函数,直接根据传入的算法名来运行不同的算法。只是我懒得去做了,因为我用不到~

转载于:https://www.cnblogs.com/pengyingh/articles/2354690.html

你可能感兴趣的文章
Gson 解析教程
查看>>
曼-惠特尼U检验Mann–Whitney U Test
查看>>
Android 常用动画之RotateAnimation
查看>>
使用 video.js 开发 HTML5 视频页面
查看>>
Go --- 设计模式(模板模式)
查看>>
Java中的日期和时间
查看>>
git命令-切换分支
查看>>
小米手机会不会更好
查看>>
linux免密码登录
查看>>
JS比较两个数组是否相等 是否拥有相同元素
查看>>
RPM安装软件
查看>>
SSH 基于ajax实现修改密码功能步骤梳理
查看>>
atitit.Sealink2000国际海运信息管理系统
查看>>
android面试总结01 activity生命周期
查看>>
Java 实现策略(Strategy)模式
查看>>
Python文本爬虫实战
查看>>
leetcode:Gray Code
查看>>
IDEA+PHP+XDebug调试配置
查看>>
javascript学习笔记(一)-廖雪峰教程
查看>>
iOS~判断应用是否有定位权限
查看>>