美文网首页
iOS 在OC 中使用 AEC 的 ECB、CTR模式加解密

iOS 在OC 中使用 AEC 的 ECB、CTR模式加解密

作者: 我是七月 | 来源:发表于2024-12-18 14:34 被阅读0次

调整加解密,修改参数 operation :kCCDecrypt / kCCEncrypt

AEC CTR模式解密

#import <CommonCrypto/CommonCrypto.h>
#import <CommonCrypto/CommonKeyDerivation.h>
#import <Security/Security.h>
+ (NSData *) AESCTRDecryptData:(NSData *)data withKey:(NSData *)key withiv:(NSData *)iv
{
    // Init cryptor
    CCCryptorRef cryptor = NULL;
    
    // Create Cryptor
    CCCryptorStatus createDecrypt = CCCryptorCreateWithMode(kCCDecrypt, // operation
                                                            kCCModeCTR, // mode CTR
                                                            kCCAlgorithmAES, // Algorithm
                                                            ccPKCS7Padding, // padding
                                                            iv.bytes, // can be NULL, because null is full of zeros
                                                            key.bytes, // key
                                                            key.length, // keylength
                                                            NULL, //const void *tweak
                                                            0, //size_t tweakLength,
                                                            0, //int numRounds,
                                                            kCCModeOptionCTR_BE, //CCModeOptions options,
                                                            &cryptor); //CCCryptorRef *cryptorRef
    
    
    if (createDecrypt == kCCSuccess)
    {
        // Alloc Data Out
        NSMutableData *cipherDataDecrypt = [NSMutableData dataWithLength:data.length + kCCBlockSizeAES128];
        
        //alloc number of bytes written to data Out
        size_t outLengthDecrypt;
        
        //Update Cryptor
        CCCryptorStatus updateDecrypt = CCCryptorUpdate(cryptor,
                                                        data.bytes, //const void *dataIn,
                                                        data.length,  //size_t dataInLength,
                                                        cipherDataDecrypt.mutableBytes, //void *dataOut,
                                                        cipherDataDecrypt.length, // size_t dataOutAvailable,
                                                        &outLengthDecrypt); // size_t *dataOutMoved)
        
        if (updateDecrypt == kCCSuccess)
        {
            //Cut Data Out with nedded length
            cipherDataDecrypt.length = outLengthDecrypt;
            
            // Data to String
//            NSString* cipherFinalDecrypt = [[NSString alloc] initWithData:cipherDataDecrypt encoding:NSUTF8StringEncoding];
            
            //Final Cryptor
            CCCryptorStatus final = CCCryptorFinal(cryptor, //CCCryptorRef cryptorRef,
                                                   cipherDataDecrypt.mutableBytes, //void *dataOut,
                                                   cipherDataDecrypt.length, // size_t dataOutAvailable,
                                                   &outLengthDecrypt); // size_t *dataOutMoved)
            
            if (final == kCCSuccess)
            {
                //Release Cryptor
                //CCCryptorStatus release =
                CCCryptorRelease(cryptor); //CCCryptorRef cryptorRef
            }
            
            return cipherDataDecrypt;
        }
    }
    else
    {
        //error
        NSLog(@"AESCTRDecryptData is error");
    }
    
    return nil;
}

AEC ECB模式解密

//加密算法

#import <CommonCrypto/CommonDigest.h>

#import <CommonCrypto/CommonCryptor.h>
/**
 加密:先采用AES/ECB/PKCS5Padding,再采用base64-url-safe 编码
 */
+ (NSString *)encryptAES128WithContent:(NSString *)content key:(NSString *)key{

    NSData *contentData = [content dataUsingEncoding:NSUTF8StringEncoding];
    NSUInteger dataLength = contentData.length;

    // 为结束符'\0' +1
    char keyPtr[kCCKeySizeAES128+1];
    memset(keyPtr,0,sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    // 密文长度 <= 明文长度 + BlockSize
    size_t encryptSize = dataLength + kCCBlockSizeAES128;

    void * encryptedBytes = malloc(encryptSize);

    size_t actualOutSize = 0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding|kCCOptionECBMode, //CBC -> PKCS7Padding,ECB -> kCCOptionPKCS7Padding|kCCOptionECBMode
                                          keyPtr,
                                          kCCKeySizeAES128,
                                          NULL,
                                          contentData.bytes,
                                          dataLength,
                                          encryptedBytes,
                                          encryptSize,
                                          &actualOutSize);

    if(cryptStatus ==kCCSuccess) {
        
        NSData*data = [NSData dataWithBytesNoCopy:encryptedBytes length:actualOutSize];
        
        NSString *base64Str = [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
        NSMutableString *mutBase64Str = [NSMutableString stringWithString:base64Str];
        
        mutBase64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"+" withString:@"-"];
        mutBase64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
        mutBase64Str = (NSMutableString * )[base64Str stringByReplacingOccurrencesOfString:@"=" withString:@""];
        return mutBase64Str;
    }
    free(encryptedBytes);
    return nil;
}

相关文章

网友评论

      本文标题:iOS 在OC 中使用 AEC 的 ECB、CTR模式加解密

      本文链接:https://www.haomeiwen.com/subject/uwarejtx.html