Как мне расшифровать файл закрытого ключа и подписать текст с помощью вызовов openssl в C? - PullRequest
4 голосов
/ 01 декабря 2010

У меня есть 2 отдельные программы (склеенные ниже). Первый генерирует пару ключей и сохраняет в файлы (работает нормально). Второй открывает закрытый ключ, расшифровывая парольную фразу, а затем мне нужно подписать строку текста. Приведенный ниже код завершается ошибкой при вызове PEM_read_PrivateKey () (last) (не понимаю, почему). Кто-нибудь может указать мне на то, что я делаю неправильно, а затем на то, что я должен сделать openssl, чтобы использовать закрытый ключ для подписи некоторого текста?

int main (int argc, char *argv[])
{
    char *priv_pem = "priv.pem";
    char *pub_pem  = "pub.pem";
    char *pass     = "Password";
    FILE *fp;   
    int bits = 4096;
    unsigned long exp = RSA_F4;

    RSA *rsa;
    EVP_PKEY *pkey;

    //  GENERATE KEY
    rsa=RSA_generate_key(bits,exp,NULL,NULL);
    if (RSA_check_key(rsa)!=1)
        Exit(1,"Error whilst checking key","");
    pkey = EVP_PKEY_new();
    EVP_PKEY_assign_RSA(pkey, rsa);

    //  WRITE ENCRYPTED PRIVATE KEY
    if (!(fp = fopen(priv_pem, "w")))
        Exit(2,"Error opening PEM file",priv_pem);
    if (!PEM_write_PrivateKey(fp,pkey,EVP_aes_256_cbc(),NULL,0,NULL,pass))
        Exit(3,"Error writing PEM file",priv_pem);
    fclose(fp);

    //  WRITE PUBLIC KEY
    if (!(fp = fopen(pub_pem, "w")))
        Exit(4,"Error opening PEM file",pub_pem);
    if (!PEM_write_PUBKEY(fp, pkey))
        Exit(5,"Error writing PEM file",pub_pem);
    fclose(fp);
    // ------- End of key generation program -------

    // ------- Start of text signing program -------
    //  READ IN ENCRYPTED PRIVATE KEY
    if (!(fp = fopen(priv_pem, "r")))
        Exit(6,"Error reading encrypted private key file",priv_pem);
    if (!PEM_read_PrivateKey(fp,&pkey,NULL,pass))
        Exit(7,"Error decrypting private key file",priv_pem);
    fclose(fp);

    // Sign some text using the private key....

    //  FREE
    RSA_free(rsa);  
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 01 декабря 2010

Вы инициализировали pkey до NULL, прежде чем передать &pkey в PEM_read_PrivateKey()? Если нет, он попытается повторно использовать структуру EVP_PKEY, на которую указывает pkey - и если pkey не инициализирован, он будет искать случайное место в памяти.

Вы можете использовать ERR_print_errors_fp(stderr); для сброса стека ошибок OpenSSL в stderr при возникновении ошибки - это часто полезно при нахождении проблемы.

1 голос
/ 02 декабря 2010

Спасибо @caf за вашу помощь.Методом проб и ошибок я исправил ошибку PEM_read_PrivateKey (), добавив в начало следующее:

if (EVP_get_cipherbyname("aes-256-cbc") == NULL)
    OpenSSL_add_all_algorithms();

Однако я все еще ищу лучший (практический) способ генерации ключей и затем использование приватногоключ для подписи.Из моего ограниченного понимания я ищу методы openssl, которые соответствуют RSA "PKCS # 1 v2.0: RSA Cryptography Standard"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...