openssl 加密明文长度的问题,求大牛进来帮忙解答下 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
me2you
V2EX    PHP

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

  •  
  •   me2you 2014-10-22 19:43:03 +08:00 14335 次点击
    这是一个创建于 4010 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现有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,怎么才能在使用现有的公钥基础上不限定明文长度进行加密,并且可以用私钥进行解密呢?

    求指点
    10 条回复    2014-10-24 21:26:37 +08:00
    wzxjohn
        1
    wzxjohn  
       2014-10-22 20:07:19 +08:00   1
    不是非常了解PHP的函数,不知道有没有简单的方法,但是如果你手动把明文base64一下,然后切断,分段不足117的补不存在base64中的字符,然后再加密,这样就可以了嘛。。。
    me2you
        2
    me2you  
    OP
       2014-10-22 23:32:03 +08:00
    @wzxjohn 谢谢,你说的是把明文分段加密是吧?我还在网上看到一个说可以用RSA的DES加密算法进行加密,据说DES不限定明文长度,但是就是不晓得openssl库中有没有DES的函数,明天去找找看
    semicircle21
        3
    semicircle21  
       2014-10-23 10:56:07 +08:00
    如果整套加密方案都是你自己定, 那你要学习不少东西了.. 我不久前用到这些, 研究了一阵:
    这种非对称加密/解密(RSA)消耗的资源是比较大的, 一般都是在传输过程中, 是用来交换对称加密(AES/DES/RC4)秘钥的, 所以很少有用 RSA 加密任意长度数据的场景, 所以你大概很难搜到相关资料.
    用 AES 等对称加密的时候, 你也会遇到长度问题: AES 是分"块"来加密的, 块与块之间还有上下文, 前一块的状态如何传给下一块, 大概有一些 CBC 之类的方法; 然后还有补 Pad 的问题: 内容不足一个块怎么办, 也有一些现成的方案: PKCS7 等; 然后是混淆问题: 如果每次传输的明文都是相同内容, 密文也相同, 那么某种意义上, 也就等于泄露了信息, 所以要在传输的最开始加入一块随机生成的内容, 也就是 initial vector.
    me2you
        4
    me2you  
    OP
       2014-10-23 11:52:27 +08:00
    @semicircle21 我现在的做法是,将数组的每一个元素采用上面的加密方法加密,然后bese64编码,再连上一个特殊的字符串进行分段标记,接收端在收到密文后先按照事先约定的分段标记进行切割成数组,再循环数组逐一解密,用的是4096的RSA加密,RSA算法复杂 资源开销是比较大
    semicircle21
        5
    semicircle21  
       2014-10-23 16:07:03 +08:00   1
    @me2you 为什么要做 base64 呢? base64没有提升安全性,却使明文更长了. 如果你要加密的长度不太长, 也许 缩在一个4096里就 ok 了.
    我不太了解 PHP 的函数.
    me2you
        6
    me2you  
    OP
       2014-10-23 17:38:00 +08:00
    @semicircle21 因为rsa加密之后的密文会在浏览器上显示出乱码和空格,怕在传输的过程中出现什么问题,所以传输前先base64下,收到经过base64编码之后的密文再去base64_decode,可以还原空格和乱码。比较倾向于这种传输可读字符的做法
    me2you
        7
    me2you  
    OP
       2014-10-23 17:40:57 +08:00
    @semicircle21 按现有的数据,4096不够用,4096只是当天数据的1/4大概,不过rsa传小数据量的数据还是真心不错
    semicircle21
        8
    semicircle21  
       2014-10-23 18:43:14 +08:00
    @me2you 奥, 我以为是在加密前 base64.
    4096不够用就只能换对称加密了.
    我还有点疑问, 持有私钥的一端, 是 浏览器的js 吗?
    me2you
        9
    me2you  
    OP
       2014-10-24 16:09:58 +08:00
    @semicircle21 私钥存在另一台服务器上的,php引入使用,用rsa是来互相交换2台服务器中当天新增客户的联系信息
    semicircle21
        10
    semicircle21  
       2014-10-24 21:26:37 +08:00
    嗯. 如果两台服务器都由你们控制的话, 感觉让系统管理员弄个 VPN 或者用 ssh 隧道连接应该更省事一点.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     987 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 22:33 PVG 06:33 LAX 15:33 JFK 18:33
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86