V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
me2you
V2EX  ›  PHP

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

  •  
  •   me2you · 2014-10-22 19:43:03 +08:00 · 13990 次点击
    这是一个创建于 3688 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现有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   ·   实用小工具   ·   5385 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 05:46 · PVG 13:46 · LAX 21:46 · JFK 00:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.