ios加密算法汇总
2016-02-23 19:58
357 查看
把相关算法的代码也贴一下吧 (其实使用一些成熟的第三方库或许会来得更加简单,不过自己写,自由点)。注,这里的大部分加密算法都是参考一些现有成熟的算法,或者直接拿来用的。
1、MD5
//因为是使用category,所以木有参数传入啦
-(NSString *)
stringFromMD5 {
if(self == nil ||
[self length]
== 0) {
return nil;
}
const char *value
= [self UTF8String];
unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(value, strlen(value),
outputBuffer);
NSMutableString *outputString
= [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(NSInteger count
= 0;
count < CC_MD5_DIGEST_LENGTH;
count++){
[outputString appendFormat:@"%02x",outputBuffer[count]];
}
return [outputString autorelease];
}
2、Base64
+ (NSString *)
base64EncodeData: (NSData *)
objData {
const unsigned char *
objRawData = [objData bytes];
char *
objPointer;
char *
strResult;
//
Get the Raw Data length and ensure we actually have data
int intLength
= [objData length];
if (intLength
== 0) return nil;
//
Setup the String-based Result placeholder and pointer within that placeholder
strResult = (char *)calloc(((intLength
+ 2)
/ 3)
* 4, sizeof(char));
objPointer = strResult;
//
Iterate through everything
while (intLength
> 2)
{ // keep going until we have less than 24 bits
*objPointer++ = _base64EncodingTable[objRawData[0]
>> 2];
*objPointer++ = _base64EncodingTable[((objRawData[0]
& 0x03)
<< 4)
+ (objRawData[1]
>> 4)];
*objPointer++ = _base64EncodingTable[((objRawData[1]
& 0x0f)
<< 2)
+ (objRawData[2]
>> 6)];
*objPointer++ = _base64EncodingTable[objRawData[2]
& 0x3f];
//
we just handled 3 octets (24 bits) of data
objRawData += 3;
intLength -= 3;
}
//
now deal with the tail end of things
if (intLength
!= 0)
{
*objPointer++ = _base64EncodingTable[objRawData[0]
>> 2];
if (intLength
> 1)
{
*objPointer++ = _base64EncodingTable[((objRawData[0]
& 0x03)
<< 4)
+ (objRawData[1]
>> 4)];
*objPointer++ = _base64EncodingTable[(objRawData[1]
& 0x0f)
<< 2];
*objPointer++ = '=';
} else {
*objPointer++ = _base64EncodingTable[(objRawData[0]
& 0x03)
<< 4];
*objPointer++ = '=';
*objPointer++ = '=';
}
}
//
Terminate the string-based result
*objPointer = '\0';
NSString *rstStr
= [NSString stringWithCString:strResult encoding:NSASCIIStringEncoding];
free(objPointer);
return rstStr;
}
3、AES
-(NSData*)
EncryptAES: (NSString *)
key {
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength
= [self length];
size_t bufferSize
= dataLength + kCCBlockSizeAES128;
void *buffer
= malloc(bufferSize);
size_t numBytesEncrypted
= 0;
CCCryptorStatus cryptStatus
= CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCBlockSizeAES128,
NULL,
[self bytes],
dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus
== kCCSuccess)
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
4、RSA
- (NSData *)
encryptWithData:(NSData *)content
{
size_t plainLen
= [content length];
if (plainLen
> maxPlainLen)
{
NSLog(@"content(%ld)
is too long, must < %ld", plainLen, maxPlainLen);
return nil;
}
void *plain
= malloc(plainLen);
[content getBytes:plain
length:plainLen];
size_t cipherLen
= 128; //
currently RSA key length is set to 128 bytes
void *cipher
= malloc(cipherLen);
OSStatus returnCode
= SecKeyEncrypt(publicKey, kSecPaddingPKCS1,
plain,
plainLen, cipher, &cipherLen);
NSData *result
= nil;
if (returnCode
!= 0)
{
NSLog(@"SecKeyEncrypt
fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}
free(plain);
free(cipher);
return result;
}
1、MD5
//因为是使用category,所以木有参数传入啦
-(NSString *)
stringFromMD5 {
if(self == nil ||
[self length]
== 0) {
return nil;
}
const char *value
= [self UTF8String];
unsigned char outputBuffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(value, strlen(value),
outputBuffer);
NSMutableString *outputString
= [[NSMutableString alloc] initWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(NSInteger count
= 0;
count < CC_MD5_DIGEST_LENGTH;
count++){
[outputString appendFormat:@"%02x",outputBuffer[count]];
}
return [outputString autorelease];
}
2、Base64
+ (NSString *)
base64EncodeData: (NSData *)
objData {
const unsigned char *
objRawData = [objData bytes];
char *
objPointer;
char *
strResult;
//
Get the Raw Data length and ensure we actually have data
int intLength
= [objData length];
if (intLength
== 0) return nil;
//
Setup the String-based Result placeholder and pointer within that placeholder
strResult = (char *)calloc(((intLength
+ 2)
/ 3)
* 4, sizeof(char));
objPointer = strResult;
//
Iterate through everything
while (intLength
> 2)
{ // keep going until we have less than 24 bits
*objPointer++ = _base64EncodingTable[objRawData[0]
>> 2];
*objPointer++ = _base64EncodingTable[((objRawData[0]
& 0x03)
<< 4)
+ (objRawData[1]
>> 4)];
*objPointer++ = _base64EncodingTable[((objRawData[1]
& 0x0f)
<< 2)
+ (objRawData[2]
>> 6)];
*objPointer++ = _base64EncodingTable[objRawData[2]
& 0x3f];
//
we just handled 3 octets (24 bits) of data
objRawData += 3;
intLength -= 3;
}
//
now deal with the tail end of things
if (intLength
!= 0)
{
*objPointer++ = _base64EncodingTable[objRawData[0]
>> 2];
if (intLength
> 1)
{
*objPointer++ = _base64EncodingTable[((objRawData[0]
& 0x03)
<< 4)
+ (objRawData[1]
>> 4)];
*objPointer++ = _base64EncodingTable[(objRawData[1]
& 0x0f)
<< 2];
*objPointer++ = '=';
} else {
*objPointer++ = _base64EncodingTable[(objRawData[0]
& 0x03)
<< 4];
*objPointer++ = '=';
*objPointer++ = '=';
}
}
//
Terminate the string-based result
*objPointer = '\0';
NSString *rstStr
= [NSString stringWithCString:strResult encoding:NSASCIIStringEncoding];
free(objPointer);
return rstStr;
}
3、AES
-(NSData*)
EncryptAES: (NSString *)
key {
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr, sizeof(keyPtr));
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength
= [self length];
size_t bufferSize
= dataLength + kCCBlockSizeAES128;
void *buffer
= malloc(bufferSize);
size_t numBytesEncrypted
= 0;
CCCryptorStatus cryptStatus
= CCCrypt(kCCEncrypt, kCCAlgorithmAES128,
kCCOptionPKCS7Padding | kCCOptionECBMode,
keyPtr, kCCBlockSizeAES128,
NULL,
[self bytes],
dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus
== kCCSuccess)
{
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer);
return nil;
}
4、RSA
- (NSData *)
encryptWithData:(NSData *)content
{
size_t plainLen
= [content length];
if (plainLen
> maxPlainLen)
{
NSLog(@"content(%ld)
is too long, must < %ld", plainLen, maxPlainLen);
return nil;
}
void *plain
= malloc(plainLen);
[content getBytes:plain
length:plainLen];
size_t cipherLen
= 128; //
currently RSA key length is set to 128 bytes
void *cipher
= malloc(cipherLen);
OSStatus returnCode
= SecKeyEncrypt(publicKey, kSecPaddingPKCS1,
plain,
plainLen, cipher, &cipherLen);
NSData *result
= nil;
if (returnCode
!= 0)
{
NSLog(@"SecKeyEncrypt
fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}
free(plain);
free(cipher);
return result;
}
相关文章推荐
- iOS获取camera的yuv数据
- nagios
- IOS-CoreAnimation(核心动画)
- iOS图标工场
- iOS/OS X内存管理(一):基本概念与原理
- iOS开发-加密与解密之CommonCrypto与Security.framework
- iOS所有框架总览与介绍
- iOS/OS X 内存管理(二):借助工具解决内存问题
- iOS动画开发之——炫酷的粒子效果
- IOS开发中的几种设计模式介绍
- IOS开发证书显示“此证书的签发者无效”解决方法
- iOS小明开发笔记(二十一) (缓存机制NSUserDefaults)
- iOS小明开发笔记(二十) (retain、strong、weak、assign区别)
- iOS 几种常见的数据储存方式
- iOS小明开发笔记(十九) (Mac 终端命令介绍)
- 25.iOS中集合遍历方法的比较和技巧
- iOS开发-CALayer
- iOS-OC常用传值方法
- cisco&nbsp;路由器&nbsp;交换机&nbsp;rommon&nbsp;灌IOS
- iOS小明开发笔记(十八) (百度地图框架配置)