国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP DES-ECB加密對接Java解密

jsliang / 2338人閱讀

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

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

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

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

public class DesUtils {

    /** 默認密鑰 */
    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 進制值的字符串, 如: 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;
        // 每個byte用兩個字符才能表示,所以字符串的長度是數(shù)組長度的兩倍
        StringBuffer sb = new StringBuffer(iLen * 2);
        for(int i = 0; i < iLen; i++) {
            int intTmp = arrB[i];
            // 把負數(shù)轉(zhuǎn)換為正數(shù)
            while(intTmp < 0) {
                intTmp = intTmp + 256;
            }
            // 小于0F的數(shù)需要在前面補0
            if(intTmp < 16) {
                sb.append("0");
            }
            sb.append(Integer.toString(intTmp, 16));
        }
        return sb.toString();
    }

    /**
     * 將 表 示 16 進 制 值 的 字 符 串 轉(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;
        // 兩個字符表示一個字節(jié),所以字節(jié)數(shù)組長度是字符串長度除以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ù)組長度為 8 位 不足 8 位時后面補 0 , 超出 8 位只取前 8 位
     * @param arrBTmp 構(gòu)成該字符串的字節(jié)數(shù)組
     * @return 生成的密鑰
     * @throws java.lang.Exception
     */
    private static Key getKey(byte[] arrBTmp) throws Exception {
        // 創(chuàng)建一個空的8位字節(jié)數(shù)組(默認值為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實現(xiàn)加密功能的的方法有兩種:

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


輸出為:990389f0aad8d12014ca6a45cd72cdf7

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


輸出為:990389f0aad8d12014ca6a45cd72cdf7

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71989.html

相關(guān)文章

  • PHP DES-ECB加密對接Java解密

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

    maybe_009 評論0 收藏0
  • php如何openssl_encrypt加密解密

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

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

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

    dockerclub 評論0 收藏0
  • PHP AES cbc模式 pkcs7 128加密解密

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

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

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

    hatlonely 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<