iOS常用暗号化要約アルゴリズム

5377 ワード

最近、いくつかの暗号化と要約アルゴリズムを調査する必要があり、いくつかの時間を費やし、古い運転手のコードも見て、きれいではないと思って、今整理して送ってください.
以下のアルゴリズムは、アンドロイドAES-CBC-5Paddingを含むアンドロイド上の同類のアルゴリズムと相互接続可能であることを親和的に測定する.
AES暗号化
128ビットAES-CBC-7Paddingの復号化を例に説明します.
ネット上の多くの例は似ていますが、入力が混乱していて、バイトコードの最後の'\0'も混乱していて、少し修正して、NSDataを出入りパラメータのタイプにして、どうせ頭がなくてもいいです!
暗号化セクション
- (NSData *)aes128_encrypt:(NSData *)key iv:(NSData *)gIv   {
    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesCrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          [key bytes],
                                          kCCKeySizeAES128,
                                          [gIv bytes],
                                          [self bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesCrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
    }
    free(buffer);
    return nil;
}

復号部
暗号化された部分とは一字の差しかなく、アルゴリズムの最初のパラメータはkCCDecryptである.他の毛は同じです.
-(NSData *) aes128_decrypt:(NSData *)key iv:(NSData *)gIv{
    NSUInteger dataLength = [self length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesCrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          [key bytes],
                                          kCCKeySizeAES128,
                                          [gIv bytes],
                                          [self bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesCrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];
    }
    free(buffer);
    return nil;
}

AES 256ビット
128ビットの復号化も一毛のように、一字の差しかなく、アルゴリズムの5番目のパラメータはkCCKeySizeAES256でよい.
なお、256ビットのKEYの長さは256ビットである必要があり、IVは128ビットである必要がある.
ここからも分かるように、実はこれは128位をベースにしたものです.
PBKDF2
PBKDF 2規格でKEYが生成され、その結果、hashKeyData(20バイト)の長さとなる.
塩の桁数はKEYより長ければいいと思いますが、私はここに4人追加しましたので、勝手にすればいいです(不適切があれば、ベテランの運転手さんに指摘してください).
    - (void)generatePBKDF2Key{
    //  
    NSData *passwordData = [@"Hello, world!" dataUsingEncoding:NSUTF8StringEncoding];
    // 
    const char salt[CC_SHA1_DIGEST_LENGTH + 4] = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
        21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
        31, 32, 33, 34};
    NSData *saltData = [[NSData alloc]initWithBytes:salt length:32];
    //  KEY
    NSMutableData *hashKeyData = [NSMutableData dataWithLength:CC_SHA1_DIGEST_LENGTH];
    // PBKDF2    
    CCKeyDerivationPBKDF(kCCPBKDF2, passwordData.bytes, passwordData.length, saltData.bytes, saltData.length, kCCPRFHmacAlgSHA1, 100000, hashKeyData.mutableBytes, hashKeyData.length);
}

SHA1
SHA 1ダイジェスト、何も言うことはないようです.
- (NSString*) sha1{
    NSString *text = @"Hello, world!";
    NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];
    uint8_t digest[CC_SHA1_DIGEST_LENGTH];
    CC_SHA1(data.bytes, (unsigned int)data.length, digest);
    NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
    for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
        [output appendFormat:@"%02x", digest[i]];
    return output;
}

HMAC SHA1
base 64処理は前から完了しており、後半は削除する必要はありません.
- (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret {
    NSData *secretData = [secret dataUsingEncoding:NSUTF8StringEncoding];
    NSData *clearTextData = [text dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char result[20];
    CCHmac(kCCHmacAlgSHA1, [secretData bytes], [secretData length], [clearTextData bytes], [clearTextData length], result);
    NSData *rawData = [[NSData alloc]initWithBytes:result length:20];
    
    //base64   
    NSData *theData = [GTMBase64 encodeBytes:result length:20];
    NSString *base64EncodedResult = [[NSString alloc] initWithData:theData encoding:NSASCIIStringEncoding];
    return base64EncodedResult;
}

BASE64 Encode
アパッチのCC_SHA1_DIGEST_LENGTHライブラリを導入して符号化し,Easyを呼び出す.
- (void)base64Encode{
    const char data[16] = {68, 104, 17, 17, -61, 120, -11, -112, 12, -69, 14, -28, 103, -82, 29, -44};
    NSData *result = [GTMBase64 encodeBytes:data length:16];
}

Salt and IV
一定のランダム性を保証する必要があり,アップルが提供した方法でランダム結果を行い,IVを例にsalt同理である.
    unsigned char iv[16];
    int result = SecRandomCopyBytes(kSecRandomDefault, 16, iv);