RC4加密

来源:互联网 发布:公司数据库 编辑:程序博客网 时间:2024/05/17 03:30
  • (NSString )md5:(NSString )str
    {
    const char *concat_str = [str UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(concat_str, strlen(concat_str), result);
    NSMutableString *hash = [NSMutableString string];
    for (int i = 0; i < 16; i++)
    [hash appendFormat:@”%02X”, result[i]];
    return [hash lowercaseString];
    }

// param: 要加密的字符串
// operation: 传入@”ENCODE” 为加密,解密没有写,所以只要不传”DECODE”就OK了
// expiry: 有效时间,单位是秒,默认时0,就是没有时效,如果设置后超出有效时间,将无法被解密
+ (NSString )encryption:(NSString )param operation:(NSString *)operation expiry:(int)expiry
{
NSString *key = @”user_sercretkey”; // 加密的密钥
NSString *DECODE = @”DECODE”;
operation = operation ? operation : DECODE;
expiry = expiry ? expiry : 0;
int keyLength = 4;
key = [self md5:key];
NSString *keya = [self md5:[key substringToIndex:16]];//
NSString *keyb = [self md5:[key substringFromIndex:16]];//
NSString *keyc = @”a”;//
NSString *cryptkey = STRING_SPLICE(keya, [self md5:STRING_SPLICE(keya, keyc)]);
keyLength = cryptkey.length;
param = [NSString stringWithFormat:@”%@%@%@”,([NSString stringWithFormat:@”%010d”,expiry ? expiry + (int)[[NSDate dateWithTimeIntervalSinceNow:0] timeIntervalSince1970] : expiry]),[[self md5: STRING_SPLICE(param,keyb)] substringToIndex:16],param];
int paramLength = param.length;
NSString *result = @”“;
NSMutableArray *box = [NSMutableArray arrayWithCapacity:UnicodeCount];
for (int i = 0; i <= UnicodeCount; i++) {
[box addObject:@(i)];
}
NSMutableArray *rndkey = [NSMutableArray array];
for (int i = 0; i <= UnicodeCount; i++) {
const char rndkeyItem = [cryptkey characterAtIndex:i % keyLength];
NSString *asciiStr = [NSString stringWithCString:&rndkeyItem encoding:NSASCIIStringEncoding];
int asciiCode = [asciiStr characterAtIndex:0];
[rndkey addObject:@(asciiCode)];
}
for (int i=0,j = 0; i <= UnicodeCount; i++) {
j = (j + [box[i] intValue] + [rndkey[i] intValue]) % (UnicodeCount + 1);
int tmp = [box[i] intValue];
box[i] = box[j];
box[j] = @(tmp);
}

for (int a = 0,j = 0,i = 0; i < paramLength; i ++) {    a = (a + 1) % (UnicodeCount + 1);    j = (j + [box[a] intValue]) % (UnicodeCount + 1);    int tmp = [box[a] intValue];    box[a] = box[j];    box[j] = @(tmp);    int s1 = [self ord:param index:i];    int s2 = [box[([box[a] intValue] + [box[j] intValue]) % (UnicodeCount + 1)] intValue];    int s3 = s1 ^ s2;    NSString *add = [self strChr:s3];    result = STRING_SPLICE(result, add);}return [NSString stringWithFormat:@"%@%@",keyc,[[self base64:result] stringByReplacingOccurrencesOfString:@"=" withString:@""]];

}
+ (NSString *)microtime // 计算时间串
{
NSDate *currentDate = [NSDate dateWithTimeIntervalSinceNow:0];
NSTimeInterval interval = [currentDate timeIntervalSince1970];
NSString *intervalStr = [NSString stringWithFormat:@”%f00”,interval];
NSString *pre = [intervalStr substringWithRange:NSMakeRange(intervalStr.length - 8, 8)];
NSString *suf = [intervalStr substringToIndex:intervalStr.length - 9];
NSString *result = [NSString stringWithFormat:@”0.%@ %@”,pre,suf];
return result;
}
+ (int)ord:(NSString *)str index:(int)index // 获取字符串某一位的ASCII码
{
int asciiCode = [str characterAtIndex:index];
return asciiCode;
}
+ (const char)chr:(int)asciiCode // 通过ASCII码获取字符
{
return [[NSString stringWithFormat:@”%C”,(unichar)asciiCode] characterAtIndex:0];
}
+ (NSString *)strChr:(int)asciiCode // 通过ASCII码获取字符串
{
NSString *data = [NSString stringWithFormat:@”%C”,(unichar)asciiCode]; //A
return data;
}
+ (NSString )base64:(NSString )str // base64编码
{
NSStringEncoding enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingISOLatin1);
NSString *base64EncodedString = [[str dataUsingEncoding:enc] base64EncodedStringWithOptions:0];
return base64EncodedString;
}
备注:
导入:CommonCrypto/CommonDigest.h
宏定义:字符串拼接
define STRING_SPLICE(a,b) ([NSString stringWithFormat:@”%@%@”,(NSString )(a),(NSString )(b)])
字节数
define UnicodeCount 255