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

PHP 使用 RSA 公钥对 JSON 对象进行加密,加密不了?

  •  
  •   eabet · 2016-12-14 18:31:02 +08:00 · 4742 次点击
    这是一个创建于 2937 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码如下:
    $json['terId'] = $terId;
    $json['businessOrdid'] = $businessOrdid;
    $json['orderName'] = $orderName;
    $json['tradeMoney'] = $Gold;
    $json['selfParam'] = $selfParam;
    $json['syncURL'] = $syncURL;
    $json['asynURL'] = $asynURL;
    $json['payType'] = $payType;
    $json['appSence'] = '1001';
    $data = json_encode($json, JSON_UNESCAPED_UNICODE);
    openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密
    $encrypted = base64_encode($encrypted);
    echo $encrypted ,"<br>";

    在输出$encrypted 的时候毛都没有, 但是把$data 随便赋值一个字符串上去就有东西了。。
    是不是不能对 JSON 加密??
    第 1 条附言  ·  2016-12-15 20:36:06 +08:00
    问题解决了,的确如同 @xqin @zhouheyang0919 说的那样 是字符串太长 RSA 只能加密最长 117 位的数据

    附上分割代码:
    $Split = str_split($data, 64);
    ForEach($Split as $Part)
    {
    openssl_public_encrypt($Part,$PartialData,$pubkey);//服务器公钥加密
    $t = strlen($PartialData);
    $encParam_encrypted .= $PartialData;
    }

    同时感谢各位热心磕瓜群众
    @lslqtz @fhefh
    15 条回复    2016-12-15 21:57:10 +08:00
    julyclyde
        1
    julyclyde  
       2016-12-14 20:39:26 +08:00
    那说明 data 是空的?
    eabet
        2
    eabet  
    OP
       2016-12-14 21:20:42 +08:00
    @julyclyde 不是空的 是一个数组
    lslqtz
        3
    lslqtz  
       2016-12-14 23:09:24 +08:00 via iPhone
    数组不能 json_encode ?
    打印 json , data 变量。
    zhouheyang0919
        4
    zhouheyang0919  
       2016-12-15 01:00:31 +08:00 via Android
    直接使用 RSA 算法加密数据是有长度限制的。
    可以用 RSA 加密一个随机生成的 AES key ,再用这个 AES key 加密数据。
    lslqtz
        5
    lslqtz  
       2016-12-15 11:46:14 +08:00
    Notice: Undefined variable: pu_key in D:\phpStudy2016\WWW\1.php on line 6
    lslqtz
        6
    lslqtz  
       2016-12-15 11:50:22 +08:00

    我成功了。
    建议开启报错看看?
    <?php
    $json['terId'] = '1';
    $json['businessOrdid'] = '2';
    $json['appSence'] = '1001';
    $pu_key='crt 公钥';
    $data = json_encode($json, JSON_UNESCAPED_UNICODE);
    openssl_public_encrypt($data,$encrypted,$pu_key);//公钥加密
    $encrypted = base64_encode($encrypted);
    echo $encrypted ,"<br>";
    ?>
    gouchaoer
        7
    gouchaoer  
       2016-12-15 13:07:15 +08:00 via Android
    这贴笑死我了,你 openssl_public_encrypt 函数左边少了个变量
    eabet
        8
    eabet  
    OP
       2016-12-15 14:22:28 +08:00
    @gouchaoer 应该没少呀,这段是 COPY 一个实例下来的
    eabet
        9
    eabet  
    OP
       2016-12-15 14:23:45 +08:00
    @lslqtz
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCabJDz/66tGW6J0SBHI3zTqz+v
    B7lkBwEcSnnaNJ6mAZ64Garc4Ax9lcFV9aUI3/v/w7LRnhPRnMCHc9HeBFS66jPi
    xlvk3cB/TYsVoxuQInTE/VmQDv+9cRlKYpemULGr6VoeOzAoEHz68g/YUZCjFBxb
    hTyOKutBoCorsAmQeQIDAQAB
    -----END PUBLIC KEY-----
    这一段是服务器公钥, 我用在线 RSA 加解密发现可以加密普通字符串 但是加密 JSON 数组的时候就是空的
    是这一段的问题吗??
    lslqtz
        10
    lslqtz  
       2016-12-15 16:06:31 +08:00 via iPhone
    @eabet 感觉你这个是私钥啊,不是 key 么。
    你开启报错的话不对应该会报错的。
    试试看 openssl_private_encrypt ?。。
    lslqtz
        11
    lslqtz  
       2016-12-15 16:07:28 +08:00 via iPhone
    @eabet 而且你贴出来的代码都是变量,不太清楚你变量里是啥,如果能打印 json 的话可以考虑贴一下
    fhefh
        12
    fhefh  
       2016-12-15 16:20:09 +08:00
    我用 phpseclib 这个库
    shoaly
        13
    shoaly  
       2016-12-15 16:42:43 +08:00
    @gouchaoer 你笑错了, 确实不用返回
    xqin
        14
    xqin  
       2016-12-15 18:17:11 +08:00   ❤️ 1
    @eabet 不是 JSON 数据的问题, 而是你的源数据串太长.
    就像 4 楼 @zhouheyang0919 说的那样, 不能加密太长的数据.
    附完整的测试代码:

    ```
    <?php

    $public_key = '
    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6BzEdnKKNifTOGk33p8+Sp4En
    OEsprSqbsTZgVRDmg2aLP5XhhSBlu4PPurMEz2W0tj1TyhkfJvdtkHuA629/760g
    HExMOaNHzJdwvkTJW7ZlBi4+KoI0F/48Y4i71kuXY6V6niIZjzypnEfMPyo2+CCE
    d1VeXOFqnjYmOHsG0wIDAQAB
    -----END PUBLIC KEY-----
    ';

    $private_key = '
    -----BEGIN RSA PRIVATE KEY-----
    MIICXAIBAAKBgQC6BzEdnKKNifTOGk33p8+Sp4EnOEsprSqbsTZgVRDmg2aLP5Xh
    hSBlu4PPurMEz2W0tj1TyhkfJvdtkHuA629/760gHExMOaNHzJdwvkTJW7ZlBi4+
    KoI0F/48Y4i71kuXY6V6niIZjzypnEfMPyo2+CCEd1VeXOFqnjYmOHsG0wIDAQAB
    AoGALhD7265fHpesFKG07wASSenK9NBe5IoqQ/XFVmOaVMrzSMZNMlSKKkceJAHC
    tQ06zV5Xn3krcWhv2yTtQIaMzH/LAqNvisGrS8W5S/i9rGECXINNmmym0yYzHyvW
    TrTuFvABiO9jAPe7a26hY2SibJ7/rbRykxmm69EvimuKoakCQQD2JpR8dcgEmqNk
    q+m4RifXDFet5grvjX/6Ow9Cb+ZnUDKu1jEmqtebBorVFka3adCfcmyaeVQvol4D
    4pDVne3dAkEAwXjAfhgSNBYjUzkgLMHuBztPDMDQbqjtZGEeKQIUJetCKMI2CLdH
    luqfRjHSKUBC/Vu5j/i1axCubdJeBHA0bwJAOrVi7vhsl2SGmglCulfJQspH00st
    yor2Pil97zufOX7wR7EAkhdnSytZS49/mFldj9oLuyA7Cw1v3P9Zyglb5QJAZG1s
    5kdSc60mKxYVKIaGK0TTFNilmTug9qEfCcRldwV2szeU2tNgmusxQDuuTvFnlKJf
    YWeFrIzdLm6rlPw1iwJBAKM33BIVC1QSRHrpC1kUHGPFSC7R2ISaT8Mjfh/shRn9
    Lmsv3CzXRPZRfxxt4fyYp8rIllo97Gd/xWWNAMlnXBQ=
    -----END RSA PRIVATE KEY-----
    ';

    $pi_key = openssl_pkey_get_private($private_key);
    $pu_key = openssl_pkey_get_public($public_key);


    $terId = 1111111111;
    $businessOrdid = 222222222;
    $orderName = '$orderName 带空格,带汉字,带,全半角内容';
    $Gold = 100;
    $selfParam = '234lkajsdfasdf';
    $syncURL = 'http://test.com/sync';
    $asynURL = 'http://test.com/async';
    $payType = 'test';



    $encrypted = '';
    $json = array();
    $json['terId'] = $terId;
    $json['businessOrdid'] = $businessOrdid;
    $json['orderName'] = $orderName;

    /*
    $json['tradeMoney'] = $Gold;
    $json['selfParam'] = $selfParam;
    $json['syncURL'] = $syncURL;
    $json['asynURL'] = $asynURL;
    $json['payType'] = $payType;
    $json['appSence'] = '1001';
    */

    $data = json_encode($json, JSON_UNESCAPED_UNICODE);


    $r = openssl_public_encrypt($data, $encrypted, $pu_key);//公钥加密

    if($r === FALSE){
    echo "加密失败!";
    die();
    }


    $encrypted = base64_encode($encrypted);
    echo $encrypted,"\n";

    echo "private key decrypt:\n";
    openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//私钥解密
    echo $decrypted,"\n";
    ```

    把上面代码里注释的那部分数据打开, 你就会发现它会加密失败.
    lslqtz
        15
    lslqtz  
       2016-12-15 21:57:10 +08:00
    @xqin 我回答错了,已感谢。
    可为什么会导致这个问题呢。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1179 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:49 · PVG 01:49 · LAX 09:49 · JFK 12:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.