利用openssl進行RSA簽名

NSString *RSA_EVP_Sign(NSString *data)
{
    
    unsigned char *Str=(unsigned char *)[data UTF8String];//utf8編碼轉換成c的字符串
    EVP_PKEY *prikey;
    NSString *private = formatPrivate(PRIVATE_KEY);//格式化自己的私鑰
    NSData *pri= [private dataUsingEncoding: NSUTF8StringEncoding];//utf8編碼將私鑰轉換成二進制
    BIO *bio = BIO_new_mem_buf((void *)[pri bytes], (int)[pri length]);//將私鑰讀取到內存中
    prikey = PEM_read_bio_PrivateKey(bio, NULL,NULL, NULL);//讀內存中的私鑰
    BIO_free(bio);
    int strLen= (int)strlen((const char *)Str);
    EVP_MD_CTX mdctx;
    EVP_MD_CTX_init(&mdctx); //初始化mdctx結構體
    if(!EVP_SignInit_ex(&mdctx, EVP_sha256(), NULL)) //初始化數據加密,把加密得到的數據放入mdctx
    {
        printf("error\n");
        EVP_PKEY_free(prikey);
    }
    if(!EVP_SignUpdate(&mdctx, Str, strLen))   //開始加密
    {
        printf("error\n");
        EVP_PKEY_free(prikey);
        
    }
    unsigned int signLen=EVP_PKEY_size(prikey);
    unsigned char* signBuf=(unsigned char *)calloc(signLen+1, sizeof(unsigned char)); //申請signLen+1段內存
    
    if(!EVP_SignFinal(&mdctx, signBuf, &signLen, prikey)) //數據拷貝到signBuf中
    {
        printf("error\n");
        EVP_PKEY_free(prikey);
    }
    EVP_MD_CTX_cleanup(&mdctx);  //清空防止內存泄漏
    NSMutableString *result = [NSMutableString stringWithCapacity:128];
    for(int i = 0; i < 128; i++)
        [result appendFormat:@"%02x", signBuf[i]];  //將signBuf中的數據加入到result中去
    
    return result;
    
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章