无法加密中文字符

时间:2016-08-26 02:38:19

标签: c openssl

我使用RSA_public_encrypt()加密中文字符串。例如:

char buf[] = "你好";
RSA_public_encrypt(s, buf, p, r, RSA_NO_PADDING);

OpenSSL返回的错误字符串是:

error:04068084:lib(4):func(104):reason(132)

它会失败。我想知道为什么?

1 个答案:

答案 0 :(得分:2)

  

error:04068084:lib(4):func(104):reason(132)

这相当无用。当您看到类似的字符串时,请使用openssl errstr命令:

$ openssl errstr 0x04068084
error:04068084:rsa routines:RSA_EAY_PUBLIC_ENCRYPT:data too large for modulus

看起来您的示例与产生错误的实际代码不匹配。或者OpenSSL错误消息是错误的 - 它应该说"数据太小而不能模数"

您要加密的字符串有一个大小限制。来自RSA_public_encrypt

  

RSA_public_encrypt()使用公钥rsa加密来自(通常是会话密钥)的flen字节,并将密文存储到。必须指向RSA_size(rsa)字节的内存...

     对于基于PKCS#1 v1.5的填充模式,

flen必须小于RSA_size(rsa) - 11,小于RSA_size(rsa) - 对于RSA_PKCS1_OAEP_PADDING为41,对于RSA_NO_PADDING则为RSA_size(rsa)。必须在调用RSA_public_encrypt()之前播种随机数生成器。

根据手册页,由于您使用的是RSA_NO_PADDING,因此加密的字符串长度必须正好RSA_size(rsa)。实际上,这意味着您负责填充而不是库。

上面, 会话密钥 通常较小,如16或32字节。通常会发生的事情是会话密钥用于键入块或流密码,如AES,Camellia,TripleDES,ChaCha等。然后,明文在块或流密码下加密。最后,块或流密码密钥在RSA密钥下加密。

您可能也对 Key Encryption Key (KEK) Content Encryption Key (CEK) 感兴趣。它们是密钥管理策略的一部分。上面,RSA密钥是您的密钥加密密钥(KEK)内容加密密钥(CEK)是会话密钥。