iOS-关于MD5加密,AES加密,RSA加签验签

来源:互联网 发布:win7怎么远程控制mac 编辑:程序博客网 时间:2024/05/20 07:14

//RSA加签
加密:公钥放在客户端,并使用公钥对数据进行加密,服务端拿到数据后用私钥进行解密;
加签:私钥放在客户端,并使用私钥对数据进行加签,服务端拿到数据后用公钥进行验签。

//RSA加签 plainStr为加密字段 privKey为私钥(用户保存)+ (NSString *)rsaSHA1SignStr:(NSString *)plainStr privateKey:(NSString *)privKey{    NSData *data = [plainStr dataUsingEncoding:NSUTF8StringEncoding];    NSData *signData = [self rsaSHA1SignData:data privateKey:privKey];    return [signData base64EncodedStringWithOptions:0];}
+ (NSData *)rsaSHA1SignData:(NSData *)plainData privateKey:(NSString *)privKey {    SecKeyRef key = [self addPrivateKey:privKey];    size_t signedHashBytesSize = SecKeyGetBlockSize(key);    uint8_t* signedHashBytes = malloc(signedHashBytesSize);    memset(signedHashBytes, 0x0, signedHashBytesSize);    //    bzero(signedHashBytes, signedHashBytesSize);    size_t hashBytesSize = CC_SHA1_DIGEST_LENGTH;    uint8_t* hashBytes = malloc(hashBytesSize);    if (!CC_SHA1([plainData bytes], (CC_LONG)[plainData length], hashBytes)) {        return nil;    }    SecKeyRawSign(key,                  kSecPaddingPKCS1SHA1,                  hashBytes,                  hashBytesSize,                  signedHashBytes,                  &signedHashBytesSize);    NSData* signedHash = [NSData dataWithBytes:signedHashBytes                                        length:(NSUInteger)signedHashBytesSize];    if (hashBytes)        free(hashBytes);    if (signedHashBytes)        free(signedHashBytes);    return signedHash;}
//RSA验签+ (BOOL)rsaSHA1VerifyStr:(NSString *)plainStr withSignature:(NSString *)signStr publicKey:(NSString *)pubKey{    NSData *data = [plainStr dataUsingEncoding:NSUTF8StringEncoding];    NSData *signData = [[NSData alloc] initWithBase64EncodedString:signStr options:0];    return [self rsaSHA1VerifyData:data withSignature:signData publicKey:pubKey];}+ (BOOL)rsaSHA1VerifyData:(NSData *)plainData withSignature:(NSData *)signature publicKey:(NSString *)pubKey {    SecKeyRef key = [self addPublicKey:pubKey];    size_t signedHashBytesSize = SecKeyGetBlockSize(key);    const void* signedHashBytes = [signature bytes];    size_t hashBytesSize = CC_SHA1_DIGEST_LENGTH;    uint8_t* hashBytes = malloc(hashBytesSize);    if (!CC_SHA1([plainData bytes], (CC_LONG)[plainData length], hashBytes)) {        return NO;    }    OSStatus status = SecKeyRawVerify(key,                                      kSecPaddingPKCS1SHA1,                                      hashBytes,                                      hashBytesSize,                                      signedHashBytes,                                      signedHashBytesSize);    return status == errSecSuccess;}

AES加密解密

//加密 key为密钥-(NSString *) aes256_encrypt:(NSString *)key{    const char *cstr = [self cStringUsingEncoding:NSUTF8StringEncoding];    NSData *data = [NSData dataWithBytes:cstr length:self.length];    //对数据进行加密    NSData *result = [data AES256EncryptWithKey:key];    //转换为2进制字符串    if (result && result.length > 0) {        Byte *datas = (Byte*)[result bytes];        NSMutableString *output = [NSMutableString stringWithCapacity:result.length * 2];        for(int i = 0; i < result.length; i++){            [output appendFormat:@"%02x", datas[i]];        }        return output;    }    return nil;}//解密-(NSString *) aes256_decrypt:(NSString *)key{       //转换为2进制Data    NSMutableData *data = [NSMutableData dataWithCapacity:self.length / 2];    unsigned char whole_byte;    char byte_chars[3] = {'\0','\0','\0'};    int i;    for (i=0; i < [self length] / 2; i++) {        byte_chars[0] = [self characterAtIndex:i*2];        byte_chars[1] = [self characterAtIndex:i*2+1];        whole_byte = strtol(byte_chars, NULL, 16);        [data appendBytes:&whole_byte length:1];    }    //对数据进行解密    NSData* result = [data AES256DecryptWithKey:key];    if (result && result.length > 0) {        return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];    }    return nil;}

MD5加密

#pragma mark - 32位 小写- (NSString *)MD5ForLower32Bate{    //要进行UTF8的转码    const char* input = [self UTF8String];    unsigned char result[CC_MD5_DIGEST_LENGTH];    CC_MD5(input, (CC_LONG)strlen(input), result);    NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {        [digest appendFormat:@"%02x", result[i]];    }    return digest;}#pragma mark - 32位 大写- (NSString *)MD5ForUpper32Bate{    //要进行UTF8的转码    const char* input = [self UTF8String];    unsigned char result[CC_MD5_DIGEST_LENGTH];    CC_MD5(input, (CC_LONG)strlen(input), result);    NSMutableString *digest = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];    for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {        [digest appendFormat:@"%02X", result[i]];    }    return digest;}#pragma mark - 16位 大写- (NSString *)MD5ForUpper16Bate{    NSString *md5Str = [self MD5ForUpper32Bate];    NSString  *string;    for (int i=0; i<24; i++) {        string=[md5Str substringWithRange:NSMakeRange(8, 16)];    }    return string;}#pragma mark - 16位 小写- (NSString *)MD5ForLower16Bate{    NSString *md5Str = [self MD5ForLower32Bate];    NSString  *string;    for (int i=0; i<24; i++) {        string=[md5Str substringWithRange:NSMakeRange(8, 16)];    }    return string;}
阅读全文
0 0
原创粉丝点击