iOS 개발 복호화 알고리즘 - 기초 편 (2)

4716 단어
기초 편 (1) 을 이 어 AES 를 말씀 드 리 겠 습 니 다.
1. AES 암호 화 알고리즘
1. 도 모 는 고급 암호 화 기준 (영어: Advanced Encryption Standard, 줄 임 말: AES) 은 암호학 에서 Rijndael 암호 화 법 이 라 고도 부 르 는데 미국 연방정부 가 사용 하 는 블록 암호 화 기준 이다.이 기준 은 기 존의 DES 를 대체 하 는 데 사용 되 었 으 며, 이미 다방면으로 분석 되 어 전 세계 적 으로 널리 사용 되 고 있다.5 년 간 의 선별 절 차 를 거 쳐 고급 암호 화 기준 은 미국 국가 표준 기술 연구원 (NIST) 이 2001 년 11 월 26 일 FIPS PUB 197 에 발 표 했 고 2002 년 5 월 26 일 에 유효한 기준 이 되 었 다.2006 년 에 고급 암호 화 기준 은 대칭 키 암호 화 에서 가장 유행 하 는 알고리즘 중 하나 가 되 었 다.구체 적 인 암호 화 원 리 는 자세히 따 지지 않 고 응용 층 에서 직접 말한다.암호 화 복호화 원리 에 관심 이 있 으 시 면 참고 하 시기 바 랍 니 다.http://www.mamicode.com/info-detail-514466.html
2. 응용 장면
1. AES 는 대칭 암호 화 알고리즘 으로 단일 키 암호 화 시스템 의 암호 화 방법 을 사용 하 는데 같은 키 는 정보의 암호 화 와 복호화 로 동시에 사용 할 수 있 는데 이런 암호 화 방법 을 대칭 암호 화 라 고 한다.장점 은 알고리즘 이 공개 되 고 계 산 량 이 적 으 며 암호 화 속도 가 빠 르 고 암호 화 효율 이 높다 는 것 이다.단점 은 데이터 전송 전에 발송 자 와 수신 자 는 반드시 비밀 키 를 협의 하여 쌍방 이 비밀 키 를 잘 저장 할 수 있 도록 해 야 한 다 는 것 이다.그 다음 에 한 측의 비밀 키 가 누설 되면 암호 화 정보 도 안전 하지 않다.또한 사용자 가 대칭 암호 화 알고리즘 을 사용 할 때마다 다른 사람 이 모 르 는 유일한 비밀 키 를 사용 해 야 하기 때문에 쌍방 이 가지 고 있 는 열 쇠 를 받 거나 보 내 는 수량 이 많 고 키 관 리 는 쌍방의 부담 이 될 수 있 습 니 다.2. 일반적인 응용 프로그램 은 Base 64 와 함께 긴 텍스트 를 암호 화하 거나 문자열 을 암호 화 하 는 것 입 니 다. 데이터 와 텍스트 가 전송 과정 에서 다른 사람 에 게 차단 되 지 않 고 명문 으로 볼 수 있 도록 보장 합 니 다. 우리 프로젝트 의 응용 프로그램 은 모든 텍스트 파일 을 암호 화하 여 다른 사람 이 우리 가 존재 하 는 로 컬 파일 을 직접 가 져 오 면 바로 볼 수 있 도록 하 는 것 입 니 다.
3. 알고리즘
1. 보통 AES 는 128 비트 또는 256 비트 암호 화 알고리즘 을 사용 하 는데 비밀 키 문자 의 숫자 는 하 나 는 16 비트 이 고 하 나 는 32 비트 이다.우리 가 채택 한 것 은 256 이다.2. 암호 화 알고리즘:
- (NSData *)AES256EncryptWithKey:(NSString *)key 
{//  
    char keyPtr[kCCKeySizeAES256 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + 100;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES,
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL,
                                          [self bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) 
    {
       return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);
    return nil;
}
//           16    
- (NSString *)AES256EncryptWithKeyString:(NSString *)key
{
//    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
    NSData *decry = [self AES256EncryptWithKey:key];
    NSString *descryStr = [[NSString alloc] initWithData:decry encoding:NSUTF8StringEncoding];
    return descryStr;
}

3. 복호화 알고리즘
- (NSData *)AES256DecryptWithKey:(NSString *)key   //  
{
    char keyPtr[kCCKeySizeAES256 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    BOOL suc = [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    if (!suc) return [NSData data];
    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + 100;
    void *buffer = malloc(bufferSize);
//    size_t numBytesEncrypted = 0;
 //  ,   ,    32  
//    const void *keyPtr2 = [key bytes];
//    char (*keyPtr)[32] = keyPtr2;
//    
//    //       ,                       
//    //                
//    NSUInteger dataLength = [self length];
//    size_t bufferSize = dataLength + 32;
//    void *buffer = malloc(bufferSize);
//    
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES,
                                          kCCOptionPKCS7Padding/*         PKCS7Padding   */ | kCCOptionECBMode,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL,/*      (  ) */
                                          [self bytes], dataLength,/*    */
                                          buffer, bufferSize,/*    */
                                          &numBytesDecrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }
    free(buffer);
    return nil;
}
//             
- (NSString *)AES256DecryptWithKeyString:(NSString *)key
{
    if(self){
    NSData *decry = [self AES256DecryptWithKey:key];
    NSString *descryStr = [[NSString alloc] initWithData:decry encoding:NSUTF8StringEncoding];
    return descryStr;
    }
    else{
        return @"";
    }
}

실제 사용 중 호출 방법 을 사용 하면 된다.데모 주소

좋은 웹페이지 즐겨찾기