iOS DES加密遇到的问题
1.DES加解密时确保buffer的大小足够大BUFFER_SIZE
+(NSString*) decryptUseDES:(NSString*)cipherText key:(NSString*)key { // 利用 GTMBase64 解碼 Base64 字串 NSData* cipherData = [GTMBase64 decodeString:cipherText]; unsigned char buffer[BUFFER_SIZE]; memset(buffer, 0, sizeof(char)); size_t numBytesDecrypted = 0; // IV 偏移量不需使用 CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding | kCCOptionECBMode, [key UTF8String], kCCKeySizeDES, nil, [cipherData bytes], [cipherData length], buffer, BUFFER_SIZE, &numBytesDecrypted); NSString* plainText = nil; if (cryptStatus == kCCSuccess) { NSData* data = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesDecrypted]; plainText = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; } return plainText; } +(NSString *) encryptUseDES:(NSString *)clearText key:(NSString *)key { NSData *data = [clearText dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]; unsigned char buffer[BUFFER_SIZE]; memset(buffer, 0, sizeof(char)); size_t numBytesEncrypted = 0; CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES, kCCOptionPKCS7Padding | kCCOptionECBMode, [key UTF8String], kCCKeySizeDES, nil, [data bytes], [data length], buffer, BUFFER_SIZE, &numBytesEncrypted); NSString* plainText = nil; if (cryptStatus == kCCSuccess) { NSData *dataTemp = [NSData dataWithBytes:buffer length:(NSUInteger)numBytesEncrypted]; plainText = [GTMBase64 stringByEncodingData:dataTemp]; }else{ NSLog(@"DES加密失败"); } return plainText; }
2.base64编码中+号在发送过程中替换为空格导致解密失败.解决方法:将+号替换为%2B
附:
1.RFC3986 中指定了以下字符为保留字符: ! * ' ( ) ; : @ & =+ $ , / ? % # [ ]
2.Base64是一种基于64个可打印字符来表示二进制数据的表示方法。由于2的6次方等于64,所以每6个位元为一个单元,对应某个可打印字符。三个字节有24个位元,对应于4个Base64单元,即3个字节需要用4个可打印字符来表示。它可用来作为电子邮件的传输编码。在Base64中的可打印字符包括字母A-Z、a-z、数字0-9,这样共有62个字符,此外两个可打印符号在不同的系统中而不同。一些如uuencode的其他编码方法,和之后binhex的版本使用不同的64字符集来代表6个二进制数字,但是它们不叫Base64。
Base64常用于在通常处理文本数据的场合,表示、传输、存储一些二进制数据。包括MIME的email,email via MIME,在XML中存储复杂数据.
使用时,在传输编码方式中指定base64。使用的字符包括大小写字母各26个,加上10个数字,和加号“+”,斜杠“/”,一共64个字符,等号“=”用来作为后缀用途。
所以在使用Base时可能需要对+/进行替换为UTF8的编码%2B %2F