iOS的各種加密方法使用簡介
阿新 • • 發佈:2019-02-11
<pre name="code" class="objc"><span style="font-size:18px;color:#cc0000;background-color: rgb(204, 204, 204);">本文主要記載了本文在以往工作中涉及到得加密方式記載以便以後使用:在以往的工作中我們iOS客戶端的加密主要應用於介面引數傳遞安全、二維碼資訊加密、簽名驗證等等,不同的應用應該採用不同的加密方法比如支付寶RSA加密,公私鑰匹配的模式,微信支付sha1和md5加密都是對於支付來說很安全的,具體的百度,我就不copy了。</span>
1.base64加密:
<span style="font-size:14px;">// // base64Test.m // base64test // // Created by apple on 15/6/30. // Copyright (c) 2015年 meishidiandian. All rights reserved. // #import "base64Test.h" //引入IOS自帶密碼庫 #import <CommonCrypto/CommonCryptor.h> //空字串 #define LocalStr_None @"" static const char encodingTable[] = ""; @implementation base64Test + (NSString *)base64StringFromText:(NSString *)text { if (text && ![text isEqualToString:LocalStr_None]) { //取專案的bundleIdentifier作為KEY 改動了此處 //NSString *key = [[NSBundle mainBundle] bundleIdentifier]; NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding]; //IOS 自帶DES加密 Begin 改動了此處 //data = [self DESEncrypt:data WithKey:key]; //IOS 自帶DES加密 End return [self base64EncodedStringFrom:data]; } else { return LocalStr_None; } } + (NSString *)textFromBase64String:(NSString *)base64 { if (base64 && ![base64 isEqualToString:LocalStr_None]) { //取專案的bundleIdentifier作為KEY 改動了此處 //NSString *key = [[NSBundle mainBundle] bundleIdentifier]; NSData *data = [self dataWithBase64EncodedString:base64]; //IOS 自帶DES解密 Begin 改動了此處 //data = [self DESDecrypt:data WithKey:key]; //IOS 自帶DES加密 End return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; } else { return LocalStr_None; } } /****************************************************************************** 函式名稱 : + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key 函式描述 : 文字資料進行DES加密 輸入引數 : (NSData *)data (NSString *)key 輸出引數 : N/A 返回引數 : (NSData *) 備註資訊 : 此函式不可用於過長文字 ******************************************************************************/ + (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key { 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 *)DESEncrypt:(NSData *)data WithKey:(NSString *)key 函式描述 : 文字資料進行DES解密 輸入引數 : (NSData *)data (NSString *)key 輸出引數 : N/A 返回引數 : (NSData *) 備註資訊 : 此函式不可用於過長文字 ******************************************************************************/ + (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key { 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; } /****************************************************************************** 函式名稱 : + (NSData *)dataWithBase64EncodedString:(NSString *)string 函式描述 : base64格式字串轉換為文字資料 輸入引數 : (NSString *)string 輸出引數 : N/A 返回引數 : (NSData *) 備註資訊 : ******************************************************************************/ + (NSData *)dataWithBase64EncodedString:(NSString *)string { if (string == nil) [NSException raise:NSInvalidArgumentException format:nil]; if ([string length] == 0) return [NSData data]; 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 = [string cStringUsingEncoding:NSASCIIStringEncoding]; if (characters == NULL) // Not an ASCII string! return nil; char *bytes = malloc((([string 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 *)base64EncodedStringFrom:(NSData *)data 函式描述 : 文字資料轉換為base64格式字串 輸入引數 : (NSData *)data 輸出引數 : N/A 返回引數 : (NSString *) 備註資訊 : ******************************************************************************/ + (NSString *)base64EncodedStringFrom:(NSData *)data { if ([data length] == 0) return @""; 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]; } @end</span><span style="font-size: 18px;"> </span>
2.md5+sha1加密:
//md5 encode +(NSString *) md5:(NSString *)str { const char *cStr = [str UTF8String]; unsigned char digest[CC_MD5_DIGEST_LENGTH]; CC_MD5( cStr, (unsigned int)strlen(cStr), digest ); NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) [output appendFormat:@"%02X", digest[i]]; return output; } //sha1 encode +(NSString*) sha1:(NSString *)str { const char *cstr = [str cStringUsingEncoding:NSUTF8StringEncoding]; NSData *data = [NSData dataWithBytes:cstr length:str.length]; uint8_t digest[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(data.bytes, (unsigned int)data.length, digest); NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) [output appendFormat:@"%02x", digest[i]]; return output; }
3.aes256位 加密和解密:
#import "NSData+AES256.h"
#define PASSWORD @"feng5.cn12345678"
static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
const NSUInteger kAlgorithmKeySize = kCCKeySizeAES256;
const NSUInteger kPBKDFRounds = 10000; // ~80ms on an iPhone 4
static Byte saltBuff[] = {0,1,2,3,4,5,6,7,8,9,0xA,0xB,0xC,0xD,0xE,0xF};
static Byte ivBuff[] = {0xA,1,0xB,5,4,0xF,7,9,0x17,3,1,6,8,0xC,0xD,91};
@implementation NSData (AES256)
+ (NSData *)AESKeyForPassword:(NSString *)password{ //Derive a key from a text password/passphrase
NSMutableData *derivedKey = [NSMutableData dataWithLength:kAlgorithmKeySize];
NSData *salt = [NSData dataWithBytes:saltBuff length:kCCKeySizeAES128];
int result = CCKeyDerivationPBKDF(kCCPBKDF2, // algorithm演算法
password.UTF8String, // password密碼
password.length, // passwordLength密碼的長度
salt.bytes, // salt內容
salt.length, // saltLen長度
kCCPRFHmacAlgSHA1, // PRF
kPBKDFRounds, // rounds迴圈次數
derivedKey.mutableBytes, // derivedKey
derivedKey.length); // derivedKeyLen derive:出自
NSAssert(result == kCCSuccess,
@"Unable to create AES key for spassword: %d", result);
return derivedKey;
}
/*加密方法*/
+ (NSString *)AES256EncryptWithPlainText:(NSString *)plain {
NSData *plainText = [plain dataUsingEncoding:NSUTF8StringEncoding];
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
NSUInteger dataLength = [plainText length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
bzero(buffer, sizeof(buffer));
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,kCCOptionPKCS7Padding,
[[NSData AESKeyForPassword:PASSWORD] bytes], kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[plainText bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
return [encryptData base64EncodedStringWithOptions:0];
}
free(buffer); //free the buffer;
return nil;
}
/*解密方法*/
+ (NSString *)AES256DecryptWithCiphertext:(NSString *)ciphertexts{
NSData *cipherData = [NSData dataWithBase64EncodedString:ciphertexts];
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
NSUInteger dataLength = [cipherData length];
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
[[NSData AESKeyForPassword:PASSWORD] bytes], kCCKeySizeAES256,
NULL ,/* initialization vector (optional) */
[cipherData bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesDecrypted);
if (cryptStatus == kCCSuccess) {
NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
return [[NSString alloc] initWithData:encryptData encoding:NSUTF8StringEncoding] ;
}
free(buffer); //free the buffer;
return nil;
}
+ (id)dataWithBase64EncodedString:(NSString *)string;
{
if (string == nil)
[NSException raise:NSInvalidArgumentException format:nil];
if ([string length] == 0)
return [NSData data];
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 = [string cStringUsingEncoding:NSASCIIStringEncoding];
if (characters == NULL) // Not an ASCII string!
return nil;
char *bytes = malloc((([string 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];
}
先記載那麼多待續中。。。。。。。。。。。