一个java  api里面的加密解密过程,现在希望通过php实现,捣鼓了半天搞不定,特来求助加密过程:
1.把待加密字符串S转换成UTF-8编码的字节数组B。
2.把B补齐成8的整数倍,用0x00进行填充,填充后形成B1,补齐0x00的个数为M1。
3.随机生成16字节的DESede密钥K1。
4.使用K1对B1进行DESede加密,生成M2。
5.使用RSA公钥对K1进行RSA加密,生成M3。
6.把M1、M2、M3拼装在一起形成最终密文M。
M=M1+M2+M3
7.把M转换成16进制字符串H
例如: 0x05,0x6A,0x67,0x8D --> “056A678D”加密示例:
明文=”hi, this is a test”
密钥:
模数=251767060929432528453674665284960515581
公钥子数=65537
私钥子数=223973071491032169187666453871333169473使用公钥(模数和公钥子数)加密,
结果= "0680BC9567A89E567D50211F5DAAD828EB1DE1E334E0F939D1459
B0194CBE56CC9F830BC0217210EC7170D9D7BCE1AEA12CE84FB9414777D39"使用私钥(模数和私钥子数)解密,
结果=”hi, this is a test”

解决方案 »

  1.   

    我觉得把你的java、php代码都贴出来,集思广益
      

  2.   

    这是找到的java代码,php代码木有public static String encryptByPublic(String src, String mod, String pubEx)
    {
    byte desKey[];
    int padLen;
    byte desData[];
    desKey = generateRandomDESedeKey();
    byte srcByte[] = src.getBytes("UTF-8");
    padLen = srcByte.length % 8 != 0 ? 8 - srcByte.length % 8 : 0;
    byte srcBytePadding[] = new byte[srcByte.length + padLen];
    System.arraycopy(srcByte, 0, srcBytePadding, 0, srcByte.length);
    desData = ThreeDESUtil.encryptData(desKey, srcBytePadding);
    if (desData == null)
    return null;
    byte rasData[];
    RSAPublicKey rsaKey = RSAUtil.createRSAPublicKeyByModulus(mod, pubEx);
    rasData = RSAUtil.encrypt(rsaKey, desKey);
    if (rasData == null)
    return null;
    String ret;
    ret = "";
    ret = (new StringBuilder(String.valueOf(ret))).append(StringUtil.byte2hex(new byte[] {
    (byte)(padLen & 0xff)
    })).toString();
    ret = (new StringBuilder(String.valueOf(ret))).append(StringUtil.byte2hex(desData)).toString();
    ret = (new StringBuilder(String.valueOf(ret))).append(StringUtil.byte2hex(rasData)).toString();
    return ret;
    Exception e;
    e;
    e.printStackTrace();
    return null;
    }public static String decryptByPrivate(String src, String mod, String priEx)
    {
    String ret;
    byte srcByte[] = StringUtil.hex2byte(src);
    int padLen = srcByte[0];
    byte desData[] = new byte[srcByte.length - 1 - 32];
    byte rsaData[] = new byte[32];
    System.arraycopy(srcByte, 1, desData, 0, desData.length);
    System.arraycopy(srcByte, srcByte.length - rsaData.length, rsaData, 0, rsaData.length);
    RSAPrivateKey rsaKey = RSAUtil.createRSAPrivateKeyByModulus(mod, priEx);
    byte desKey[] = RSAUtil.decrypt(rsaKey, rsaData);
    byte desDec[] = ThreeDESUtil.decryptData(desKey, desData);
    byte desRet[] = new byte[desDec.length - padLen];
    System.arraycopy(desDec, 0, desRet, 0, desRet.length);
    ret = new String(desRet, "UTF-8");
    return ret;
    Exception e;
    e;
    e.printStackTrace();
    return null;
    }
      

  3.   

    恩PHP 代码有,还不少,你下个看看爸爸
      

  4.   

    你不是“捣鼓了半天搞不定”吗?那至少也有一些 php 代码了吧?加密过程:
    1.把待加密字符串S转换成UTF-8编码的字节数组B。
    设 $s 为 utf-8 字符串,则
    $B = unpack('C*', $s);2.把B补齐成8的整数倍,用0x00进行填充,填充后形成B1,补齐0x00的个数为M1。
    $M1 = count($B) % 8;
    $B1 = $B;
    for($i=0; $i<$M1; $i++) $B1[] = 0;3.随机生成16字节的DESede密钥K1。
    4.使用K1对B1进行DESede加密,生成M2。
    5.使用RSA公钥对K1进行RSA加密,生成M3。
    6.把M1、M2、M3拼装在一起形成最终密文M。
    M=M1+M2+M3
    7.把M转换成16进制字符串H
    例如: 0x05,0x6A,0x67,0x8D --> “056A678D”
    假定 $M 是字符串
    则 $H = current(unpack('H*', $M));
    把字节数组换原成字符串:
    array_unshift($array, 'C*');
    $str = call_user_func_array('pack', $array);
      

  5.   

      网上找个php加密类直接用就好了