【发布时间】:2014-04-26 14:39:20
【问题描述】:
正如标题所说,我有一些代码可以生成一对 RSA 密钥。我想将它们分开并单独使用它们来加密/解密,而不是使用变量“keypair”来加密和解密。
我正在通过网络传输数据,并希望使用简单的 RSA 加密对其进行加密。因此,我想将公钥发送给其他用户,以便他可以使用它来加密一些数据,然后将其发回给我。
这是生成密钥的代码:
//Generate key pair
RSA *keypair = RSA_generate_key(KEY_LENGTH, PUB_EXP, NULL, NULL);
我现在想将公钥与私钥分开,这样我就可以独立使用它们来加密和解密数据。我该怎么做?
我有一些代码采用“密钥对”并将一些信息提取到一些“BIO”变量中,尽管我不确定这对我有什么帮助:
// To get the C-string PEM form:
BIO *pri = BIO_new(BIO_s_mem());
BIO *pub = BIO_new(BIO_s_mem());
PEM_write_bio_RSAPrivateKey(pri, keypair, NULL, NULL, 0, NULL, NULL);
PEM_write_bio_RSAPublicKey(pub, keypair);
pri_len = BIO_pending(pri);
pub_len = BIO_pending(pub);
pri_key = (char*)malloc(pri_len + 1);
pub_key = (char*)malloc(pub_len + 1);
BIO_read(pri, pri_key, pri_len);
BIO_read(pub, pub_key, pub_len);
pri_key[pri_len] = '\0';
pub_key[pub_len] = '\0';
#ifdef PRINT_KEYS
printf("\n%s\n%s\n", pri_key, pub_key);
#endif
printf("done.\n");
此代码有效,因为我已在 Visual Studio 2012 中对其进行了测试。 关于如何分离密钥的任何想法,然后将它们重新组合成一个“密钥对”,或者如何分别使用它们来加密/解密一些字符串变量?
谢谢
(完整代码)
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/err.h>
#include <stdio.h>
#include <string.h>
#define KEY_LENGTH 2048
#define PUB_EXP 3
#define PRINT_KEYS
#define WRITE_TO_FILE
int main() {
size_t pri_len; // Length of private key
size_t pub_len; // Length of public key
char *pri_key; // Private key
char *pub_key; // Public key
char msg[KEY_LENGTH/8]; // Message to encrypt
char *encrypt = NULL; // Encrypted message
char *decrypt = NULL; // Decrypted message
char *err; // Buffer for any error messages
//Generate key pair
RSA *keypair = RSA_generate_key(KEY_LENGTH, PUB_EXP, NULL, NULL);
// To get the C-string PEM form:
BIO *pri = BIO_new(BIO_s_mem());
BIO *pub = BIO_new(BIO_s_mem());
PEM_write_bio_RSAPrivateKey(pri, keypair, NULL, NULL, 0, NULL, NULL);
PEM_write_bio_RSAPublicKey(pub, keypair);
pri_len = BIO_pending(pri);
pub_len = BIO_pending(pub);
pri_key = (char*)malloc(pri_len + 1);
pub_key = (char*)malloc(pub_len + 1);
BIO_read(pri, pri_key, pri_len);
BIO_read(pub, pub_key, pub_len);
pri_key[pri_len] = '\0';
pub_key[pub_len] = '\0';
#ifdef PRINT_KEYS
printf("\n%s\n%s\n", pri_key, pub_key);
#endif
printf("done.\n");
// Get the message to encrypt
printf("Message to encrypt: ");
fgets(msg, KEY_LENGTH-1, stdin);
msg[strlen(msg)-1] = '\0';
// Encrypt the message
encrypt = (char*)malloc(RSA_size(keypair));
int encrypt_len;
err = (char*)malloc(130);
if((encrypt_len = RSA_public_encrypt(strlen(msg)+1, (unsigned char*)msg, (unsigned char*)encrypt, keypair, RSA_PKCS1_OAEP_PADDING)) == -1) {
ERR_load_crypto_strings();
ERR_error_string(ERR_get_error(), err);
fprintf(stderr, "Error encrypting message: %s\n", err);
goto free_stuff;
}
// Decrypt it
decrypt = (char*)malloc(encrypt_len);
if(RSA_private_decrypt(encrypt_len, (unsigned char*)encrypt, (unsigned char*)decrypt, keypair, RSA_PKCS1_OAEP_PADDING) == -1) {
ERR_load_crypto_strings();
ERR_error_string(ERR_get_error(), err);
fprintf(stderr, "Error decrypting message: %s\n", err);
goto free_stuff;
}
printf("Decrypted message: %s\n", decrypt);
getchar();
//printf("%s", pub_key);
free_stuff:
RSA_free(keypair);
BIO_free_all(pub);
BIO_free_all(pri);
free(pri_key);
free(pub_key);
free(encrypt);
free(decrypt);
free(err);
}
在此处找到此代码:https://shanetully.com/2012/04/simple-public-key-encryption-with-rsa-and-openssl/
【问题讨论】:
-
我通过搜索发现有些人尝试过问同样的问题,但到目前为止没有正确的答案 -> (stackoverflow.com/questions/20002029/…)
-
使用命令行工具'rsa'和'rsautl'怎么样?
-
RSA_public_encrypt似乎需要一个公钥(根据 API)。您是否尝试过使用公钥而不是密钥对?为什么要重新创建密钥对?你试过什么失败了? -
@ChiaraHsieh 在网站上推荐有关编程的命令行实用程序有点奇怪。
-
是的,这将超出加密的目的。您正在尝试做的事情非常基本,我想知道是否没有示例。否则,您可以查看 CLI 应用程序的源代码。如果您需要一个字符串而不是字节,那么您可以简单地对 PKCS#1 公钥进行 base 64 编码。或者添加一个 ASCII 装甲 (PEM)。