您的位置:首页 > 移动开发 > IOS开发

【IOS学习之路】关于DES加密 神州付中使用到的DES加密方式

2013-03-04 10:35 513 查看
  这几天苦于思索神州付中使用到的DES加密,DES加密在很多模式下出来的结果是完全不一样的,怎样去保持ios与java加密都是统一的。

  这里我以神州付中的DES加密为力,可能不同的DES加密会有不同的方式,但是主要是体现在

CCCrypt这个函数中,下面是他的原型


CCCryptorStatus CCCrypt(
CCOperation op,         /* kCCEncrypt, etc. */
CCAlgorithm alg,        /* kCCAlgorithmAES128, etc. */
CCOptions options,      /* kCCOptionPKCS7Padding, etc. */
const void *key,
size_t keyLength,
const void *iv,         /* optional initialization vector */
const void *dataIn,     /* optional per op and alg */
size_t dataInLength,
void *dataOut,          /* data RETURNED here */
size_t dataOutAvailable,
size_t *dataOutMoved)
__OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_2_0);


在神州付中要作调整的地方主要是在

CCOptions options,

const void *key

options参数在mac支持:

NoPadding
PKCS7Padding

而java支持:
NoPadding
ISO10126Padding
OAEPPadding, OAEPWith<digest>And<mgf>Padding
PKCS1Padding
PKCS5Padding
SSL3Padding

NoPadding就是不填充,相当于自定义填充,显然太麻烦。
除此之外,就没有相同的了。

那么如何让iphone加密的数据,由服务器的java解开呢?
mac的PKCS7Padding在java中没有,那麻烦了,试了一下,可以如下解决。

1.都用NoPadding,太痛苦,放弃
2.java下载扩展包,让java支持PKCS7Padding,可以考虑,但要服务器加java的扩展包
3.别使用AES算法了,使用DES或3DES等,因为它们的加密数据包单位长度是8字节,在8字节的情况下PKCS7Padding 等价与 PKCS5Padding。
mac不支持pkcs5 我手动传了 3 能实现 pkcs5padding
现在恍然大悟 kCCOptionPKCS7Padding|kCCOptionECBMode


- (NSString *)encryptUseDES:(NSString *)plainText key:(NSString *)key
{
Byte iv[] = {1,2,3,4,5,6,7,8};
NSString *ciphertext = nil;
//const char *textBytes = [plainText UTF8String];
NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger dataLength = [plainText length];
unsigned char buffer[1024];
memset(buffer, 0, sizeof(char));
size_t numBytesEncrypted = 0;
/*Byte *test =   (Byte *)[[GTMBase64 decodeString:key] bytes];
for(int i=0;i<[[GTMBase64 decodeString:key] length];i++)
{
printf("testByte = %d\n",test[i]);
}//*/

CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
kCCOptionPKCS7Padding | kCCOptionECBMode,
[[GTMBase64 decodeString:key] bytes], kCCKeySizeDES,
iv,
[textData bytes], dataLength,
buffer, 1024,
&numBytesEncrypted);
if (cryptStatus == kCCSuccess)
{
NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
/*Byte *test1 =   (Byte *)[data bytes];
for(int i=0;i<[data length];i++)
printf("testByte = %d\n",test1[i]);//*/
NSString *str5 = [[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding];

return str5;
}
return ciphertext;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐