【发布时间】:2012-09-20 18:20:30
【问题描述】:
我正在编写一个 C 程序来为 RSA 生成密钥并将它们写入文件,然后从中读取。作业要求我生成 openssl 格式的文件。所以,我选择了PEM。现在,我有以下创建文件的功能
rsa = RSA_new();
// These 3 keys are generated beforehand
rsa->e = e;
rsa->n = n;
rsa->d = d;
fp = fopen(pubkey_file, "w");
if(!PEM_write_RSAPublicKey(fp, rsa))
{
printf("\n%s\n", "Error writing public key");
}
fflush(fp);
fclose(fp);
fp = fopen(privkey_file, "w");
// pRsaKey = EVP_PKEY_new();
// EVP_PKEY_assign_RSA(pRsaKey, rsa);
if(!PEM_write_RSAPrivateKey(fp, rsa, NULL, 0, 0, NULL, NULL))
// if (!PEM_write_PrivateKey(fp, pRsaKey, NULL, NULL, 0, 0, NULL))
{
printf("\n%s\n", "Error writing private key");
}
fflush(fp);
fclose(fp);
这是读取文件的功能
rsa = RSA_new();
fp = fopen(pubkey_file, "r");
if(PEM_read_RSAPublicKey(fp, &rsa, NULL, NULL) == NULL)
{
printf("\n%s\n", "Error Reading public key");
return;
}
fclose(fp);
BN_bn2bin(rsa->n, (unsigned char *)modulus);
BN_bn2bin(rsa->e, (unsigned char *)exp);
printf("\n%s\n%s\n", exp, modulus);
RSA_free(rsa);
// pRsaKey = EVP_PKEY_new();
fp = fopen(privkey_file, "r");
if(fp)
// if((PEM_read_PrivateKey(fp, &pRsaKey, NULL, NULL)) == NULL)
if((PEM_read_RSAPrivateKey(fp, &rsa, NULL, NULL)) == NULL)
{
printf("\n%s\n", "Error Reading private key");
return;
}
// rsa = RSA_new();
// rsa = EVP_PKEY_get1_RSA(pRsaKey);
fclose(fp);
根据需要写入和读取公钥,但 provate 密钥失败。我尝试过同时使用 rsa 和 evp 进行编写(在上面的代码中对此进行了注释)。但是,两者都失败了。我无法理解为什么会发生这种情况,也无法尝试找到调试此问题的位置。任何人都可以为此提供一些指示吗?
【问题讨论】:
-
我会调查是否有功能可以提取错误,以便您了解这里发生的情况。调用 fopen 后还要检查 fp 并在那里打印任何错误。照原样,无法调试。
-
我不熟悉您正在使用的工具包,但 PKCS#1 需要的不仅仅是 en 和 d(我最后还是检查了)。 PEM 真正在做的就是采用 PKCS#1 DER 编码、b64 编码并标记一些页眉和页脚。是否有可能在保存之前关键数据没有完全充实?
-
@LucasHolt 我检查了文件指针。他们没有任何错误。但是,只有读取私钥的函数调用会导致错误。
-
@WhozCraig 我会调查的。但是,据我所知,RSA 对象只需要 n、e、d。休息可以为空。 openssl.org/docs/crypto/rsa.html#DESCRIPTION 因此,我假设它应该将对象写入文件(它确实如此)。它读回来,这是一个问题
标签: c security openssl rsa pem