2

我正在学习在我的程序中使用 OpenSSL 库。在代码中,我生成了一个私钥,并立即使用该密钥对消息进行加密。但总是失败。请帮助我。

private_key = RSA_generate_key(RSA_KEY_LENGTH, RSA_3, NULL, NULL);
if (RSA_check_key(private_key) < 1) {
    printf("generate_key: key generation failed\n");
    exit(-1);
}

unsigned char msg[25];
unsigned char cipher[128];
strcpy((char*)msg, "hello");
int ret = RSA_private_encrypt(25, msg, cipher, private_key,
                              RSA_PKCS1_OAEP_PADDING);
if (ret < 0) {
    printf("encryption in key generation failed\n");
    printf ("%s\n", ERR_error_string (ERR_get_error (), (char *) cipher));
    exit (-1);
}

这总是失败,这是我在使用 ERR_error_string 时遇到的错误。

error:04066076:lib(4):func(102):reason(118)
4

3 回答 3

4

请参阅文档:

人 RSA_private_encrypt

RSA_private_encrypt() signs the flen bytes at from (usually a message digest with an algorithm identifier) using the private key rsa and stores the signature in to. to must point to RSA_size(rsa) bytes of memory.

padding denotes one of the following modes:
RSA_PKCS1_PADDING
PKCS #1 v1.5 padding. This function does not handle the algorithmIdentifier specified in PKCS #1. When generating or verifying PKCS #1 signatures, RSA_sign(3) and RSA_verify(3) should be used.

RSA_NO_PADDING
Raw RSA signature. This mode should only be used to implement cryptographically sound padding modes in the application code.  Signing user data directly with RSA is insecure.

我不知道你从哪里得到 RSA_PKCS1_OAEP_PADDING,但上面列出了唯一支持的填充。

于 2014-05-09T14:53:24.777 回答
4

错误:04066076:lib(4):func(102):reason(118)

您可以使用 OpenSSLerrstr为您提供有意义的错误消息(在大多数情况下):

$ openssl errstr 0x04066076
error:04066076:rsa routines:RSA_EAY_PRIVATE_ENCRYPT:unknown padding type

即使您将其范围缩小到RSA_PKCS1_OAEP_PADDING/ RSA_PKCS1_PADDING,您仍应使用RSA_PKCS1_OAEP_PADDINGRSA 加密。所以你的下一个任务是找出你的代码还有什么问题。

这是一篇很好的博客文章,介绍了为什么应该避免使用 PKCS 1.5 填充 RSA 加密:加密令牌行业糟糕的几年

于 2014-05-11T11:03:20.150 回答
1

我已经找到了这个问题的原因。实际上,填充方法 RSA_PKCS1_OAEP_PADDING 在我的 centos 和 ubuntu 机器上都不适用于我。一旦我将它更改为 RSA_PKCS1_PADDING,它就开始正常工作了。但我不确定为什么会这样。

于 2012-06-18T05:19:46.530 回答