//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;
}