java 与c des_(绝对有用)objective-c和java下DES加密保持一致的方式

身为一个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 此处应有自拍。。。

a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

我除了是一只iOS攻城狮,还是个网店店主噢~

喜欢请关注我微博:@钟溪妍

店铺:鹿溪森女系

每周定时上新,喜欢的来逛逛吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值