iOS 암호 화 복호화: AES, DES, 3DES, BLOWFISH (다양한 패턴 과 알고리즘 설명 포함)

4332 단어
(코드 를 업데이트 하고 padding 파 라미 터 를 삭제 하 며 IV 검 사 를 수 정 했 습 니 다)
글 에서 서로 다른 암호 화 모드 에서 매개 변수의 제한 조건 을 소 개 했 고 소스 코드 에 도 조건 판단 을 포함 하여 CommonCrypto 의 사용 을 이해 하도록 도와 주 었 다.
이 복호화 도 구 는 다음 을 포함 합 니 다:
NSData 의 AES, DES, 3DES, BLOWFISH 암호 화 복호화 방법.
NSData 와 NSString 의 MD5, SHA 1, SHA 2 에 대한 계산
주로 CommonCrypto 라 이브 러 리 에 의존 합 니 다. 이 도 구 는 모든 암호 화 방법 (예 를 들 어 RC4, RC2, CAST) 을 포함 하지 않 습 니 다.
BuffKit 소스 코드 및 데모 주소:
https://github.com/FlashHand/BuffKit/tree/master/BuffKit/CryptoBuff
https://github.com/FlashHand/BuffKit
Blowfish 의 복호화 예:
NSString *sourceStr=@"12345678901234561";
NSData *source=[sourceStr dataUsingEncoding:NSUTF8StringEncoding];
[source bfCryptoBlowfishEncodeWithMode:BuffCryptoModeCFB8 iv:@"1234567812345678" key:@"1234567812345678" completion:^(NSData *cryptoData) {    
[cryptoData bfCryptoBlowfishDecodeWithMode:BuffCryptoModeCFB8 iv:@"1234567812345678" key:@"1234567812345678" completion:^(NSData *cryptoData2) {        
NSString *result = [[NSString alloc] initWithData: cryptoData2 encoding: NSUTF8StringEncoding];        
NSLog(@"%@",result);    
}];


위 에는 encode 와 decode 과정 이 포함 되 어 있 습 니 다.인쇄 결과: 123456789012345561
파라미터 상세 설명:
BuffCryptoMode 는 암호 화 모드 입 니 다. 지원 하 는 암호 화 모드 는
typedef NS_ENUM(NSInteger, BuffCryptoMode) {
    BuffCryptoModeECB       = 1,//kCCModeECB
    BuffCryptoModeCBC       = 2,//kCCModeCBC
    BuffCryptoModeCFB       = 3,//kCCModeCFB
    BuffCryptoModeCTR       = 4,//kCCModeCTR
    BuffCryptoModeOFB       = 7,//kCCModeOFB
    BuffCryptoModeCFB8      = 10,//kCCModeCFB8
};

안전성 이 떨 어 지기 때문에 ECB 를 추천 하지 않 습 니 다.다음 그림 은 하나의 비트 맵 을 AES - ECB 암호 화하 면 원본 그림 의 일부 특징 을 보존 할 수 있 음 을 보 여 준다.
ws
iv 초기 화 오프셋 (initialization vector) ECB 에서 작성 하면 무시 되 며, iv 의 length 는 AES 암호 화 시 16 이 어야 합 니 다. 그렇지 않 으 면 8 입 니 다. iv 의 size 는 cypher block size 와 일치 해 야 합 니 다. iv 공식 설명:
/*
        iv              Initialization vector, optional. Used for 
                                Cipher Block Chaining (CBC) mode. If present, 
                                must be the same length as the selected 
                                algorithm's block size. If CBC mode is
                                selected (by the absence of any mode bits in 
                                the options flags) and no IV is present, a 
                                NULL (all zeroes) IV will be used. This is 
                                ignored if ECB mode is used or if a stream 
                                cipher algorithm is selected. 
*/
/*!
    @enum           Block sizes
    
    @discussion     Block sizes, in bytes, for supported algorithms. 
    
    @constant kCCBlockSizeAES128    AES block size (currently, only 128-bit 
                                    blocks are supported).
    @constant kCCBlockSizeDES       DES block size.
    @constant kCCBlockSize3DES      Triple DES block size.
    @constant kCCBlockSizeCAST      CAST block size.
*/
enum {
    /* AES */
    kCCBlockSizeAES128        = 16,
    /* DES */
    kCCBlockSizeDES           = 8,
    /* 3DES */
    kCCBlockSize3DES          = 8,
    /* CAST */
    kCCBlockSizeCAST          = 8,
    kCCBlockSizeRC2           = 8,
    kCCBlockSizeBlowfish      = 8,
};


key 는 키 입 니 다. AES 암호 화 시 key 의 길 이 는 16, 24, 32 중 하나 여야 합 니 다.
DES 암호 화 시 8, 3DES 암호 화 시 24,
blowfish 암호 화 시 키 의 길 이 는 정수 구간 [8, 56] 중 하나 일 수 있 습 니 다.
암호 화 과정 은 GLOBALQUEUE 에서 실 행 된 completion block 은 비동기 반전 입 니 다.
block 에서 NSData 클래스 의 인자 cryptoData 를 전송 합 니 다. 암호 화 또는 복호화 에 실 패 했 을 때 cryptoData = nil.
padding 에 관 한 주의: ECB 나 CBC 의 경우 원본 길이 가 key. length 에 의 해 정 리 될 수 없 을 때 원래 내용 을 추가 (padding) 합 니 다. 기본적으로 PKCS7Padding 을 사용 합 니 다. 그렇지 않 으 면 암호 화가 실패 합 니 다. 추가 방법 은 다음 과 같 습 니 다.
while (sourceM.length % key.length != 0) {   
int pad = 0x07;    
NSData *padData = [[NSData alloc] initWithBytes:&pad length:1];    
[sourceM appendData:padData];
}

CFB, CTR, OFB, CFB 8 에 서 는 padding 이 필요 없습니다. 비밀문서 와 원문 크기 가 같 기 때문에 구체 적 으로 참고 할 수 있 습 니 다.http://www.di-mgt.com.au/cryptopad.html
사용자 정의 실현 이나 실현 방식 을 알 아야 한다 면 소스 코드 를 볼 수 있 습 니 다.
https://github.com/FlashHand/BuffKit
질문 이 있 으 시 면 메 시 지 를 통 해:)

좋은 웹페이지 즐겨찾기