【问题标题】:Using OpenSSL's CMS_encrypt() in Objective-c在 Objective-c 中使用 OpenSSL 的 CMS_encrypt()
【发布时间】:2012-02-22 15:36:08
【问题描述】:

我想使用 OpenSSL 的 cms 库使用 CMS_encrypt() 方法使用特定证书加密文件。 (我想这应该是正确的) 有人有关于使用 CMS_encrypt() 的小样本吗?

谢谢

【问题讨论】:

    标签: openssl sample smime


    【解决方案1】:

    我在 openssl.../demos/cms/cms_enc.c 的 openssl 下载文件夹中找到了一个 C 语言演示

    使用以下代码(openssl 的属性):

        /* Simple S/MIME encrypt example */
    #include <openssl/pem.h>
    #include <openssl/cms.h>
    #include <openssl/err.h>
    
    int main(int argc, char **argv)
        {
        BIO *in = NULL, *out = NULL, *tbio = NULL;
        X509 *rcert = NULL;
        STACK_OF(X509) *recips = NULL;
        CMS_ContentInfo *cms = NULL;
        int ret = 1;
    
        /*
         * On OpenSSL 1.0.0 and later only:
         * for streaming set CMS_STREAM
         */
        int flags = CMS_STREAM;
    
        OpenSSL_add_all_algorithms();
        ERR_load_crypto_strings();
    
        /* Read in recipient certificate */
        tbio = BIO_new_file("signer.pem", "r");
    
        if (!tbio)
            goto err;
    
        rcert = PEM_read_bio_X509(tbio, NULL, 0, NULL);
    
        if (!rcert)
            goto err;
    
        /* Create recipient STACK and add recipient cert to it */
        recips = sk_X509_new_null();
    
        if (!recips || !sk_X509_push(recips, rcert))
            goto err;
    
        /* sk_X509_pop_free will free up recipient STACK and its contents
         * so set rcert to NULL so it isn't freed up twice.
         */
        rcert = NULL;
    
        /* Open content being encrypted */
    
        in = BIO_new_file("encr.txt", "r");
    
        if (!in)
            goto err;
    
        /* encrypt content */
        cms = CMS_encrypt(recips, in, EVP_des_ede3_cbc(), flags);
    
        if (!cms)
            goto err;
    
        out = BIO_new_file("smencr.txt", "w");
        if (!out)
            goto err;
    
        /* Write out S/MIME message */
        if (!SMIME_write_CMS(out, cms, in, flags))
            goto err;
    
        ret = 0;
    
        err:
    
        if (ret)
            {
            fprintf(stderr, "Error Encrypting Data\n");
            ERR_print_errors_fp(stderr);
            }
    
        if (cms)
            CMS_ContentInfo_free(cms);
        if (rcert)
            X509_free(rcert);
        if (recips)
            sk_X509_pop_free(recips, X509_free);
    
        if (in)
            BIO_free(in);
        if (out)
            BIO_free(out);
        if (tbio)
            BIO_free(tbio);
    
        return ret;
    
        }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 2017-01-21
    相关资源
    最近更新 更多