IT新闻:

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

  这几天苦于思索神州付中使用到的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

 1 - (NSString *)encryptUseDES:(NSString *)plainText key:(NSString *)key
 2 {
 3     Byte iv[] = {1,2,3,4,5,6,7,8};
 4     NSString *ciphertext = nil;
 5     //const char *textBytes = [plainText UTF8String];
 6     NSData *textData = [plainText dataUsingEncoding:NSUTF8StringEncoding];
 7     NSUInteger dataLength = [plainText length];
 8     unsigned char buffer[1024];
 9     memset(buffer, 0, sizeof(char));
10     size_t numBytesEncrypted = 0;
11     /*Byte *test =   (Byte *)[[GTMBase64 decodeString:key] bytes];
12     for(int i=0;i<[[GTMBase64 decodeString:key] length];i++)
13     {
14         printf("testByte = %d\n",test[i]);
15     }//*/
16     
17     CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,
18                                           kCCOptionPKCS7Padding | kCCOptionECBMode,
19                                           [[GTMBase64 decodeString:key] bytes], kCCKeySizeDES,
20                                           iv,
21                                           [textData bytes], dataLength,
22                                           buffer, 1024,
23                                           &numBytesEncrypted);
24     if (cryptStatus == kCCSuccess)
25     {
26         NSData *data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted];
27         /*Byte *test1 =   (Byte *)[data bytes];
28         for(int i=0;i<[data length];i++)
29             printf("testByte = %d\n",test1[i]);//*/
30         NSString *str5 = [[NSString alloc] initWithData:[GTMBase64 encodeData:data] encoding:NSUTF8StringEncoding];
31         
32         return str5;
33     }
34     return ciphertext;
35 }

 

posted @ 2013-03-04 10:35  胡藟壘  阅读(799)  评论(0)    收藏  举报