首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么openssl_public_encrypt不能处理这个明文?

为什么openssl_public_encrypt不能处理这个明文?
EN

Stack Overflow用户
提问于 2016-11-20 23:50:00
回答 2查看 1.3K关注 0票数 3

openssl_public_encrypt显然不能处理任意的明文。

代码语言:javascript
运行
复制
<?php

$msg = '{"args":["argxx","argyy"],"data":"xx\nyyy\n","symkey":"0a6e860640413acfe6e4e461a28fab3fad3aff78ef95c962c5e63bef7e2b3439"}';

# If you uncomment this line, the function succeeds.
# $msg = 'test';

$pub = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC80g7AA5XexMCiJW3tKr/eeN8Q
EMNfGYG0qiUuLS/dtir7c3c1MmpNzrE8R+xqleOLNVkbbSZqqQ2qUJtPhwbLhQyL
yilRH5WMz9Pabx62v7k+vm81/6Xa9fnIV7DE0DZhMO5vQvBE3+5jkXbfU4yBZRv5
UOty5gqGXXaR6bim4QIDAQAB
-----END PUBLIC KEY-----';


if (openssl_public_encrypt ($msg, $enc, $pub))
{
    print bin2hex ($enc);

    exit (0);
}
else
{
    print "Could not encrypt message.\n";
}
?>

这将在Ubuntu 7上输出Could not encrypt message.

为什么它在这个$msg上失败

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-21 02:29:29

如果我们用经验来测试这种情况,我们就会发现,超过117个字节的所有东西都会失败:

代码语言:javascript
运行
复制
$msg = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklm';

上面的一行代表117个字符和117个字节。这在使用您提供的公钥加密时起作用。

如果我添加了另一个字符n,加密失败:

代码语言:javascript
运行
复制
$msg = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmn';

其他unicode字符也是如此。假设我试图加密这个长度为85个字符的密码,但长度正好是117个字节:

代码语言:javascript
运行
复制
$msg = ' i ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui  u';

这个加密得很完美。但是,如果再添加一个字节,它就会失败(86个字符,118个字节):

代码语言:javascript
运行
复制
$msg = ' i ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui ♥ ui  uZ';

。。如果您将超过117个字符进行加密,则openssl_public_encrypt()函数将通过设计失败。 斯奈德,克里斯,迈耶,托马斯,索思韦尔,迈克尔,ISBN 978-1-4302-3318-3

此外,书中说:

因为RSA是昂贵的,而且从来都不是用来加密大量数据的,所以如果您加密的对象通常超过56个字符,那么您应该计划使用快速高效的对称算法来加密数据,比如使用随机生成的密钥的AES算法。

票数 2
EN

Stack Overflow用户

发布于 2016-11-21 18:34:37

实际的密钥是128个字节(1024位),这是一个常见的最小接受的密钥大小.128-11填充字节=117个要加密的数据允许字节。

问题中的公钥被编码,并有额外的页眉和页脚行,因此超过128个字节。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40710825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档