PHP 使用 RSA 公钥对 JSON 对象进行加密,加密不了? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
eabet
V2EX    PHP

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

  •  
  •   eabet 2016-12-14 18:31:02 +08:00 5120 次点击
    这是一个创建于 3238 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码如下:
    $json['terId'] = $terId;
    $json['businessOrdid'] = $businessOrdid;
    $json['orderName'] = $orderName;
    $json['tradeMoney'] = $Gold;
    $json['selfParam'] = $selfParam;
    $json['syncURL'] = $syncURL;
    $json['asynURL'] = $asynURL; br />$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 你笑错了, 确实不用返回
    O3YwA1ENkb7i35XJ
        14
    O3YwA1ENkb7i35XJ  
       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     Solana     2548 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 15:08 PVG 23:08 LAX 08:08 JFK 11:08
    Do have faith in what you're doing.
    ubao msn 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