IOS下HMAC_SHA1加密算法

  因为项目需要HMAC_SHA1加密,找了很多都不符合要求,最后在stackoverflow的一个问答中找到了所要的。

源码如下:

注意:需要包含着3个头文件

#include <CommonCrypto/CommonDigest.h>
#include <CommonCrypto/CommonHMAC.h>

#include "base64.h"

+ (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret {
    NSData *secretData = [secret dataUsingEncoding:NSUTF8StringEncoding];
    NSData *clearTextData = [text dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char result[20];
    CCHmac(kCCHmacAlgSHA1, [secretData bytes], [secretData length], [clearTextData bytes], [clearTextData length], result);
    char base64Result[32];
    size_t theResultLength = 32;
    Base64EncodeData(result, 20, base64Result, &theResultLength,YES);
    NSData *theData = [NSData dataWithBytes:base64Result length:theResultLength];
    NSString *base64EncodedResult = [[NSString alloc] initWithData:theData encoding:NSASCIIStringEncoding];
    return base64EncodedResult;
}

这个方法使用到了base64的一些方法,所以要包含base64文件

base64.h

//base64.h

extern size_t EstimateBas64EncodedDataSize(size_t inDataSize);
extern size_t EstimateBas64DecodedDataSize(size_t inDataSize);

extern bool Base64EncodeData(const void *inInputData, size_t inInputDataSize, char *outOutputData, size_t *ioOutputDataSize, BOOL wrapped);
extern bool Base64DecodeData(const void *inInputData, size_t inInputDataSize, void *ioOutputData, size_t *ioOutputDataSize);

base64.m

#include "base64.h"

#include <math.h>

const UInt8 kBase64EncodeTable[64] = {
/*  0 */ ‘A‘,    /*  1 */ ‘B‘,    /*  2 */ ‘C‘,    /*  3 */ ‘D‘,
/*  4 */ ‘E‘,    /*  5 */ ‘F‘,    /*  6 */ ‘G‘,    /*  7 */ ‘H‘,
/*  8 */ ‘I‘,    /*  9 */ ‘J‘,    /* 10 */ ‘K‘,    /* 11 */ ‘L‘,
/* 12 */ ‘M‘,    /* 13 */ ‘N‘,    /* 14 */ ‘O‘,    /* 15 */ ‘P‘,
/* 16 */ ‘Q‘,    /* 17 */ ‘R‘,    /* 18 */ ‘S‘,    /* 19 */ ‘T‘,
/* 20 */ ‘U‘,    /* 21 */ ‘V‘,    /* 22 */ ‘W‘,    /* 23 */ ‘X‘,
/* 24 */ ‘Y‘,    /* 25 */ ‘Z‘,    /* 26 */ ‘a‘,    /* 27 */ ‘b‘,
/* 28 */ ‘c‘,    /* 29 */ ‘d‘,    /* 30 */ ‘e‘,    /* 31 */ ‘f‘,
/* 32 */ ‘g‘,    /* 33 */ ‘h‘,    /* 34 */ ‘i‘,    /* 35 */ ‘j‘,
/* 36 */ ‘k‘,    /* 37 */ ‘l‘,    /* 38 */ ‘m‘,    /* 39 */ ‘n‘,
/* 40 */ ‘o‘,    /* 41 */ ‘p‘,    /* 42 */ ‘q‘,    /* 43 */ ‘r‘,
/* 44 */ ‘s‘,    /* 45 */ ‘t‘,    /* 46 */ ‘u‘,    /* 47 */ ‘v‘,
/* 48 */ ‘w‘,    /* 49 */ ‘x‘,    /* 50 */ ‘y‘,    /* 51 */ ‘z‘,
/* 52 */ ‘0‘,    /* 53 */ ‘1‘,    /* 54 */ ‘2‘,    /* 55 */ ‘3‘,
/* 56 */ ‘4‘,    /* 57 */ ‘5‘,    /* 58 */ ‘6‘,    /* 59 */ ‘7‘,
/* 60 */ ‘8‘,    /* 61 */ ‘9‘,    /* 62 */ ‘+‘,    /* 63 */ ‘/‘
};

/*
 -1 = Base64 end of data marker.
 -2 = White space (tabs, cr, lf, space)
 -3 = Noise (all non whitespace, non-base64 characters)
 -4 = Dangerous noise
 -5 = Illegal noise (null byte)
 */

const SInt8 kBase64DecodeTable[128] = {
/* 0x00 */ -5,     /* 0x01 */ -3,     /* 0x02 */ -3,     /* 0x03 */ -3,
/* 0x04 */ -3,     /* 0x05 */ -3,     /* 0x06 */ -3,     /* 0x07 */ -3,
/* 0x08 */ -3,     /* 0x09 */ -2,     /* 0x0a */ -2,     /* 0x0b */ -2,
/* 0x0c */ -2,     /* 0x0d */ -2,     /* 0x0e */ -3,     /* 0x0f */ -3,
/* 0x10 */ -3,     /* 0x11 */ -3,     /* 0x12 */ -3,     /* 0x13 */ -3,
/* 0x14 */ -3,     /* 0x15 */ -3,     /* 0x16 */ -3,     /* 0x17 */ -3,
/* 0x18 */ -3,     /* 0x19 */ -3,     /* 0x1a */ -3,     /* 0x1b */ -3,
/* 0x1c */ -3,     /* 0x1d */ -3,     /* 0x1e */ -3,     /* 0x1f */ -3,
/* ‘ ‘ */ -2,    /* ‘!‘ */ -3,    /* ‘"‘ */ -3,    /* ‘#‘ */ -3,
/* ‘$‘ */ -3,    /* ‘%‘ */ -3,    /* ‘&‘ */ -3,    /* ‘‘‘ */ -3,
/* ‘(‘ */ -3,    /* ‘)‘ */ -3,    /* ‘*‘ */ -3,    /* ‘+‘ */ 62,
/* ‘,‘ */ -3,    /* ‘-‘ */ -3,    /* ‘.‘ */ -3,    /* ‘/‘ */ 63,
/* ‘0‘ */ 52,    /* ‘1‘ */ 53,    /* ‘2‘ */ 54,    /* ‘3‘ */ 55,
/* ‘4‘ */ 56,    /* ‘5‘ */ 57,    /* ‘6‘ */ 58,    /* ‘7‘ */ 59,
/* ‘8‘ */ 60,    /* ‘9‘ */ 61,    /* ‘:‘ */ -3,    /* ‘;‘ */ -3,
/* ‘<‘ */ -3,    /* ‘=‘ */ -1,    /* ‘>‘ */ -3,    /* ‘?‘ */ -3,
/* ‘@‘ */ -3,    /* ‘A‘ */ 0,    /* ‘B‘ */  1,    /* ‘C‘ */  2,
/* ‘D‘ */  3,    /* ‘E‘ */  4,    /* ‘F‘ */  5,    /* ‘G‘ */  6,
/* ‘H‘ */  7,    /* ‘I‘ */  8,    /* ‘J‘ */  9,    /* ‘K‘ */ 10,
/* ‘L‘ */ 11,    /* ‘M‘ */ 12,    /* ‘N‘ */ 13,    /* ‘O‘ */ 14,
/* ‘P‘ */ 15,    /* ‘Q‘ */ 16,    /* ‘R‘ */ 17,    /* ‘S‘ */ 18,
/* ‘T‘ */ 19,    /* ‘U‘ */ 20,    /* ‘V‘ */ 21,    /* ‘W‘ */ 22,
/* ‘X‘ */ 23,    /* ‘Y‘ */ 24,    /* ‘Z‘ */ 25,    /* ‘[‘ */ -3,
/* ‘\‘ */ -3,    /* ‘]‘ */ -3,    /* ‘^‘ */ -3,    /* ‘_‘ */ -3,
/* ‘`‘ */ -3,    /* ‘a‘ */ 26,    /* ‘b‘ */ 27,    /* ‘c‘ */ 28,
/* ‘d‘ */ 29,    /* ‘e‘ */ 30,    /* ‘f‘ */ 31,    /* ‘g‘ */ 32,
/* ‘h‘ */ 33,    /* ‘i‘ */ 34,    /* ‘j‘ */ 35,    /* ‘k‘ */ 36,
/* ‘l‘ */ 37,    /* ‘m‘ */ 38,    /* ‘n‘ */ 39,    /* ‘o‘ */ 40,
/* ‘p‘ */ 41,    /* ‘q‘ */ 42,    /* ‘r‘ */ 43,    /* ‘s‘ */ 44,
/* ‘t‘ */ 45,    /* ‘u‘ */ 46,    /* ‘v‘ */ 47,    /* ‘w‘ */ 48,
/* ‘x‘ */ 49,    /* ‘y‘ */ 50,    /* ‘z‘ */ 51,    /* ‘{‘ */ -3,
/* ‘|‘ */ -3,    /* ‘}‘ */ -3,    /* ‘~‘ */ -3,    /* 0x7f */ -3
};

const UInt8 kBits_00000011 = 0x03;
const UInt8 kBits_00001111 = 0x0F;
const UInt8 kBits_00110000 = 0x30;
const UInt8 kBits_00111100 = 0x3C;
const UInt8 kBits_00111111 = 0x3F;
const UInt8 kBits_11000000 = 0xC0;
const UInt8 kBits_11110000 = 0xF0;
const UInt8 kBits_11111100 = 0xFC;

size_t EstimateBas64EncodedDataSize(size_t inDataSize)
{
    size_t theEncodedDataSize = (int)ceil(inDataSize / 3.0) * 4;
    theEncodedDataSize = theEncodedDataSize / 72 * 74 + theEncodedDataSize % 72;
    return(theEncodedDataSize);
}

size_t EstimateBas64DecodedDataSize(size_t inDataSize)
{
    size_t theDecodedDataSize = (int)ceil(inDataSize / 4.0) * 3;
    //theDecodedDataSize = theDecodedDataSize / 72 * 74 + theDecodedDataSize % 72;
    return(theDecodedDataSize);
}

bool Base64EncodeData(const void *inInputData, size_t inInputDataSize, char *outOutputData, size_t *ioOutputDataSize, BOOL wrapped)
{
    size_t theEncodedDataSize = EstimateBas64EncodedDataSize(inInputDataSize);
    if (*ioOutputDataSize < theEncodedDataSize)
        return(false);
    *ioOutputDataSize = theEncodedDataSize;
    const UInt8 *theInPtr = (const UInt8 *)inInputData;
    UInt32 theInIndex = 0, theOutIndex = 0;
    for (; theInIndex < (inInputDataSize / 3) * 3; theInIndex += 3)
    {
        outOutputData[theOutIndex++] = kBase64EncodeTable[(theInPtr[theInIndex] & kBits_11111100) >> 2];
        outOutputData[theOutIndex++] = kBase64EncodeTable[(theInPtr[theInIndex] & kBits_00000011) << 4 | (theInPtr[theInIndex + 1] & kBits_11110000) >> 4];
        outOutputData[theOutIndex++] = kBase64EncodeTable[(theInPtr[theInIndex + 1] & kBits_00001111) << 2 | (theInPtr[theInIndex + 2] & kBits_11000000) >> 6];
        outOutputData[theOutIndex++] = kBase64EncodeTable[(theInPtr[theInIndex + 2] & kBits_00111111) >> 0];
        if (wrapped && (theOutIndex % 74 == 72))
        {
            outOutputData[theOutIndex++] = ‘\r‘;
            outOutputData[theOutIndex++] = ‘\n‘;
        }
    }
    const size_t theRemainingBytes = inInputDataSize - theInIndex;
    if (theRemainingBytes == 1)
    {
        outOutputData[theOutIndex++] = kBase64EncodeTable[(theInPtr[theInIndex] & kBits_11111100) >> 2];
        outOutputData[theOutIndex++] = kBase64EncodeTable[(theInPtr[theInIndex] & kBits_00000011) << 4 | (0 & kBits_11110000) >> 4];
        outOutputData[theOutIndex++] = ‘=‘;
        outOutputData[theOutIndex++] = ‘=‘;
        if (wrapped && (theOutIndex % 74 == 72))
        {
            outOutputData[theOutIndex++] = ‘\r‘;
            outOutputData[theOutIndex++] = ‘\n‘;
        }
    }
    else if (theRemainingBytes == 2)
    {
        outOutputData[theOutIndex++] = kBase64EncodeTable[(theInPtr[theInIndex] & kBits_11111100) >> 2];
        outOutputData[theOutIndex++] = kBase64EncodeTable[(theInPtr[theInIndex] & kBits_00000011) << 4 | (theInPtr[theInIndex + 1] & kBits_11110000) >> 4];
        outOutputData[theOutIndex++] = kBase64EncodeTable[(theInPtr[theInIndex + 1] & kBits_00001111) << 2 | (0 & kBits_11000000) >> 6];
        outOutputData[theOutIndex++] = ‘=‘;
        if (wrapped && (theOutIndex % 74 == 72))
        {
            outOutputData[theOutIndex++] = ‘\r‘;
            outOutputData[theOutIndex++] = ‘\n‘;
        }
    }
    return(true);
}

bool Base64DecodeData(const void *inInputData, size_t inInputDataSize, void *ioOutputData, size_t *ioOutputDataSize)
{
    memset(ioOutputData, ‘.‘, *ioOutputDataSize);

    size_t theDecodedDataSize = EstimateBas64DecodedDataSize(inInputDataSize);
    if (*ioOutputDataSize < theDecodedDataSize)
        return(false);
    *ioOutputDataSize = 0;
    const UInt8 *theInPtr = (const UInt8 *)inInputData;
    UInt8 *theOutPtr = (UInt8 *)ioOutputData;
    size_t theInIndex = 0, theOutIndex = 0;
    UInt8 theOutputOctet;
    size_t theSequence = 0;
    for (; theInIndex < inInputDataSize; )
    {
        SInt8 theSextet = 0;

        SInt8 theCurrentInputOctet = theInPtr[theInIndex];
        theSextet = kBase64DecodeTable[theCurrentInputOctet];
        if (theSextet == -1)
            break;
        while (theSextet == -2)
        {
            theCurrentInputOctet = theInPtr[++theInIndex];
            theSextet = kBase64DecodeTable[theCurrentInputOctet];
        }
        while (theSextet == -3)
        {
            theCurrentInputOctet = theInPtr[++theInIndex];
            theSextet = kBase64DecodeTable[theCurrentInputOctet];
        }
        if (theSequence == 0)
        {
            theOutputOctet = (theSextet >= 0 ? theSextet : 0) << 2 & kBits_11111100;
        }
        else if (theSequence == 1)
        {
            theOutputOctet |= (theSextet >- 0 ? theSextet : 0) >> 4 & kBits_00000011;
            theOutPtr[theOutIndex++] = theOutputOctet;
        }
        else if (theSequence == 2)
        {
            theOutputOctet = (theSextet >= 0 ? theSextet : 0) << 4 & kBits_11110000;
        }
        else if (theSequence == 3)
        {
            theOutputOctet |= (theSextet >= 0 ? theSextet : 0) >> 2 & kBits_00001111;
            theOutPtr[theOutIndex++] = theOutputOctet;
        }
        else if (theSequence == 4)
        {
            theOutputOctet = (theSextet >= 0 ? theSextet : 0) << 6 & kBits_11000000;
        }
        else if (theSequence == 5)
        {
            theOutputOctet |= (theSextet >= 0 ? theSextet : 0) >> 0 & kBits_00111111;
            theOutPtr[theOutIndex++] = theOutputOctet;
        }
        theSequence = (theSequence + 1) % 6;
        if (theSequence != 2 && theSequence != 4)
            theInIndex++;
    }
    *ioOutputDataSize = theOutIndex;
    return(true);
}
时间: 2024-10-08 03:21:56

IOS下HMAC_SHA1加密算法的相关文章

ios下(个人公司非企业级)AdHoc在线安装全环境配置

1,环境 客户端开发:MacOs 10.8.5 服务器开发:Centos6.3 64位 2,软件准备 Apache httpd 2.2.27 OpenSSL 0.9.8za 3,客户端准备 Apple的开发者账号大致分如下三类:个人,公司,企业,这一篇我们主要说下个人.公司的ipa在线安装.个人公司级别的AdHoc有这样一个限制:就是在线发布的ipa包只能安装 在添加到Apple账号的Devices列表中(发布IPA之后再添加的设备需要重新打IPA包)的非越狱设备及越狱设备中,而企业级的开发者账

摘录 :iOS下音视频通信的实现-基于WebRTC

原文出自:http://www.cocoachina.com/ios/20170306/18837.html ,为了方便记忆,转载,如原作者不同意转载,邮件通知,立即删除 前言: WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,简而言之它是一个支持网页浏览器进行实时语音对话或视频对话的技术. 它为我们提供了视频会议的核心技术,包括音视频的采集.编解码.网络传输.显示等功能,并且还支持跨平台:windows,linux,mac,android,i

解决ios下的微信打开的页面背景音乐无法自动播放

后面的项目发现,还有两个坑,需要注意下: ·本文的解决方案的核心是利用了 微信/易信 在ready的时候会有个 WeixinJSBridgeReady/YixinJSBridgeReady事件,通过监听这个事件来触发的.那有个坑就是 如果微信已经ready了,但还没执行到你监听这个ready事件的代码,那么你的监听是没用的,所以最理想的情况是,监听的js放在head前面(放在css外链之前),确保最新执行,切记!切记!. ·另一个坑就是,本文的解决方案只适合一开始就播放的背景音乐.如果你是做那种

iOS 下的相册与图片处理

iOS 下的相册与图片处理 需求 很多公司项目中都会使用到相册,以及相机,保存图片,从相册中选取图片等等操作.本文将详细介绍该功能如何实现优化,以及使用一些优秀的第三方库来辅助完成我们的需求. photos framework 的使用 Photos Framework reference Classes PHAdjustmentData /* When a user edits an asset, Photos saves a PHAdjustmentData object along with

iOS下bound,center和frame

---恢复内容开始--- 本文转发至:http://www.xuebuyuan.com/1846606.html 在写程序的时候发现,iOS下的坐标.位置很容易弄乱,特别是在不同的坐标系统中,必须完成弄明白一些概念才能做相应的变化,例如CoreImage和UIView的坐标系统就截然不同,一个是以屏幕的左上角为原点,一个是以屏幕的左下角为原点.总体上,IOS中包含UIKit坐标系(X轴正方向向右,Y轴正方向向下)和标准的Quartz 2D绘图坐标系(X轴正方向向右,Y轴正方向向上),下面,解释一

iOS下的Http库AFNetworking

在iOS下开发一直是用ASIHTTPRequest库,ASIHTTPRequest已经停止更新,看了这个文章http://www.oschina.net/news/61416/github-top-100-objective-c-projects (原文https://github.com/Aufree/trip-to-iOS/blob/master/Top-100.md)的AFNetworking库,感觉还不错. AFNetworking库的地址是 https://github.com/AFN

记录遇到的ios下的bugs

开个帖子不定期更新,记录遇到的ios下的bugs,其中有些已经解了,有些还是无解 1 UIWebView内存泄漏 这个到ios7下还无解,ios8未看 2 UIFont copy 在ios6下crash 这个想不明白为啥,也许是以前的coder用了什么黑魔法 3 UITextView 和 UITextField 的键盘出现的消息的顺序不一样的问题 // UIKeyboardDidShowNotification ---> UITextViewTextDidBeginEditingNotifica

iOS常用的加密算法

在iOS开发中,为了数据的安全经常对内容进行加密,在这儿我们对常用的加密算法进行了总结: 1.MD5 <span style="font-size:18px;">+ (NSString *)md5Hash:(NSString *)str { const char *cStr = [str UTF8String]; unsigned char result[16]; CC_MD5( cStr, strlen(cStr), result ); NSString *md5Resu

new Date()在安卓下正常,在IOS下显示不出来

之前用JS在做一个倒计时,在PC端和安卓下面显示没问题,在IOS下显示不出来. 查找了资料,链接我忘记了. 原因是: 在IOS下,new Date("2000-2-22 00:10"),返回的是undefined,因为IOS不支持这种类型格式. 解决方案: 更换下格式:new Date("2000/2/22") 可以正常显示.