成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP DES-ECB加密對(duì)接Java解密

jsliang / 2357人閱讀

摘要:最近公司有個(gè)業(yè)務(wù),需要對(duì)接第三方接口,但是參數(shù)是需要加密的,對(duì)方也只提供了一個(gè)的,在網(wǎng)上到處搜索,沒有找到直接就能用的方法,后來還是跟公司的工程師對(duì)接出來的,在這里記錄一下大致的流程。

最近公司有個(gè)業(yè)務(wù),需要對(duì)接第三方接口,但是參數(shù)是需要加密的,對(duì)方也只提供了一個(gè)java的demo,在網(wǎng)上到處搜索,沒有找到直接就能用的方法,后來還是跟公司的Android工程師對(duì)接出來的,在這里記錄一下大致的流程。
首先說明一下對(duì)方要求的接口請(qǐng)求方式,格式為:http://ip:port/interface/method?data=摘要@@16進(jìn)制字符串
說明:

1. 請(qǐng)求參數(shù)需要組合成a=1&b=2&c=3格式的參數(shù)串;
2. 摘要的生成方法為md5("a=1&b=2&c=3");
3. 16進(jìn)制字符串的生成方法是將參數(shù)串進(jìn)行**對(duì)稱加密(DES-ECB)**后再轉(zhuǎn)成16進(jìn)制字符串(bin2hex函數(shù));

對(duì)方提供的demo(java版本)如下:

public class DesUtils {

    /** 默認(rèn)密鑰 */
    private static String strDefaultKey = "seeyonssokey";

    /** 加密工具 */
    private Cipher encryptCipher;

    /** 解密工具 */
    private Cipher decryptCipher;

    /**
     * 加密字符串
     * @param strIn 需加密的字符串
     * @return 加密后的字符串
     * @throws Exception
     */
    public String encrypt(String strIn) throws Exception {
        return byteArr2HexStr(encryptCipher.doFinal(strIn.getBytes()));
    }

    /**
     * 解密字符串
     * @param strIn 需解密的字符串
     * @return 解密后的字符串
     * @throws Exception
     */
    public String decrypt(String strIn) throws Exception {
        return new String(decryptCipher.doFinal(hexStr2ByteArr(strIn)));
    }

    /**
     * 將 byte 數(shù)組轉(zhuǎn)換為表示 16 進(jìn)制值的字符串, 如: byte[]{8,18} 轉(zhuǎn)換為: 0813 , 和 public static
     * byte[] hexStr2ByteArr(String strIn) 互為可逆的轉(zhuǎn)換過程
     * @param arrB 需要轉(zhuǎn)換的 byte 數(shù)組
     * @return 轉(zhuǎn)換后的字符串
     * @throws Exception 本方法不處理任何異常,所有異常全部拋出
     */
    public static String byteArr2HexStr(byte[] arrB) throws Exception {
        int iLen = arrB.length;
        // 每個(gè)byte用兩個(gè)字符才能表示,所以字符串的長(zhǎng)度是數(shù)組長(zhǎng)度的兩倍
        StringBuffer sb = new StringBuffer(iLen * 2);
        for(int i = 0; i < iLen; i++) {
            int intTmp = arrB[i];
            // 把負(fù)數(shù)轉(zhuǎn)換為正數(shù)
            while(intTmp < 0) {
                intTmp = intTmp + 256;
            }
            // 小于0F的數(shù)需要在前面補(bǔ)0
            if(intTmp < 16) {
                sb.append("0");
            }
            sb.append(Integer.toString(intTmp, 16));
        }
        return sb.toString();
    }

    /**
     * 將 表 示 16 進(jìn) 制 值 的 字 符 串 轉(zhuǎn) 換 為 byte 數(shù) 組 , 和 public static String
     * byteArr2HexStr(byte[] arrB) 互為可逆的轉(zhuǎn)換過程
     * @param strIn 需要轉(zhuǎn)換的字符串
     * @return 轉(zhuǎn)換后的 byte 數(shù)組
     * @throws Exception 本方法不處理任何異常,所有異常全部拋出
     * @author LiGuoQing
     */
    public static byte[] hexStr2ByteArr(String strIn) throws Exception {
        byte[] arrB = strIn.getBytes();
        int iLen = arrB.length;
        // 兩個(gè)字符表示一個(gè)字節(jié),所以字節(jié)數(shù)組長(zhǎng)度是字符串長(zhǎng)度除以2
        byte[] arrOut = new byte[iLen / 2];
        for(int i = 0; i < iLen; i = i + 2) {
            String strTmp = new String(arrB, i, 2);
            arrOut[i / 2] = (byte)Integer.parseInt(strTmp, 16);
        }
        return arrOut;
    }

    /**
     * 從指定字符串生成密鑰,密鑰所需的字節(jié)數(shù)組長(zhǎng)度為 8 位 不足 8 位時(shí)后面補(bǔ) 0 , 超出 8 位只取前 8 位
     * @param arrBTmp 構(gòu)成該字符串的字節(jié)數(shù)組
     * @return 生成的密鑰
     * @throws java.lang.Exception
     */
    private static Key getKey(byte[] arrBTmp) throws Exception {
        // 創(chuàng)建一個(gè)空的8位字節(jié)數(shù)組(默認(rèn)值為0)
        byte[] arrB = new byte[8];
        // 將原始字節(jié)數(shù)組轉(zhuǎn)換為8位
        for(int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
            arrB[i] = arrBTmp[i];
        }
        // 生成密鑰
        Key key = new SecretKeySpec(arrB, "DES");
        return key;
    }

    public static String encrypt(String strIn, String secretkey) throws Exception {
        Key key = getKey(secretkey.getBytes("utf-8"));
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return byteArr2HexStr(cipher.doFinal(strIn.getBytes("utf-8")));
    }

    public static String decrypt(String strIn, String secretkey) throws Exception {
        Key key = getKey(secretkey.getBytes("utf-8"));
        Cipher cipher = Cipher.getInstance("DES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] param = cipher.doFinal(hexStr2ByteArr(strIn));
        return new String(param, "utf-8");
    }
}

PHP實(shí)現(xiàn)加密功能的的方法有兩種:

mcrypt方式(適用于php7.0以前的版本):


輸出為:990389f0aad8d12014ca6a45cd72cdf7

openssl方式(適用于php7.0以后的版本):


輸出為:990389f0aad8d12014ca6a45cd72cdf7

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71989.html

相關(guān)文章

  • PHP DES-ECB加密對(duì)接Java解密

    摘要:最近公司有個(gè)業(yè)務(wù),需要對(duì)接第三方接口,但是參數(shù)是需要加密的,對(duì)方也只提供了一個(gè)的,在網(wǎng)上到處搜索,沒有找到直接就能用的方法,后來還是跟公司的工程師對(duì)接出來的,在這里記錄一下大致的流程。 最近公司有個(gè)業(yè)務(wù),需要對(duì)接第三方接口,但是參數(shù)是需要加密的,對(duì)方也只提供了一個(gè)java的demo,在網(wǎng)上到處搜索,沒有找到直接就能用的方法,后來還是跟公司的Android工程師對(duì)接出來的,在這里記錄一下...

    maybe_009 評(píng)論0 收藏0
  • php如何openssl_encrypt加密解密

    摘要:密鑰長(zhǎng)度是位,超過位數(shù)密鑰被忽略??缯Z言做加密解密經(jīng)常會(huì)出現(xiàn)問題,往往是填充方式不對(duì)編碼不一致或者加密解密模式?jīng)]有對(duì)應(yīng)上造成。是為了兼容用加密的結(jié)果。 最近在對(duì)接客戶的CRM系統(tǒng),獲取令牌時(shí),要用DES方式加密解密,由于之前沒有搞錯(cuò)這種加密方式,經(jīng)過請(qǐng)教了百度和谷歌兩個(gè)老師后,結(jié)合了多篇文檔內(nèi)容后,終于實(shí)現(xiàn)了。 一、DES介紹 DES 是對(duì)稱性加密里面常見一種,全稱為 Data Enc...

    JouyPub 評(píng)論0 收藏0
  • PHP的openssl加密擴(kuò)展使用小結(jié)

    摘要:非對(duì)稱加密與對(duì)稱加密相對(duì)的是非對(duì)稱加密,非對(duì)稱加密的核心思想是使用一對(duì)相對(duì)的密匙,分為公匙和私匙,私匙自己安全保存,而將公匙公開。 引言 互聯(lián)網(wǎng)的發(fā)展史上,安全性一直是開發(fā)者們相當(dāng)重視的一個(gè)主題,為了實(shí)現(xiàn)數(shù)據(jù)傳輸安全,我們需要保證:數(shù)據(jù)來源(非偽造請(qǐng)求)、數(shù)據(jù)完整性(沒有被人修改過)、數(shù)據(jù)私密性(密文,無法直接讀?。┑?。雖然現(xiàn)在已經(jīng)有SSL/TLS協(xié)議實(shí)現(xiàn)的HTTPS協(xié)議,但是因在客戶...

    dockerclub 評(píng)論0 收藏0
  • PHP AES cbc模式 pkcs7 128加密解密

    摘要:今天在對(duì)接一個(gè)第三方接口的時(shí)候,對(duì)方需要模式下的加密。這里簡(jiǎn)單寫一個(gè)獲取庫存,更新價(jià)格信息加密結(jié)果解密結(jié)果加密數(shù)據(jù)解密數(shù)據(jù)執(zhí)行方法加密結(jié)果解密結(jié)果 今天在對(duì)接一個(gè)第三方接口的時(shí)候,對(duì)方需要AES CBC模式下的加密。這里簡(jiǎn)單寫一個(gè)demo class Model_Junjingbao extends Model { private static $_partnerKey...

    Jaden 評(píng)論0 收藏0
  • 基于 lumen 的微服務(wù)架構(gòu)實(shí)踐

    摘要:現(xiàn)在的提供了一種更易于使用和維護(hù)的計(jì)劃任務(wù)方式。注意事項(xiàng)建議開啟這樣會(huì)極大的加速類的加載。 lumen 為速度而生的 Laravel 框架 官網(wǎng)的介紹很簡(jiǎn)潔,而且 lumen 確實(shí)也很簡(jiǎn)單,我在調(diào)研了 lumen 相關(guān)組件(比如緩存,隊(duì)列,校驗(yàn),路由,中間件和最重要的容器)之后認(rèn)為已經(jīng)能夠滿足我目前這個(gè)微服務(wù)的需求了。 任務(wù)目標(biāo) showImg(https://segmentfault...

    hatlonely 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<