身为一个iOS攻城狮的我深有体悟,有时用度娘想搜到一个问题的解决办法并不是件容易的事。基本上搜了很多博客都是同样的内容,但要么是因为少了引用或者是少粘了一些参数,而致使问题最终还是无法解决。代码溪不想让大家走太多弯路,身为莱鸟的我想给大家行个方便,尽量把代码粘全,让大家能真正的解决问题。以下是我整理的DES+Base64加密的算法,绝对能用噢~
一共给大家两个类.
DESEncrypt.h中的代码:
[由于引用框架的尖括号放在网页中可能会存在显示的问题,所以我换一种方式来表达]
#import
尖括号(Foundation/Foundation.h)
@interface DESEncrypt :
NSObject
//加密方法
+(NSString *)
encryptUseDES:(NSString *)plainText key:(NSString *)key;
//解密方法
+(NSString *)
decryptUseDES:(NSString *)cipherText key:(NSString
*)key;
@end
DESEncrypt.m中的代码,需要注意的有两点:
1.要引用CommonCrypto/CommonCrypto.h
2. CCCryptorStatus cryptStatus
= CCCrypt(kCCEncrypt, kCCAlgorithmDES,
kCCOptionPKCS7Padding|kCCOptionECBMode,
[key UTF8String],
kCCKeySizeDES,
iv,
[textData bytes],
dataLength,
buffer, 1024,
&numBytesEncrypted);
注意上面方法中的红色部分。
#import
"DesEncrypt.h"
#import 尖括号(CommonCrypto/CommonCrypto.h)
#import "Base64.h"
@implementation DESEncrypt :
NSObject
const Byte iv[] =
{1,2,3,4,5,6,7,8};
#pragma mark- 加密算法
+(NSString *)
encryptUseDES:(NSString *)plainText key:(NSString *)key
{
NSString *ciphertext = nil;
NSData *textData = [plainText
dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger dataLength = [textData
length];
unsigned char buffer[1024];
memset(buffer, 0, sizeof(char));
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus =
CCCrypt(kCCEncrypt, kCCAlgorithmDES,
kCCOptionPKCS7Padding|kCCOptionECBMode,
[key UTF8String],
kCCKeySizeDES,
iv,
[textData bytes],
dataLength,
buffer, 1024,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
NSData
*data = [NSData dataWithBytes:buffer
length:(NSUInteger)numBytesEncrypted];
ciphertext
= [Base64 encode:data];
}
return ciphertext;
}
#pragma mark- 解密算法
+(NSString
*)decryptUseDES:(NSString *)cipherText key:(NSString
*)key
{
NSString *plaintext = nil;
NSData *cipherdata = [Base64
decode:cipherText];
unsigned char buffer[1024];
memset(buffer, 0, sizeof(char));
size_t numBytesDecrypted = 0;
// kCCOptionPKCS7Padding|kCCOptionECBMode
最主要在这步
CCCryptorStatus cryptStatus =
CCCrypt(kCCDecrypt, kCCAlgorithmDES,
kCCOptionPKCS7Padding|kCCOptionECBMode,
[key UTF8String],
kCCKeySizeDES,
iv,
[cipherdata bytes],
[cipherdata length],
buffer, 1024,
&numBytesDecrypted);
if(cryptStatus == kCCSuccess) {
NSData
*plaindata = [NSData dataWithBytes:buffer
length:(NSUInteger)numBytesDecrypted];
plaintext
= [[NSString alloc]initWithData:plaindata
encoding:NSUTF8StringEncoding];
}
return plaintext;
}
@end
Base64.h中的代码如下:
#import
尖括号(Foundation/Foundation.h)
@interface Base64 :
NSObject
+(NSString *)encode:(NSData
*)data;
+(NSData *)decode:(NSString
*)dataString;
@end
Base64.m中的代码如下:
#import "Base64.h"
@interface Base64()
+(int)char2Int:(char)c;
@end
@implementation
Base64
static const char
encodingTable[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+(NSString *)encode:(NSData
*)data
{
if (data.length == 0)
return
nil;
char *characters = malloc(data.length * 3 /
2);
if (characters == NULL)
return
nil;
int end = data.length - 3;
int index = 0;
int charCount = 0;
int n = 0;
while (index <= end) {
int d =
(((int)(((char *)[data bytes])[index]) & 0x0ff) <<
16)
|
(((int)(((char *)[data bytes])[index + 1]) & 0x0ff) <<
8)
|
((int)(((char *)[data bytes])[index + 2]) & 0x0ff);
characters[charCount++] = encodingTable[(d >> 18) &
63];
characters[charCount++] = encodingTable[(d >> 12) &
63];
characters[charCount++] = encodingTable[(d >> 6) &
63];
characters[charCount++] = encodingTable[d & 63];
index +=
3;
if(n++
>= 14)
{
n = 0;
characters[charCount++] = '
';
}
}
if(index == data.length - 2)
{
int d =
(((int)(((char *)[data bytes])[index]) & 0x0ff) <<
16)
|
(((int)(((char *)[data bytes])[index + 1]) & 255) <<
8);
characters[charCount++] = encodingTable[(d >> 18) &
63];
characters[charCount++] = encodingTable[(d >> 12) &
63];
characters[charCount++] = encodingTable[(d >> 6) &
63];
characters[charCount++] = '=';
}
else if(index == data.length - 1)
{
int d =
((int)(((char *)[data bytes])[index]) & 0x0ff) <<
16;
characters[charCount++] = encodingTable[(d >> 18) &
63];
characters[charCount++] = encodingTable[(d >> 12) &
63];
characters[charCount++] = '=';
characters[charCount++] = '=';
}
NSString * rtnStr = [[NSString alloc]
initWithBytesNoCopy:characters length:charCount
encoding:NSUTF8StringEncoding freeWhenDone:YES];
return rtnStr;
}
+(NSData *)decode:(NSString
*)data
{
if(data == nil || data.length <= 0)
{
return
nil;
}
NSMutableData *rtnData = [[NSMutableData
alloc]init];
int slen = data.length;
int index = 0;
while (true) {
while
(index < slen && [data characterAtIndex:index] <= '
') {
index++;
}
if (index
>= slen || index + 3 >= slen) {
break;
}
int byte =
([self char2Int:[data characterAtIndex:index]] << 18) +
([self char2Int:[data characterAtIndex:index + 1]] << 12) +
([self char2Int:[data characterAtIndex:index + 2]] << 6) +
[self char2Int:[data characterAtIndex:index + 3]];
Byte temp1
= (byte >> 16) & 255;
[rtnData
appendBytes:&temp1 length:1];
if([data
characterAtIndex:index + 2] == '=') {
break;
}
Byte temp2
= (byte >> 8) & 255;
[rtnData
appendBytes:&temp2 length:1];
if([data
characterAtIndex:index + 3] == '=') {
break;
}
Byte temp3
= byte & 255;
[rtnData
appendBytes:&temp3 length:1];
index +=
4;
}
return rtnData;
}
+(int)char2Int:(char)c
{
if (c >= 'A' && c <= 'Z')
{
return c -
65;
} else if (c >= 'a' && c <= 'z')
{
return c -
97 + 26;
} else if (c >= '0' && c <= '9')
{
return c -
48 + 26 + 26;
} else {
switch(c)
{
case '+':
return 62;
case '/':
return 63;
case '=':
return 0;
default:
return -1;
}
}
}
@end
测试的代码:
(注意加解密的密钥key是一个噢)
NSString *text = @"爱哈水库大时代";
NSString *encryptedText = [DESEncrypt
encryptUseDES:text key:@"12345678asdcfreq"];
NSLog(@"明文:%@",text);
NSLog(@"秘钥:%@",@"12345678asdcfreq");
NSLog(@"密文:%@",encryptedText);
NSString * decryptedText=[DESEncrypt
decryptUseDES:encryptedText key:@"12345678asdcfreq"];
NSLog(@"解密后:%@",decryptedText);
PS:这个问题是在和后台调接口时用到的,由于后台和安卓前端的代码用的都是Java,因此要保证iOS使用相同的明文和密钥加密的结果和安卓前端加密的结果相同。写完后,要和安卓运行的结果对比一下噢~
End 此处应有自拍。。。
我除了是一只iOS攻城狮,还是个网店店主噢~
喜欢请关注我微博:@钟溪妍
店铺:鹿溪森女系
每周定时上新,喜欢的来逛逛吧~