以下代码源自网络,本人稍作整理,供各位参考,所有权归原作者。
1、================= 3DES加密 / 解密 =================
1)加密
/**
* 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;
}
2)解密
/**
* 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,故添加到本文中。
(未完待续)