在shell中,使用下面的openssl命令,我可以使用公钥加密秘密消息并使用私钥解密。
# private key generation
openssl genrsa -out key.pem 1024
# public key generation from private key
openssl rsa -in key.pem -pubout > pubkey.pub
# encrypt a message with public key
openssl rsautl -encrypt -pubin -inkey pubkey.pub -in msg > out
# decrypt a message with private key
openssl rsautl -decrypt -inkey key.pem -in out
现在我想用C语言中的openssl开发库做同样的事情。当我使用下面的代码并使用gcc main.c -lcrypto
进行编译时,它不会给出错误并打印出128
作为大小。我可以成功加密和解密消息。但是,我想隐藏源代码用户的私钥,并仅使用公钥进行加密。因此,我尝试使用这个代码的第二个版本,这对我来说是正确的,但它不起作用,它总是给出分段错误。
#include <stdio.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
int main(){
char error_message[120];
unsigned char to[128];
FILE *pem_file = fopen("key.pem", "rb");
if (pem_file == NULL) {
fprintf(stderr, "Can't open input file in.list!\n");
exit(1);
}
RSA *rsa = PEM_read_RSAPrivateKey(pem_file, NULL, NULL, NULL);
printf("%d\n", RSA_size(rsa));
}
第二版:读取公钥并初始化rsa对象。
#include <stdio.h>
#include <string.h>
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
int main(){
char error_message[120];
unsigned char to[128];
FILE *pem_file = fopen("pubkey.pub", "rb");
if (pem_file == NULL) {
fprintf(stderr, "Can't open input file in.list!\n");
exit(1);
}
RSA *rsa = PEM_read_RSAPublicKey(pem_file, NULL, NULL, NULL);
printf("%d\n", RSA_size(rsa));
}