PHP DES解密 對應Java SHA1PRNG方式加密


  • 背景及問題

  背景:在和外部系統通過HTTP方式跳轉時, 為保障傳輸參數安全性, 采用AES 加密參數. 關於對稱加密中 AES, DES, CBC, ECB, PKCS5Padding 概念可參考https://blog.csdn.net/qq_35698774/article/details/78964249 

 

  問題:  我方技術java, 對方使用PHP.  使用同樣加密算法DES, 加密模式ECB, 填充方式PKCS5Padding, 編碼處理BASE64, 解密仍失敗. 最終發現原因: JAVA 端加密時使用了SHA1PRNG, 通過google最終解決 , 拿來分享.

加密代碼中黃色部分是解決linux下隨機生成key添加的. 正是這個代碼 ,導致php解密異常.

 1 private static SecretKeySpec getSecretKey(final String key) {
 2         //返回生成指定算法密鑰生成器的 KeyGenerator 對象
 3         KeyGenerator kg = null;
 4 
 5         try {
 6             kg = KeyGenerator.getInstance(KEY_ALGORITHM);
 7             //防止linux下 隨機生成key
 8             SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");  9             secureRandom.setSeed(key.getBytes());
10             //DES 要求密鑰長度為 56
11             kg.init(56, secureRandom);
12 
13             //生成一個密鑰
14             SecretKey secretKey = kg.generateKey();
15 
16             return new SecretKeySpec(secretKey.getEncoded(), KEY_ALGORITHM);// 轉換為DES專用密鑰
17         } catch (NoSuchAlgorithmException ex) {
18             Logger.getLogger(DESUtils.class.getName()).log(Level.SEVERE, null, ex);
19         }
20 
21         return null;
22     }

 

  • 解決方法

  php 代碼:

  

    /**
     * 解密
     *
     * @param $encrypted
     * @return string
     */
    public function decrypt($encrypted)
    {
        if ($this->output == self::OUTPUT_BASE64) {
            $encrypted = base64_decode($encrypted);
        } else if ($this->output == self::OUTPUT_HEX) {
            $encrypted = hex2bin($encrypted);
        }
        $key2 = substr(openssl_digest(openssl_digest($this->key, 'sha1', true), 'sha1', true), 0, 16); $sign = @openssl_decrypt($encrypted, $this->method, $key2, $this->options, $this->iv);
        $sign = $this->unPkcsPadding($sign);
        $sign = rtrim($sign);
        return $sign;
    }

    代碼中,  綠色部分是解決此問題關鍵.

  $key2 = substr(openssl_digest(openssl_digest($this->key, 'sha1', true), 'sha1', true), 0, 16);

 

  • 新技能
  1. 在線PHP運行環境

    由於之前未接觸php, 本地搭建php環境代價較多, 直接找在線的php環境 , 如https://www.dooccn.com/php/, 可直接運行, 並有錯誤調試信息, 非常方便.

  •   總結

  技術問題google 真的是靠譜,  找准搜索關鍵詞至關重要.

參考:

JAVA安全與加密 https://www.jianshu.com/p/1ea4c7cb83f3

https://www.jianshu.com/p/9591a3f59b19

https://www.cnblogs.com/dragon16/p/7238858.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM