Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法加密中文字符_C_Openssl - Fatal编程技术网

C 无法加密中文字符

C 无法加密中文字符,c,openssl,C,Openssl,我使用RSA\u public\u encrypt()对中文字符串进行加密。例如: char buf[] = "你好"; RSA_public_encrypt(s, buf, p, r, RSA_NO_PADDING); OpenSSL返回的错误字符串为: 错误:04068084:lib(4):func(104):原因(132) 它将失败。我想知道为什么 错误:04068084:lib(4):func(104):原因(132) 那太没用了。当您看到这样的字符串时,请使用openssl err

我使用
RSA\u public\u encrypt()
对中文字符串进行加密。例如:

char buf[] = "你好";
RSA_public_encrypt(s, buf, p, r, RSA_NO_PADDING);
OpenSSL返回的错误字符串为:

错误:04068084:lib(4):func(104):原因(132)
它将失败。我想知道为什么

错误:04068084:lib(4):func(104):原因(132)

那太没用了。当您看到这样的字符串时,请使用
openssl errstr
命令:

$ openssl errstr 0x04068084
error:04068084:rsa routines:RSA_EAY_PUBLIC_ENCRYPT:data too large for modulus
看起来您的示例与产生错误的实际代码不匹配。或者OpenSSL错误消息是错误的——它应该说“数据对于模数来说太小”

正在加密的字符串有大小限制。发件人:

RSA_public_encrypt()使用公钥RSA加密from处的flen字节(通常是会话密钥),并将密文存储到。必须指向RSA_大小(RSA)字节的内存

对于基于PKCS 1 v1.5的填充模式,flen必须小于RSA#U大小(RSA)-11;对于RSA#U PKCS1_OAEP_填充,flen必须小于RSA#U大小(RSA)-41;对于RSA#U无_填充,flen必须小于RSA#U大小(RSA)。在调用RSA_public_encrypt()之前,必须对随机数生成器进行种子设定

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

如上所述,会话密钥通常很小,比如16或32字节。通常情况下,会话密钥用于为AES、Camellia、TripleDES、ChaCha等块密码或流密码设置密钥。然后,明文在块密码或流密码下加密。最后,在RSA密钥下对块或流密码密钥进行加密


您可能还对和感兴趣。它们是关键管理战略的一部分。上面,RSA密钥是您的密钥加密密钥(KEK),内容加密密钥(CEK)是会话密钥。

根据手册页:“出错时返回-1;错误代码可以通过
ERR\u get\u error
获得……”下一个问题是,库返回的错误代码是什么?错误:0406804:lib(4):func(104):原因(132)。它的错误消息密钥为1024位,当我加密英文字符串(128字节)时,我成功。“你好” 只有6bytes@mc.robin=对中文字符串执行
strlen
,看看它返回什么。我猜它超过了限制。也许你需要为你的程序设置一个C语言环境。也许你需要使用
iconv
转换为UTF8字符串。很抱歉,我对英文字符串加密时不知道更多关于i18n.@mc.robin”(128字节),我成功了”-这正是问题所在。您是否阅读了此答案中提供的链接?从文档中可以看出,“flen必须是…对于RSA_NO_PADDING,正好是RSA_size(RSA))。如果您传递的序列不是模数大小(在本例中,对于1024位密钥,128字节)加密将失败。@jww这里有它。没关系。如果您愿意,只需更新您的答案(我已经加了标记)并突出显示指定的部分。这样做的麻烦(制作模数大小的帧)这是我不使用填充的几个原因之一。几乎每个人都使用v1.5或oaep。不知道为什么OP不使用。谢谢大家。使用RSA_PKCS1_填充将起作用。我不知道为什么。。。