【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 }

浙公网安备 33010602011771号