AES 加密 中的PKCS5Padding、PKCS7Padding 和NO Padding的问题

本文介绍了一种AES128加密方法的具体实现过程,包括密钥和初始化向量的设置、填充方式的选择以及加密操作的执行。文章还对比了PKCS7Padding与PKCS5Padding的不同,并详细展示了如何通过C语言进行AES128加密。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    由于今天 帮别人解决AES加密 解密时遇到了这个问题,就把 心得写出来和大家分享一下

PKCS7Padding跟PKCS5Padding的区别就在于数据填充方式,PKCS7Padding是缺几个字节就补几个字节的0,而PKCS5Padding是缺几个字节就补充几个字节的几,好比缺6个字节,就补充6个字节的6 



+(NSString *)AES128Encrypt:(NSString *)plainText

{

    char keyPtr[kCCKeySizeAES128+1];

    memset(keyPtr, 0sizeof(keyPtr));

    [gkey getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    

    char ivPtr[kCCBlockSizeAES128+1];

    memset(ivPtr, 0sizeof(ivPtr));

    [gIv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];

    

    NSData* data = [plainText dataUsingEncoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data length];

    

    int diff = kCCKeySizeAES128 - (dataLength % kCCKeySizeAES128);

    int newSize = 0;

    

    if(diff > 0)

    {

        newSize = dataLength + diff;

    }

    

    char dataPtr[newSize];

    memcpy(dataPtr, [data bytes], [data length]);

    for(int i = 0; i < diff; i++)

    {

        dataPtr[i + dataLength] = 0x00;

    }

    

    size_t bufferSize = newSize + kCCBlockSizeAES128;

    void *buffer = malloc(bufferSize);

    memset(buffer, 0, bufferSize);

    

    size_t numBytesCrypted = 0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,

                                          kCCAlgorithmAES128,

                                          0x0001,               //No padding//

                                     //   0x0001                    这是PKCS7Padding

                                     //   0x0000                    这是 NO Padding

                                          keyPtr,

                                          kCCKeySizeAES128,

                                          ivPtr,

                                          dataPtr,

                                          sizeof(dataPtr),

                                          buffer,

                                          bufferSize,

                                          &numBytesCrypted);

    

    if (cryptStatus == kCCSuccess) {

        NSData *resultData = [NSData dataWithBytesNoCopy:buffer length:numBytesCrypted];

        return [GTMBase64 stringByEncodingData:resultData];

    }

    free(buffer);

    return nil;

}


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值