iOS开发各种加密方式
2017-11-30 15:28
260 查看
这里封装的是iOS使用到的各种加密方法,MD5加密,AES加密,Base64加密,DES加密,生成32UUID,类需要继承
<Foundation/Foundation.h>框架
注意:.m文件需要导入
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>
.h文件实现接口:
/**
* 生成32位UUID,不带'-'
*
* @return 32位UUID
*/
+ (NSString *)createUUID;
#pragma mark - MD5
/**
* md5加密
*
* @param str 要加密的字符串
*
* @return 32位md5字符串
*/
+ (NSString *)md5:(NSString *)input;
#pragma mark - SHA
/**
* sha1加密
*
* @param input 要加密的字符串
*
* @return 加密后的字符串
*/
+ (NSString *)sha1:(NSString *)input;
+ (NSString *)sha224:(NSString *)input;
+ (NSString *)sha256:(NSString *)input;
+ (NSString *)sha384:(NSString *)input;
+ (NSString *)sha512:(NSString *)input;
#pragma mark - DES
/**
* DES加密
*
* @param key 密钥
* @param data 加密数据
*
* @return 加密后的数据
*/
+ (NSData *)DESEncryptWithKey:(NSString *)key data:(NSData *)data;
/**
* DES解密
*
* @param key 密钥
* @param data 解密数据
*
* @return 解密后的数据
*/
+ (NSData *)DESDecryptWithKey:(NSString *)key data:(NSData *)data;
#pragma mark - AES
/**
* AES256加密
*
* @param key 密钥
* @param data 加密数据
*
* @return 加密后的数据
*/
+ (NSData *)AES256EncryptWithKey:(NSString *)key data:(NSData *)data;
/**
* AES256解密
*
* @param key 密钥
* @param data 解密数据
*
* @return 解密后的数据
*/
+ (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData *)data;
#pragma mark - Base64
/**
* NSData转Base64
*
* @param data
*
* @return
*/
+ (NSString *)base64EncodedStringWithData:(NSData *)data;
/**
* Base64转NSData
*
* @param base64String
*
* @return
*/
+ (NSData *)dataWithBase64EncodedString:(NSString *)base64String;
/**
* NSString转Base64
*
* @param string
*
* @return
*/
+ (NSString *)base64EncodedString:(NSString *)string;
/**
* Base64转NSString
*
* @param base64String base64字符串
*
* @return
*/
+ (NSString *)stringWithBase64Encoded:(NSString *)base64String;
.m文件实现接口:
static const
char encodingTable[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ (NSString *)createUUID
{
NSUUID *uuid = [NSUUID
UUID];
return [[uuid
UUIDString] stringByReplacingOccurrencesOfString:@"-"
withString:@""];
}
#pragma mark - MD5
+ (NSString *)md5:(NSString *)input
{
const char *cStrValue = [input
UTF8String];
if (cStrValue ==
NULL) {
cStrValue = "";
}
unsigned
char r[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStrValue, (CC_LONG)strlen(cStrValue), r);
return [NSString
stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
r[0], r[1], r[2], r[3], r[4], r[5],
r[6], r[7], r[8], r[9], r[10], r[11], r[12],
r[13], r[14], r[15]];
}
#pragma mark - SHA1
+ (NSString *)sha1:(NSString *)input
{
const char *ptr = [input
UTF8String];
int i =0;
int len = (int)strlen(ptr);
Byte byteArray[len];
while (i!=len)
{
unsigned eachChar = *(ptr + i);
unsigned low8Bits = eachChar &
0xFF;
byteArray[i] = low8Bits;
i++;
}
unsigned
char digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(byteArray, len, digest);
NSMutableString *hex = [NSMutableString
string];
for (int i =
0; i < CC_SHA1_DIGEST_LENGTH; i++) {
[hex appendFormat:@"%02x", digest[i]];
}
NSString *immutableHex = [NSString
stringWithString:hex];
return immutableHex;
}
+ (NSString *)sha224:(NSString *)input
{
const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData
dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA224_DIGEST_LENGTH];
CC_SHA224(data.bytes, (CC_LONG)data.length, digest);
NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA224_DIGEST_LENGTH *
2];
for(int i =
0; i < CC_SHA224_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
+ (NSString *)sha256:(NSString *)input
{
const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData
dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(data.bytes, (CC_LONG)data.length, digest);
NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA256_DIGEST_LENGTH *
2];
for(int i =
0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
+ (NSString *)sha384:(NSString *)input
{
const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData
dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA384_DIGEST_LENGTH];
CC_SHA384(data.bytes, (CC_LONG)data.length, digest);
NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA384_DIGEST_LENGTH *
2];
for(int i =
0; i < CC_SHA384_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
+ (NSString *)sha512:(NSString *)input
{
const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData
dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA512_DIGEST_LENGTH];
CC_SHA512(data.bytes, (CC_LONG)data.length, digest);
NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA512_DIGEST_LENGTH *
2];
for(int i =
0; i < CC_SHA512_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
#pragma mark - DES
+ (NSData *)DESEncryptWithKey:(NSString *)key data:(NSData *)data
{
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,
sizeof(keyPtr));
[key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data
length];
size_t bufferSize = dataLength +
kCCBlockSizeAES128;
void *buffer =
malloc(bufferSize);
size_t numBytesEncrypted =
0;
CCCryptorStatus cryptStatus =
CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding |
kCCOptionECBMode,
keyPtr, kCCBlockSizeDES,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus ==
kCCSuccess) {
return [NSData
dataWithBytesNoCopy:buffer
length:numBytesEncrypted];
}
free(buffer);
return
nil;
}
+ (NSData *)DESDecryptWithKey:(NSString *)key data:(NSData *)data
{
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,
sizeof(keyPtr));
[key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data
length];
size_t bufferSize = dataLength +
kCCBlockSizeAES128;
void *buffer =
malloc(bufferSize);
size_t numBytesDecrypted =
0;
CCCryptorStatus cryptStatus =
CCCrypt(kCCDecrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding |
kCCOptionECBMode,
keyPtr, kCCBlockSizeDES,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus ==
kCCSuccess) {
return [NSData
dataWithBytesNoCopy:buffer
length:numBytesDecrypted];
}
free(buffer);
return
nil;
}
#pragma mark - AES256
+ (NSData *)AES256EncryptWithKey:(NSString *)key data:(NSData *)data
{
char keyPtr[kCCKeySizeAES256 +
1];
bzero(keyPtr,
sizeof(keyPtr));
[key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data
length];
size_t bufferSize = dataLength +
kCCBlockSizeAES128;
void *buffer =
malloc(bufferSize);
size_t numBytesDecrypted =
0;
CCCryptorStatus cryptStatus =
CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding, keyPtr,
kCCKeySizeAES256,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus ==
kCCSuccess) {
return [NSData
dataWithBytesNoCopy:buffer
length:numBytesDecrypted];
}
free(buffer);
return
nil;
}
+ (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData *)data
{
char keyPtr[kCCKeySizeAES256 +
1];
bzero(keyPtr,
sizeof(keyPtr));
[key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data
length];
size_t bufferSize = dataLength +
kCCBlockSizeAES128;
void *buffer =
malloc(bufferSize);
size_t numBytesDecrypted =
0;
CCCryptorStatus cryptStatus =
CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding, keyPtr,
kCCKeySizeAES256,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus ==
kCCSuccess) {
return [NSData
dataWithBytesNoCopy:buffer
length:numBytesDecrypted];
}
free(buffer);
return
nil;
}
#pragma mark - Base64
+ (NSString *)base64EncodedStringWithData:(NSData *)data
{
if ([data length] <
1) {
return nil;
}
char *characters =
malloc((([data length] +
2) / 3) * 4);
if (characters ==
NULL)
return nil;
NSUInteger length =
0;
NSUInteger i =
0;
while (i < [data
length])
{
char buffer[3] = {0,0,0};
short bufferLength =
0;
while (bufferLength <
3 && i < [data length])
buffer[bufferLength++] = ((char *)[data
bytes])[i++];
// Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.
characters[length++] = encodingTable[(buffer[0] &
0xFC) >> 2];
characters[length++] = encodingTable[((buffer[0] &
0x03) << 4) | ((buffer[1] &
0xF0) >> 4)];
if (bufferLength >
1)
characters[length++] = encodingTable[((buffer[1] &
0x0F) << 2) | ((buffer[2] &
0xC0) >> 6)];
else characters[length++] =
'=';
if (bufferLength >
2)
characters[length++] = encodingTable[buffer[2] &
0x3F];
else characters[length++] =
'=';
}
return [[NSString
alloc] initWithBytesNoCopy:characters
length:length encoding:NSASCIIStringEncoding
freeWhenDone:YES];
}
+ (NSData *)dataWithBase64EncodedString:(NSString *)base64String
{
if (base64String.length <
1) {
return nil;
}
static char *decodingTable =
NULL;
if (decodingTable ==
NULL)
{
decodingTable = malloc(256);
if (decodingTable ==
NULL)
return
nil;
memset(decodingTable,
CHAR_MAX, 256);
NSUInteger i;
for (i = 0; i <
64; i++)
decodingTable[(short)encodingTable[i]] = i;
}
const
char *characters = [base64String
cStringUsingEncoding:NSASCIIStringEncoding];
if (characters ==
NULL) // Not an ASCII string!
return nil;
char *bytes =
malloc((([base64String length] +
3) / 4) * 3);
if (bytes == NULL)
return nil;
NSUInteger length =
0;
NSUInteger i =
0;
while (YES)
{
char buffer[4];
short bufferLength;
for (bufferLength =
0; bufferLength < 4; i++)
{
if (characters[i] ==
'\0')
break;
if (isspace(characters[i]) || characters[i] ==
'=')
continue;
buffer[bufferLength] = decodingTable[(short)characters[i]];
if (buffer[bufferLength++] ==
CHAR_MAX) // Illegal character!
{
free(bytes);
return
nil;
}
}
if (bufferLength ==
0)
break;
if (bufferLength ==
1)
// At least two characters are needed to produce one byte!
{
free(bytes);
return
nil;
}
// Decode the characters in the buffer to bytes.
bytes[length++] = (buffer[0] <<
2) | (buffer[1] >>
4);
if (bufferLength >
2)
bytes[length++] = (buffer[1] <<
4) | (buffer[2] >>
2);
if (bufferLength >
3)
bytes[length++] = (buffer[2] <<
6) | buffer[3];
}
bytes = realloc(bytes, length);
return [NSData
dataWithBytesNoCopy:bytes length:length];
}
+ (NSString *)base64EncodedString:(NSString *)string
{
return [self
base64EncodedStringWithData:[string
dataUsingEncoding:NSUTF8StringEncoding]];
}
+ (NSString *)stringWithBase64Encoded:(NSString *)base64String
{
return [[NSString
alloc] initWithData:[self
dataWithBase64EncodedString:base64String]
encoding:NSUTF8StringEncoding];
}
<Foundation/Foundation.h>框架
注意:.m文件需要导入
#import <CommonCrypto/CommonDigest.h>
#import <CommonCrypto/CommonCryptor.h>
.h文件实现接口:
/**
* 生成32位UUID,不带'-'
*
* @return 32位UUID
*/
+ (NSString *)createUUID;
#pragma mark - MD5
/**
* md5加密
*
* @param str 要加密的字符串
*
* @return 32位md5字符串
*/
+ (NSString *)md5:(NSString *)input;
#pragma mark - SHA
/**
* sha1加密
*
* @param input 要加密的字符串
*
* @return 加密后的字符串
*/
+ (NSString *)sha1:(NSString *)input;
+ (NSString *)sha224:(NSString *)input;
+ (NSString *)sha256:(NSString *)input;
+ (NSString *)sha384:(NSString *)input;
+ (NSString *)sha512:(NSString *)input;
#pragma mark - DES
/**
* DES加密
*
* @param key 密钥
* @param data 加密数据
*
* @return 加密后的数据
*/
+ (NSData *)DESEncryptWithKey:(NSString *)key data:(NSData *)data;
/**
* DES解密
*
* @param key 密钥
* @param data 解密数据
*
* @return 解密后的数据
*/
+ (NSData *)DESDecryptWithKey:(NSString *)key data:(NSData *)data;
#pragma mark - AES
/**
* AES256加密
*
* @param key 密钥
* @param data 加密数据
*
* @return 加密后的数据
*/
+ (NSData *)AES256EncryptWithKey:(NSString *)key data:(NSData *)data;
/**
* AES256解密
*
* @param key 密钥
* @param data 解密数据
*
* @return 解密后的数据
*/
+ (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData *)data;
#pragma mark - Base64
/**
* NSData转Base64
*
* @param data
*
* @return
*/
+ (NSString *)base64EncodedStringWithData:(NSData *)data;
/**
* Base64转NSData
*
* @param base64String
*
* @return
*/
+ (NSData *)dataWithBase64EncodedString:(NSString *)base64String;
/**
* NSString转Base64
*
* @param string
*
* @return
*/
+ (NSString *)base64EncodedString:(NSString *)string;
/**
* Base64转NSString
*
* @param base64String base64字符串
*
* @return
*/
+ (NSString *)stringWithBase64Encoded:(NSString *)base64String;
.m文件实现接口:
static const
char encodingTable[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ (NSString *)createUUID
{
NSUUID *uuid = [NSUUID
UUID];
return [[uuid
UUIDString] stringByReplacingOccurrencesOfString:@"-"
withString:@""];
}
#pragma mark - MD5
+ (NSString *)md5:(NSString *)input
{
const char *cStrValue = [input
UTF8String];
if (cStrValue ==
NULL) {
cStrValue = "";
}
unsigned
char r[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStrValue, (CC_LONG)strlen(cStrValue), r);
return [NSString
stringWithFormat:@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
r[0], r[1], r[2], r[3], r[4], r[5],
r[6], r[7], r[8], r[9], r[10], r[11], r[12],
r[13], r[14], r[15]];
}
#pragma mark - SHA1
+ (NSString *)sha1:(NSString *)input
{
const char *ptr = [input
UTF8String];
int i =0;
int len = (int)strlen(ptr);
Byte byteArray[len];
while (i!=len)
{
unsigned eachChar = *(ptr + i);
unsigned low8Bits = eachChar &
0xFF;
byteArray[i] = low8Bits;
i++;
}
unsigned
char digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(byteArray, len, digest);
NSMutableString *hex = [NSMutableString
string];
for (int i =
0; i < CC_SHA1_DIGEST_LENGTH; i++) {
[hex appendFormat:@"%02x", digest[i]];
}
NSString *immutableHex = [NSString
stringWithString:hex];
return immutableHex;
}
+ (NSString *)sha224:(NSString *)input
{
const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData
dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA224_DIGEST_LENGTH];
CC_SHA224(data.bytes, (CC_LONG)data.length, digest);
NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA224_DIGEST_LENGTH *
2];
for(int i =
0; i < CC_SHA224_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
+ (NSString *)sha256:(NSString *)input
{
const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData
dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(data.bytes, (CC_LONG)data.length, digest);
NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA256_DIGEST_LENGTH *
2];
for(int i =
0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
+ (NSString *)sha384:(NSString *)input
{
const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData
dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA384_DIGEST_LENGTH];
CC_SHA384(data.bytes, (CC_LONG)data.length, digest);
NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA384_DIGEST_LENGTH *
2];
for(int i =
0; i < CC_SHA384_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
+ (NSString *)sha512:(NSString *)input
{
const
char *cstr = [input
cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData
dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA512_DIGEST_LENGTH];
CC_SHA512(data.bytes, (CC_LONG)data.length, digest);
NSMutableString* output = [NSMutableString
stringWithCapacity:CC_SHA512_DIGEST_LENGTH *
2];
for(int i =
0; i < CC_SHA512_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
#pragma mark - DES
+ (NSData *)DESEncryptWithKey:(NSString *)key data:(NSData *)data
{
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,
sizeof(keyPtr));
[key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data
length];
size_t bufferSize = dataLength +
kCCBlockSizeAES128;
void *buffer =
malloc(bufferSize);
size_t numBytesEncrypted =
0;
CCCryptorStatus cryptStatus =
CCCrypt(kCCEncrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding |
kCCOptionECBMode,
keyPtr, kCCBlockSizeDES,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesEncrypted);
if (cryptStatus ==
kCCSuccess) {
return [NSData
dataWithBytesNoCopy:buffer
length:numBytesEncrypted];
}
free(buffer);
return
nil;
}
+ (NSData *)DESDecryptWithKey:(NSString *)key data:(NSData *)data
{
char keyPtr[kCCKeySizeAES256+1];
bzero(keyPtr,
sizeof(keyPtr));
[key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data
length];
size_t bufferSize = dataLength +
kCCBlockSizeAES128;
void *buffer =
malloc(bufferSize);
size_t numBytesDecrypted =
0;
CCCryptorStatus cryptStatus =
CCCrypt(kCCDecrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding |
kCCOptionECBMode,
keyPtr, kCCBlockSizeDES,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus ==
kCCSuccess) {
return [NSData
dataWithBytesNoCopy:buffer
length:numBytesDecrypted];
}
free(buffer);
return
nil;
}
#pragma mark - AES256
+ (NSData *)AES256EncryptWithKey:(NSString *)key data:(NSData *)data
{
char keyPtr[kCCKeySizeAES256 +
1];
bzero(keyPtr,
sizeof(keyPtr));
[key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data
length];
size_t bufferSize = dataLength +
kCCBlockSizeAES128;
void *buffer =
malloc(bufferSize);
size_t numBytesDecrypted =
0;
CCCryptorStatus cryptStatus =
CCCrypt(kCCEncrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding, keyPtr,
kCCKeySizeAES256,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus ==
kCCSuccess) {
return [NSData
dataWithBytesNoCopy:buffer
length:numBytesDecrypted];
}
free(buffer);
return
nil;
}
+ (NSData *)AES256DecryptWithKey:(NSString *)key data:(NSData *)data
{
char keyPtr[kCCKeySizeAES256 +
1];
bzero(keyPtr,
sizeof(keyPtr));
[key getCString:keyPtr
maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data
length];
size_t bufferSize = dataLength +
kCCBlockSizeAES128;
void *buffer =
malloc(bufferSize);
size_t numBytesDecrypted =
0;
CCCryptorStatus cryptStatus =
CCCrypt(kCCDecrypt,
kCCAlgorithmAES128,
kCCOptionPKCS7Padding, keyPtr,
kCCKeySizeAES256,
NULL,
[data bytes], dataLength,
buffer, bufferSize,
&numBytesDecrypted);
if (cryptStatus ==
kCCSuccess) {
return [NSData
dataWithBytesNoCopy:buffer
length:numBytesDecrypted];
}
free(buffer);
return
nil;
}
#pragma mark - Base64
+ (NSString *)base64EncodedStringWithData:(NSData *)data
{
if ([data length] <
1) {
return nil;
}
char *characters =
malloc((([data length] +
2) / 3) * 4);
if (characters ==
NULL)
return nil;
NSUInteger length =
0;
NSUInteger i =
0;
while (i < [data
length])
{
char buffer[3] = {0,0,0};
short bufferLength =
0;
while (bufferLength <
3 && i < [data length])
buffer[bufferLength++] = ((char *)[data
bytes])[i++];
// Encode the bytes in the buffer to four characters, including padding "=" characters if necessary.
characters[length++] = encodingTable[(buffer[0] &
0xFC) >> 2];
characters[length++] = encodingTable[((buffer[0] &
0x03) << 4) | ((buffer[1] &
0xF0) >> 4)];
if (bufferLength >
1)
characters[length++] = encodingTable[((buffer[1] &
0x0F) << 2) | ((buffer[2] &
0xC0) >> 6)];
else characters[length++] =
'=';
if (bufferLength >
2)
characters[length++] = encodingTable[buffer[2] &
0x3F];
else characters[length++] =
'=';
}
return [[NSString
alloc] initWithBytesNoCopy:characters
length:length encoding:NSASCIIStringEncoding
freeWhenDone:YES];
}
+ (NSData *)dataWithBase64EncodedString:(NSString *)base64String
{
if (base64String.length <
1) {
return nil;
}
static char *decodingTable =
NULL;
if (decodingTable ==
NULL)
{
decodingTable = malloc(256);
if (decodingTable ==
NULL)
return
nil;
memset(decodingTable,
CHAR_MAX, 256);
NSUInteger i;
for (i = 0; i <
64; i++)
decodingTable[(short)encodingTable[i]] = i;
}
const
char *characters = [base64String
cStringUsingEncoding:NSASCIIStringEncoding];
if (characters ==
NULL) // Not an ASCII string!
return nil;
char *bytes =
malloc((([base64String length] +
3) / 4) * 3);
if (bytes == NULL)
return nil;
NSUInteger length =
0;
NSUInteger i =
0;
while (YES)
{
char buffer[4];
short bufferLength;
for (bufferLength =
0; bufferLength < 4; i++)
{
if (characters[i] ==
'\0')
break;
if (isspace(characters[i]) || characters[i] ==
'=')
continue;
buffer[bufferLength] = decodingTable[(short)characters[i]];
if (buffer[bufferLength++] ==
CHAR_MAX) // Illegal character!
{
free(bytes);
return
nil;
}
}
if (bufferLength ==
0)
break;
if (bufferLength ==
1)
// At least two characters are needed to produce one byte!
{
free(bytes);
return
nil;
}
// Decode the characters in the buffer to bytes.
bytes[length++] = (buffer[0] <<
2) | (buffer[1] >>
4);
if (bufferLength >
2)
bytes[length++] = (buffer[1] <<
4) | (buffer[2] >>
2);
if (bufferLength >
3)
bytes[length++] = (buffer[2] <<
6) | buffer[3];
}
bytes = realloc(bytes, length);
return [NSData
dataWithBytesNoCopy:bytes length:length];
}
+ (NSString *)base64EncodedString:(NSString *)string
{
return [self
base64EncodedStringWithData:[string
dataUsingEncoding:NSUTF8StringEncoding]];
}
+ (NSString *)stringWithBase64Encoded:(NSString *)base64String
{
return [[NSString
alloc] initWithData:[self
dataWithBase64EncodedString:base64String]
encoding:NSUTF8StringEncoding];
}
相关文章推荐
- IOS开发 关闭虚拟键盘的各种方式
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
- iOS开发中常用到的加密方式
- iOS开发之第三方分享微博分享、微博分享失败原因总结,史上最新最全第三方分享微博方式实现。 微博分享各种坑总结
- 在ios开发中有多少常用的加密解密方式(备用)
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
- iOS开发中常用到的加密方式
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
- iOS开发的几种加密方式
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
- iOS开发中MD5加密方式
- iOS开发>学无止境 - 各种传值方式
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
- iOS开发,让数据更安全的几个加密方式
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
- IOS开发之—— 各种加密的使用(MD5,base64,DES,AES)
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式
- ios程序开发中用到的加密方式
- iOS开发,让数据更安全的几个加密方式
- iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式