使用C将数据变量传递给使用C的行命令OpenSSL加密/解密

时间:2017-05-26 09:19:15

标签: c encryption openssl cryptography

我要做的是使用C编程来调用OpenSSL来加密和解密敏感数据。到目前为止我一直在使用包含密钥和数据的文件。但我认为,文件是潜在的安全问题,我想避免这种情况。

openssl rsautl -encrypt -inkey publicKey.pem -pubin -in data.txt -out enc.txt

openssl rsautl -decrypt -inkey privateKey.pem -in enc.txt -out decrypt.txt

这些是RSA加密/解密文件的常用命令。我们假设data.txt包含以下文字:

Hello World

是否直接将字符串 Hello World 传递给命令行而不是使用文件?

openssl rsautl -encrypt -inkey publicKey.pem -pubin "Hello World" -out enc.txt

这将在C中使用,如下所示:

char cmd[200] = "";
char data [50] = " \"Hello World\" ";

strcpy(cmd,    CMD_ACCESS_OPENSSL); // path to access utility
strcat(cmd,    "rsautl -encrypt -inkey publicKey.pem -pubin");
strcat(cmd,    data);
strcat(cmd,    "-out enc.txt");

if (system(cmd) != 0)
    exit 1; // If failed exit

1 个答案:

答案 0 :(得分:1)

使用openssl命令行工具,您可以通过省略-in - 参数来提供要在stdin上加密的数据,即:

echo -n "Hello World" | openssl rsautl -encrypt -inkey publicKey.pem -pubin -out enc.txt

将其嵌入C代码有点繁琐,因为你必须创建一个管道并写入它(未经测试!):

char cmd[200] = "";

strcpy(cmd,    CMD_ACCESS_OPENSSL); // path to access utility
strcat(cmd,    "rsautl -encrypt -inkey publicKey.pem -pubin ");
strcat(cmd,    "-out enc.txt");

FILE *p = popen(cmd, "w");

if (p != NULL) {
    fprintf(p, "Hello World!");
    pclose(p);
} else {
    perror("popen");
    exit(EXIT_FAILURE);
}

但更简洁的C方法是使用openssl c api加密数据,请访问OpenSSL wiki开始。