iOS版使用说明

1.概述

本文主要介绍iOS版本的安全密钥白盒如何使用,阅读者需要一定的iOS的开发经验,否则可能存在一定的疑问

2.拷贝Lib文件

2.1 在Xcode中打开项目,右键项目后选择Add Files to “testDemo”[测试项目],打开添加Lib文件的选择框,如下图:

2-1

2.2 根据项目实际情况,选择使用arm64或armv7架构,另外includes和libKiwiWBSDK.a是必须包含的,点击Add即可添加,如下图:

2-2

3.API函数说明

调用SDK提供的加密、解密算法,无需提供密钥key信息,无需担心密钥泄露问题,函数头文件主要代码如下

/***
 * 加/解密接口
 * 参数为pCrypt结构体(pCrypt结构详见定义),返回加密/解密以后封装的std:string结果
 * @param pCrypt
 * @return  返回true,加密成功,返回false 加密失败
 */
bool operator_entrace_char(struct KIWI_Crypt *pCrypt);

/**
 * 字符md5值计算
 * @param in_buf 待计算md5字符
 * @param digest md5字符结果
 */
void encrypt_md5(const char *in_buf, char digest[16]);

/**
 * 根据选定的inner_protocol,计算message的hash值
 * @param message   待计算字符
 * @param len    字符长度
 * @param digest    hash值
 * @param inner_protocol    加密类型,详见inner_protocol
 */
int encrypt_sha2(const unsigned char *message, unsigned int len,
                  unsigned char *digest,int inner_protocol);
/**
 * 哈希运算消息认证码 以一个密钥和一个消息为输入,生成一个消息摘要作为输出
 * @param key   密钥
 * @param key_size 密钥长度
 * @param message   消息内容
 * @param message_len   消息长度
 * @param mac   摘要(长度=inner_protocol/8 例:sha224: 224/8)
 * @param mac_size 摘要长度
 * @param inner_protocol    加密类型,详见inner_protocol
 */
int encrypt_hmac_sha2(const unsigned char *message, unsigned int message_len,
                       unsigned char *mac, unsigned int mac_size,int inner_protocol);
/**
 * 国密SM3
 * @param msg   信息内容
 * @param msglen    信息长度
 * @param dgst  结果
 */
void encrypt_sm3(const unsigned char *msg, size_t msglen,
                 unsigned char dgst[32]);

/**
 * 国密SM3消息认证码
 * @param data  消息
 * @param data_len  消息长度
 * @param key   秘钥
 * @param key_len   秘钥长度
 * @param mac   结果
 */
int encrypt_hmac_sm3(const unsigned char *data, size_t data_len,
                      unsigned char mac[32]);

4.DEMO代码

/***
 * 对数据进行加签或验签演示
 */
void vertify_mac(std::string input, int protocol_type)
{
    unsigned char *buf = NULL;
    unsigned char *buf_ptr = NULL;
    unsigned char *encrypt_buf = NULL;
    unsigned char *encrypt_buf_ptr = NULL;
    buf = (unsigned char *)malloc(input.length());
    if(buf == NULL)
    {
        return;
    }
    buf_ptr = buf;
    int outSize = get_summary_buf_size(protocol_type);
    encrypt_buf = (unsigned char *)malloc(outSize);
    if(encrypt_buf == NULL)
    {
        return;
    }
    encrypt_buf_ptr = encrypt_buf;
    if(encrypt_sha2(buf_ptr, input.length(), encrypt_buf_ptr, protocol_type) != 0)
    {
        NSLog(@"protocol_type error");
        return;
    }
    std::string encrypt_str(encrypt_buf_ptr, encrypt_buf_ptr + outSize);
    NSLog(@"encrypt result=%s", string_to_hex(encrypt_str).c_str());
}

/***
 * 对数据进行加密/解密操作演示
 */
void encrypt_decrypt_demo(std::string crypt_buf, int protocol_type)
{
    unsigned char * buf = NULL;
    unsigned char * buf_ptr = NULL;
    unsigned char *encrypt_buf = NULL;
    unsigned char *encrypt_buf_ptr = NULL;
    unsigned char *decrypt_buf = NULL;
    unsigned char *pdecrypt_bufPtr = NULL;
    char error_info[512];
    try{
        const char * buf_char = crypt_buf.c_str();
        int in_size = crypt_buf.length();
        buf = (unsigned char *)malloc(in_size + 1);
        if(buf == NULL)
        {
            //      LOGD("malloc key_buf failed");
            return;
        }
        buf_ptr = buf;
        memmove(buf_ptr, buf_char, in_size);
        buf_ptr[in_size] = 0x0;
        int outSize = get_out_buf_size(protocol_type, in_size);
        encrypt_buf = (unsigned char *)malloc(outSize + 1);
        if(encrypt_buf == NULL)
        {
            //    LOGD("malloc encrypt_buf failed");
            return;
        }
        encrypt_buf_ptr = encrypt_buf;
        //LOGD("malloc encrypt_buf=%p len=%d", encrypt_buf_ptr, outSize + 1);
        KIWI_Crypt *pCrypt = new KIWI_Crypt();
        pCrypt->operator_type=OPR_ENCRYPT;
        pCrypt->crypt_protocol=protocol_type;
        pCrypt->in_size = in_size;
        pCrypt->in_buf = buf;
        pCrypt->operator_result = encrypt_buf;

        if(!operator_entrace_char(pCrypt))
        {
            getErrorMsg_char(error_info);
            LOGD(@"error msg=%s",error_info);
            return;
        }

        int out_buf_size = pCrypt->out_buf_size;
        std::vector<unsigned char> un_vector(encrypt_buf, encrypt_buf + pCrypt->out_buf_size);
        std::string encrypt_str(un_vector.begin(), un_vector.end());
        un_vector.clear();
        un_vector.swap(un_vector);

        LOGD(@"encrypt=%s", string_to_hex(encrypt_str).c_str());
        if(pCrypt)
            delete(pCrypt);

        if(buf)
            free(buf);
        pCrypt = new KIWI_Crypt();
        pCrypt->crypt_protocol=protocol_type;
        pCrypt->operator_type=OPR_DECRYPT;
        pCrypt->in_buf = encrypt_buf;
        pCrypt->in_size = out_buf_size;

        decrypt_buf = (unsigned char *)malloc(out_buf_size + 1);
        if(decrypt_buf == NULL)
        {
            LOGD(@"malloc decrypt_buf failed");
            return;
        }
        LOGD(@"malloc decrypt_buf=%p len=%d", decrypt_buf, out_buf_size + 1);
        pdecrypt_bufPtr = decrypt_buf;
        pCrypt->operator_result = pdecrypt_bufPtr;


        if(!operator_entrace_char(pCrypt))
        {
            getErrorMsg_char(error_info);
            LOGD(@"error msg=%s",error_info);
            return;
        }
        std::vector<unsigned char> un_decrypt_vector(decrypt_buf, decrypt_buf + pCrypt->out_buf_size);
        std::string decrypt_str(un_decrypt_vector.begin(), un_decrypt_vector.end());
        un_decrypt_vector.clear();
        un_decrypt_vector.swap(un_decrypt_vector);
        //        string decrypt_str((char *)decrypt_buf, 0, strlen((char *)decrypt_buf));
        LOGD(@"decrypt=%s", string_to_hex(decrypt_str).c_str());
        bool encryptDecryptSuc = false;
        if(crypt_buf.compare(decrypt_str) == 0)
        {
            encryptDecryptSuc = true;
        }
        delete(pCrypt);
        LOGD( @"end test Encrypt_Decrypt_result=%s", encryptDecryptSuc?"true":"false");

    }catch (std::exception ex){
        LOGD(@"runtime error=%s", ex.what());
    }


    LOGD(@"encrypt_buf=%p", encrypt_buf);
    if(encrypt_buf)
        free(encrypt_buf);
    encrypt_buf = NULL;
    encrypt_buf_ptr = NULL;
    LOGD(@"decrypt_buf=%p", decrypt_buf);
    if(decrypt_buf)
        free(decrypt_buf);
    pdecrypt_bufPtr = NULL;
    decrypt_buf = NULL;
}

白盒密钥偏移量IV说明:

在CBC,OFB,CFB,CTR,PCPB加密模式下,必须提供偏移量IV,白盒密钥的偏移IV会根据Key(密钥)与加密的BlockSize(块大小)生成。

生成原理:

  • Key长度大于BlockSize【目前自动生成的密钥都是这种情况】,从Key中截取长度为BlockSize长度的字符并倒序处理 例如:iv = Key.subString(0,BlockSize);//iv=g04SCvsa4dYxdGju mode_iv = ujGdxYd4asvCS40g

  • Key长度小于BlockSize【自定义的密钥可能存在】,使用PKCS5Padding方式进行填充,填充BlockSize - Key.length个字符,并倒序处理

5.关闭Bitcode

iOS项目在集成几维安全密钥白盒SDK后,必须关闭Bitcode才能正常编译,如下图 5-1

6.联系我们

如遇问题请联系我们的客服或技术支持,官方QQ群:201898448

results matching ""

    No results matching ""