iOS加密方式(RSA签名加密、AES加密等)

之前项目中采取的加密方式,只是对于重要的参数进行AES加密,再将各个参数拼接而成,通过MD5签名后形成最后一个参数。目前,改用了RSA签名的方式进行加密。

AES加密

主要针对于些重要的参数进行加密,如账号、密码等,具体代码实现可下Demo查看

//AES加密
- (NSData *)AES128EncryptedDataWithKey:(NSString *)key iv:(NSString *)iv
{
    return [self AES128Operation:kCCEncrypt key:key iv:iv];
}
//AES解密
- (NSData *)AES128DecryptedDataWithKey:(NSString *)key iv:(NSString *)iv
{
    return [self AES128Operation:kCCDecrypt key:key iv:iv];
}

- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv
{
    char keyPtr[kCCKeySizeAES128 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    char ivPtr[kCCBlockSizeAES128 + 1];
    bzero(ivPtr, sizeof(ivPtr));
    if (iv) {
        [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    }

    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          ivPtr,
                                          [self bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);
    return nil;
}

DES加密

//des加密  
+ (NSData *)DESEncrypt:(NSData *)data WithKey:(NSString *)key  
{  
    char keyPtr[kCCKeySizeAES256+1];  
    bzero(keyPtr, sizeof(keyPtr));  

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  

    NSUInteger dataLength = [data length];  

    size_t bufferSize = dataLength + kCCBlockSizeAES128;  
    voidvoid *buffer = malloc(bufferSize);  

    size_t numBytesEncrypted = 0;  
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmDES,  
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,  
                                          keyPtr, kCCBlockSizeDES,  
                                          NULL,  
                                          [data bytes], dataLength,  
                                          buffer, bufferSize,  
                                          &numBytesEncrypted);  
    if (cryptStatus == kCCSuccess) {  
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];  
    }  

    free(buffer);  
    return nil;  
}  
//des解密  
+ (NSData *)DESDecrypt:(NSData *)data WithKey:(NSString *)key  
{  
    char keyPtr[kCCKeySizeAES256+1];  
    bzero(keyPtr, sizeof(keyPtr));  

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];  

    NSUInteger dataLength = [data length];  

    size_t bufferSize = dataLength + kCCBlockSizeAES128;  
    voidvoid *buffer = malloc(bufferSize);  

    size_t numBytesDecrypted = 0;  
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmDES,  
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,  
                                          keyPtr, kCCBlockSizeDES,  
                                          NULL,  
                                          [data bytes], dataLength,  
                                          buffer, bufferSize,  
                                          &numBytesDecrypted);  

    if (cryptStatus == kCCSuccess) {  
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];  
    }  

    free(buffer);  
    return nil;  
}  

MD5加密

MD5加密一般用于数据准确性检测,加密结果不可逆,一般用于不需要解密的地方.
iOS SDK自带有MD5加密的框架CommonCrypto,使用时导入即可。
可以根据需要选择16位、32位、64位的。

#import "CommonCrypto/CommonDigest.h"
+ (NSString *)md5HexDigest:(NSString*)input
{
    const char* str = [input UTF8String];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5(str, strlen(str), result);
    NSMutableString *ret = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH*2];//

    for(int i = 0; i<CC_MD5_DIGEST_LENGTH; i++) {
        [ret appendFormat:@"%02X",result[i]];
    }
    return ret;
}

RSA加密、解密和签名、验签

加密主要是做加密操作,防止信息泄露。
加签主要是为了防恶意攻击,防止别人模拟我们的客户端对我们的服务器进行攻击,避免服务器瘫痪。

公钥、私钥

公钥、私钥可以使用字符串的形式,也可以用文件的形式。
RSA加密:公钥放在客户端,并使用公钥对数据进行加密,服务端拿到数据后用私钥进行解密。
RSA加签:私钥放在客户端,并使用私钥对数据进行加签,服务端拿到数据后用公钥进行验签。

RSA加密、解密

RSA加密只需要导入Security.framework框架即可使用 这篇文章有详细的代码可参考,Demo中也有,使用起来比较简单。

这里使用的密钥文件是.der和.p12格式,与java不同

RSA加密文章

RSA签名、验签

签名和加密使用的是不同的方法,使用下面这个库可以实现RSA签名(这个库也可实现RSA加密解密的功能)
iOSRSAHandler

签名方式有两种:1.MD5+RSA 2.sha+RSA 本库中的sha加密使用的是sha1,我改成了sha256

其他

base64加密

主要用于隐藏明文,信息可以随意进行解密,iOS 也提供了Base64加密的api,使用非常简单。

凯撒加密

凯撒加密是一种简单的文字替换加密。例如将字符串中的前几位进行替换。 考虑到加密内容不只是英文字母。此处改进使用ASCII码偏移进行加密解密。

Demo下载

iOS加密Demo

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值