openssl 加密明文长度的问题,求大牛进来帮忙解答下

2014-10-22 19:43:03 +08:00
 me2you
现有php代码片段:

$public_key = file_get_contents('./public.crt');

$pu_key = openssl_pkey_get_public($public_key);

$encrypted = "";

//demo Array
$data = Array(
Array(
'name' => '张三',
'phone' => 13800138000,
'pubdate' => 1413952582,
'Msg' => '随便几个字!',
'model' => '具体的模式'
),
Array(
'name' => '李四',
'phone' => 13900139000,
'pubdate' => 1413952582,
'Msg' => '随便打几个!',
'model' => '具体的模式'
)
);

$data = json_encode($data);

openssl_public_encrypt($data,$encrypted,$pu_key);

后面的就省掉了,问题在于最后1个函数openssl_public_encrypt(),明文$data按找现有的数组元素长度,2个的时候可以进行加密,当元素是3个的时候,加密失败,$encrypted为空,函数有没执行的感觉,问了下度娘,说明文长度最大为公钥长度-11,我的公钥长度是128,那明文最长也就117,怎么才能在使用现有的公钥基础上不限定明文长度进行加密,并且可以用私钥进行解密呢?

求指点
14015 次点击
所在节点    PHP
10 条回复
wzxjohn
2014-10-22 20:07:19 +08:00
不是非常了解PHP的函数,不知道有没有简单的方法,但是如果你手动把明文base64一下,然后切断,分段不足117的补不存在base64中的字符,然后再加密,这样就可以了嘛。。。
me2you
2014-10-22 23:32:03 +08:00
@wzxjohn 谢谢,你说的是把明文分段加密是吧?我还在网上看到一个说可以用RSA的DES加密算法进行加密,据说DES不限定明文长度,但是就是不晓得openssl库中有没有DES的函数,明天去找找看
semicircle21
2014-10-23 10:56:07 +08:00
如果整套加密方案都是你自己定, 那你要学习不少东西了.. 我不久前用到这些, 研究了一阵:
这种非对称加密/解密(RSA)消耗的资源是比较大的, 一般都是在传输过程中, 是用来交换对称加密(AES/DES/RC4)秘钥的, 所以很少有用 RSA 加密任意长度数据的场景, 所以你大概很难搜到相关资料.
用 AES 等对称加密的时候, 你也会遇到长度问题: AES 是分"块"来加密的, 块与块之间还有上下文, 前一块的状态如何传给下一块, 大概有一些 CBC 之类的方法; 然后还有补 Pad 的问题: 内容不足一个块怎么办, 也有一些现成的方案: PKCS7 等; 然后是混淆问题: 如果每次传输的明文都是相同内容, 密文也相同, 那么某种意义上, 也就等于泄露了信息, 所以要在传输的最开始加入一块随机生成的内容, 也就是 initial vector.
me2you
2014-10-23 11:52:27 +08:00
@semicircle21 我现在的做法是,将数组的每一个元素采用上面的加密方法加密,然后bese64编码,再连上一个特殊的字符串进行分段标记,接收端在收到密文后先按照事先约定的分段标记进行切割成数组,再循环数组逐一解密,用的是4096的RSA加密,RSA算法复杂 资源开销是比较大
semicircle21
2014-10-23 16:07:03 +08:00
@me2you 为什么要做 base64 呢? base64没有提升安全性,却使明文更长了. 如果你要加密的长度不太长, 也许 缩在一个4096里就 ok 了.
我不太了解 PHP 的函数.
me2you
2014-10-23 17:38:00 +08:00
@semicircle21 因为rsa加密之后的密文会在浏览器上显示出乱码和空格,怕在传输的过程中出现什么问题,所以传输前先base64下,收到经过base64编码之后的密文再去base64_decode,可以还原空格和乱码。比较倾向于这种传输可读字符的做法
me2you
2014-10-23 17:40:57 +08:00
@semicircle21 按现有的数据,4096不够用,4096只是当天数据的1/4大概,不过rsa传小数据量的数据还是真心不错
semicircle21
2014-10-23 18:43:14 +08:00
@me2you 奥, 我以为是在加密前 base64.
4096不够用就只能换对称加密了.
我还有点疑问, 持有私钥的一端, 是 浏览器的js 吗?
me2you
2014-10-24 16:09:58 +08:00
@semicircle21 私钥存在另一台服务器上的,php引入使用,用rsa是来互相交换2台服务器中当天新增客户的联系信息
semicircle21
2014-10-24 21:26:37 +08:00
嗯. 如果两台服务器都由你们控制的话, 感觉让系统管理员弄个 VPN 或者用 ssh 隧道连接应该更省事一点.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/140823

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX