sm4加密 解密(oc)

前几天项目用到sm4加密解密,加密为十六进制字符串,再将十六进制字符串解密。网上百度了下,sm4是密钥长度和加密明文加密密文都为16个字节十六进制数据,网上的sm4 c语言算法很容易搜到,笔者刚开始没怎么理解,以为只能对16字节数据进行加密,并且不论是多少字节的数据加密出来都是16字节的。后来看了下源码,应该是加密的数据应该是16字节或者16的整数倍个字节的数据,若不够16倍数字节应该补0x00数据,最后加密出来的数据和输入数据的长度应该一致,即

密文长度=明文长度 

而且密钥长度一致,是16字节的。c的代码里面输入输出都是十六进制数据,需要将字符串转为char类型数组,并且保证长度是16整数倍

+(unsigned char*)hexEnc:(NSString*)strInput{
    NSData* data = [strInput dataUsingEncoding:NSUTF8StringEncoding];
    NSUInteger length = data.length;
    NSUInteger plusLength;
    if(length % 16 == 0){
        plusLength = 0;
    }
    else{
        plusLength = 16 - length % 16;
    }
    NSMutableString* new_str = [[NSMutableString alloc] initWithString:strInput];
    for (int i =0;i < plusLength;i++) {
        [new_str appendString:@" "];
    }
    NSUInteger new_length = length+plusLength;
    Uchar *input = (Uchar*)malloc(sizeof(Uchar)*new_length);
    Uchar *output = (Uchar*)malloc(sizeof(Uchar)*new_length);
    Uchar key[16] = KEY;
    const char *utfChar = [new_str UTF8String];
    memset(input, 0, new_length);
    memcpy(input, utfChar, new_length);
    
    sm4_context ctx;
    unsigned long i;

    sm4_setkey_enc(&ctx,key);
    sm4_crypt_ecb(&ctx,1,new_length,input,output);
    
    for(i=0;i

  

解密时密文是十六进制字符串,需要将字符串先转为int类型数组,再作解密操作,具体代码  

+(unsigned char*)hexDec:(NSString*)strInput{
    int inputCharSize = strInput.length/2;
    Uchar* input = (Uchar*)malloc(sizeof(Uchar)*inputCharSize);
    Uchar* output = (Uchar*)malloc(sizeof(Uchar)*inputCharSize);
    for (int i = 0; i

  

demo地址:https://github.com/dinner/sm4

  

转载于:https://www.cnblogs.com/symen/p/6085486.html

你可能感兴趣的:(sm4加密 解密(oc))