为RSA OpenSSL设置特定密钥

时间:2018-04-20 08:49:35

标签: c openssl rsa

我目前正在尝试为RSA实现实现一些测试向量,我想通过OpenSSL v1.1.0f实现测试它们。但是,当我尝试设置密钥(对于e,n p,q或d)时,我有以下错误:

  

erreur:取消引用指向不完整类型的指针«RSA {alias struct rsa_st}»

我的代码如下:

int rsa_encrypt(byte *in, size_t in_len, byte *out, const char *n, const char *e, char padding){
    int err = -1;

    RSA *keys = NULL;
    keys = RSA_new();

    BN_hex2bn(&keys->n, n); // error here
    BN_hex2bn(&keys->e, e); // and here

    out = malloc(RSA_size(keys));

    if (padding == OAEP ) {
        err = RSA_public_encrypt(in_len, in, out, keys, RSA_PKCS1_OAEP_PADDING);
    }
    else if (padding == v1_5) {
        err = RSA_public_encrypt(in_len, in, out, keys, RSA_PKCS1_PADDING);
    }

    RSA_free(keys);

    return err;
}

其中n和e是以hexa表示我的参数的字符串。

我已经找到了与RSA类型相对应的结构,并找到了this。 我不明白为什么我不能设置n和e ...任何想法?

1 个答案:

答案 0 :(得分:2)

OpenSSL结构在1.1.x中是不透明的,你不能谈论它们的字段。除其他外,它允许在服务版本期间添加新的结构字段,因为调用者代码无法知道字段偏移。

对于1.1.x,你需要做类似于

的事情
BN* bnN = NULL;
BN* bnE = NULL;
RSA* keys = RSA_new();

BN_hex2bn(&bnN, n);
BN_hex2bn(&bnE, e);
RSA_set0_key(keys, bnN, bnE, NULL);

...
RSA_free(keys);
// do not free bnN or bnE, they were freed by RSA_free.

请注意,我遗漏了必要的错误检查。