gpt4 book ai didi

c - 如何在 C 中实现 RSA 加密?

转载 作者:行者123 更新时间:2023-12-04 13:12:50 25 4
gpt4 key购买 nike

我正在尝试在 C 程序中使用非对称加密来加密字符串

我选择使用 RSA,但是如果有更简单但更安全的方法,请告诉我

OpenSSL 是我查看过的一个库,但没有找到关于在 C 代码中实现它的文档。 (我可能只是运气不好,我已经找了很多天了)

在 YouTube/Google 上也没有运气......

请指出有关如何执行此操作的详细信息来源...

我非常了解 C 和 RSA 的基本概念,但我不知道如何:

  1. 生成生成 key 所需的大素数。
  2. 修复 e = 65537 。
  3. 以字母数字格式生成公钥/私钥(它们实际上是数字,不是吗?)。
  4. 按照 OpenSSL 等工具似乎所做的方式(在字母数字字符串中),将公钥中的 (e,n) 和私钥中的 (d,n) 无缝组合。

最佳答案

这是您要执行的操作的示例。首先是打印 OpenSSL 错误消息的实用函数:

void log_ssl_err(const char *mes)
{
unsigned long err, found;
char errstr[1000];

found = 0;
while ((err = ERR_get_error())) {
ERR_error_string(err, errstr);
printf("%s: %s", mes, errstr);
found = 1;
}
if (!found) {
printf("%s", mes);
}
}

生成具有给定指数的 key :

RSA *rsa;
BIGNUM *e;
uint32_t exponent_bin, exponent_num;

exponent_num = 65537;
exponent_bin = htonl(exponent);
e = BN_bin2bn((const unsigned char *)&exponent_bin, 4, NULL);
if (e == NULL) {
log_ssl_err("BN_bin2bn failed for e");
exit(1);
}

if ((rsa = RSA_new()) == NULL) {
log_ssl_err("RSA_new failed");
BN_free(e);
exit(1);
}
if (!RSA_generate_key_ex(rsa, 2048, e, NULL)) {
log_ssl_err("couldn't generate rsa key");
BN_free(e);
exit(1);
}

加密和解密:

unsigned char plaintext[] = "this is the plaintext";
unsigned char *ciphertext, *decrypted;
int cipher_len, decrypted_len;

ciphertext = malloc(RSA_size(rsa));
if ((cipher_len = RSA_public_encrypt(strlen(plaintext), plaintext, ciphertext,
rsa, RSA_PKCS1_OAEP_PADDING)) == -1) {
log_ssl_err("RSA_public_encrypt failed");
exit(1);
}

decrypted = malloc(RSA_size(rsa));
if ((decrypted_len = RSA_private_decrypt(cipher_len, ciphertext, decrypted,
rsa, RSA_PKCS1_OAEP_PADDING)) == -1) {
log_ssl_err("RSA_private_decrypt failed");
return 0;
}

OpenSSL 的文档可能难以浏览,但您可以在手册页中找到所需的信息。如果您运行 man 3 rsa,您将看到所有与 RSA 相关的函数的列表。从那里您可以查看每个函数的手册页。

关于c - 如何在 C 中实现 RSA 加密?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63263402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com