iOS加密方式(RSA簽名、加密、AES)

之前項(xiàng)目中采取的加密方式,只是對(duì)于重要的參數(shù)進(jìn)行AES加密,再將各個(gè)參數(shù)拼接而成,通過MD5簽名后形成最后一個(gè)參數(shù)。目前,改用了RSA加密簽名的方式進(jìn)行加密,總結(jié)了下iOS中常用的加密方式。

AES加密

主要針對(duì)于些重要的參數(shù)進(jìn)行加密,如賬號(hào)、密碼等,具體代碼實(shí)現(xiàn)可下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加密一般用于數(shù)據(jù)準(zhǔn)確性檢測(cè),加密結(jié)果不可逆,一般用于不需要解密的地方.
iOS SDK自帶有MD5加密的框架CommonCrypto,使用時(shí)導(dǎo)入即可。
可以根據(jù)需要選擇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加密、解密和簽名、驗(yàn)簽

加密主要是做加密操作,防止信息泄露。
加簽主要是為了防惡意攻擊,防止別人模擬我們的客戶端對(duì)我們的服務(wù)器進(jìn)行攻擊,避免服務(wù)器癱瘓。

公鑰、私鑰

公鑰、私鑰可以使用字符串的形式,也可以用文件的形式。
RSA加密:公鑰放在客戶端,并使用公鑰對(duì)數(shù)據(jù)進(jìn)行加密,服務(wù)端拿到數(shù)據(jù)后用私鑰進(jìn)行解密。
RSA加簽:私鑰放在客戶端,并使用私鑰對(duì)數(shù)據(jù)進(jìn)行加簽,服務(wù)端拿到數(shù)據(jù)后用公鑰進(jìn)行驗(yàn)簽。

RSA加密、解密

RSA加密只需要導(dǎo)入Security.framework框架即可使用 這篇文章有詳細(xì)的代碼可參考,Demo中也有,使用起來比較簡(jiǎn)單。

這里使用的密鑰文件是.der和.p12格式,與java不同

RSA加密文章

RSA簽名、驗(yàn)簽

簽名和加密使用的是不同的方法,使用下面這個(gè)庫可以實(shí)現(xiàn)RSA簽名(這個(gè)庫也可實(shí)現(xiàn)RSA加密解密的功能)
iOSRSAHandler

簽名方式有兩種:1.MD5+RSA 2.sha+RSA 本庫中的sha加密使用的是sha1,我改成了sha256

其他

base64加密

主要用于隱藏明文,信息可以隨意進(jìn)行解密,iOS 也提供了Base64加密的api,使用非常簡(jiǎn)單。

凱撒加密

凱撒加密是一種簡(jiǎn)單的文字替換加密。例如將字符串中的前幾位進(jìn)行替換。 考慮到加密內(nèi)容不只是英文字母。此處改進(jìn)使用ASCII碼偏移進(jìn)行加密解密。

Demo下載

iOS加密Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容