{
NSData* data = [GTMBase64decodeString:cipherText];
NSUInteger bufferSize=([data length] + kCCKeySizeDES) & ~(kCCKeySizeDES -1);
char buffer[bufferSize];
memset(buffer, 0,sizeof(buffer));
size_t bufferNumBytes;
CCCryptorStatuscryptStatus = CCCrypt(kCCDecrypt,
kCCAlgorithmDES,
kCCOptionPKCS7Padding,
[key UTF8String],
kCCKeySizeDES,
iv,
[databytes],
[datalength],
buffer,
bufferSize,
&bufferNumBytes);
NSString* plainText = nil;
if (cryptStatus ==kCCSuccess) {
NSData *plainData =[NSData dataWithBytes:buffer length:(NSUInteger)bufferNumBytes];
NSLog(@"plainTextBytes:%@",[XYDES dataToHex:plainData]);
plainText = [[NSStringalloc] initWithData:plainData encoding:NSUTF8StringEncoding];
}
return plainText;
}
加密后的字节流采用[GTMBase64 stringByEncodingData:data];方法进行编码,在解密方法中采用[GTMBase64 decodeString:cipherText];进行解码。这么做的目的是为了密文更好地保存和运输。
更多的加密解密技术字节,可google一下CCCrypt方法。
4.总结
实现Java和Objective-C中加密解密数据一致性是整个问题的关键,需要有下列四点保证措施。
1、字符串采用UTF8编码后的字节要一致;
2、UTF8编码后的字节在base64上编码也要一致;
3、采用的算法一致;
在Objective-C中采用DES的kCCOptionPKCS7Padding,而在Java中采用PKCS5Padding,在密钥都是8个字节的前提下,这两个方式加密解密结果一样。
4、加密后的字节流要一致;
这是验证加密算法的一个标准,如果这个都不一致,需检查加密算法。
只要实现了以上四点,就能保证在客户端通过Objective-C加密后发送一个密文,在服务器端通过Java就能解密,反之也可。