iOS加密方法(整理)
阿新 • • 發佈:2019-02-19
以下程式碼源自網路,本人稍作整理,供各位參考,所有權歸原作者。
1、================= 3DES加密 / 解密 =================
1)加密
2)解密/** * 3DES加密 * * @param plainText 明文 * @param key 金鑰 * * @return 加密結果 */ - (NSString *)encryptUseDES:(NSString *)plainText key:(NSString *)key { NSString *ciphertext = nil; const char *textBytes = [plainText UTF8String]; NSUInteger dataLength = [plainText length]; unsigned char buffer[1024]; memset(buffer, 0, sizeof(char)); Byte iv[] = {1,2,3,4,5,6,7,8}; size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, [key UTF8String], kCCKeySizeDES, iv, textBytes, dataLength, buffer, 1024, &numBytesEncrypted); if (cryptStatus == kCCSuccess) { NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted]; ciphertext = [[[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding] autorelease]; } return ciphertext; }
/** * 3DES解密 * * @param cipherText 密文 * @param key 金鑰 * * @return 解密結果 */ - (NSString *)decryptUseDES:(NSString*)cipherText key:(NSString*)key { NSData* cipherData = [GTMBase64 decodeString:cipherText]; unsigned char buffer[1024]; memset(buffer, 0, sizeof(char)); size_t numBytesDecrypted = 0; Byte iv[] = {1,2,3,4,5,6,7,8}; CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding, [key UTF8String], kCCKeySizeDES, iv, [cipherData bytes], [cipherData length], buffer, 1024, &numBytesDecrypted); NSString* plainText = nil; if (cryptStatus == kCCSuccess) { NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted]; plainText = [[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] autorelease]; } return plainText; }
2、================= MD5加密 =================
1)32位MD5加密
/** * 32位MD5加密 * * @param string 加密字串 * @param LetterCaseOption 加密選項 {1:大寫;2:小寫} * * @return 加密後的字串 */ - (NSString *)encodeUsingMD5ByString:(NSString *)plainText letterCaseOption:(NSInteger)letterCaseOption{ const char *cStr = [plainText UTF8String]; unsigned char digest[CC_MD5_DIGEST_LENGTH]; CC_MD5( cStr, strlen(cStr), digest ); NSMutableString *encodeString = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) [encodeString appendFormat:@"%02x", digest[i]]; NSString *cipherText = nil; if (letterCaseOption == 1) { cipherText = [encodeString uppercaseString]; }else{ cipherText = [encodeString lowercaseString]; } return cipherText; }
2)16位MD5加密
/**
* 16位MD5加密
*
* @param plainText 明文
* @param letterCaseOption 大小寫選項
*
* @return 加密結果
*/
- (NSString *)encodeUsing16BitsMD5ByString:(NSString *)plainText letterCaseOption:(NSInteger)letterCaseOption{
const char *cStr = [plainText UTF8String];
unsigned char result[16];
CC_MD5(cStr, strlen(cStr), result);
NSString *encodeString = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];
NSString *cipherText = nil;
if (letterCaseOption == 1) {
cipherText = [encodeString uppercaseString];
}else{
cipherText = [encodeString lowercaseString];
}
return cipherText;
}
注:MD5加密不可逆,所以沒有MD5解密
3、================= Base64編碼 / 解碼 =================
/**
* Base64編碼
*
* @param data 源資訊
*
* @return 編碼結果
*/
- (NSString *)base64EncodedStringFromData:(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++];
}
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++] = '=';
}
}
NSString *formatString = [[NSString alloc] initWithBytesNoCopy:characters
length:length
encoding:NSUTF8StringEncoding
freeWhenDone:YES];
return formatString;
}
注:Base64不是一種加密方式,只是一種編碼規範,考慮到在加密 / 解密的過程中經常用到Base64,故新增到本文中。
(未完待續)