首頁 >後端開發 >php教程 >php中關於AES加密對應Java中的SHA1PRNG方式加密的實例詳解

php中關於AES加密對應Java中的SHA1PRNG方式加密的實例詳解

黄舟
黄舟原創
2017-07-27 15:02:046186瀏覽

做對接的時候,服務商做的AES加密透過SHA1PRNG演算法(只要password一樣,每次產生的陣列都是一樣的,所以可以用來做加密解密的key)進行了又一次加密,搞了好幾個小時,直接看對應的程式碼吧,可以參考一下,只有Java的加密源碼


private static byte[] encrypt(byte[] byteContent, byte[] password) throws Exception
  {
    KeyGenerator kgen = KeyGenerator.getInstance("AES");
    SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    secureRandom.setSeed(password);
    kgen.init(128, secureRandom);
    SecretKey secretKey = kgen.generateKey();    byte[] enCodeFormat = secretKey.getEncoded();
    SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(1, key);    byte[] result = cipher.doFinal(byteContent);    return result;
  }


  private function _pkcs5Pad($text, $blockSize)
    {
        $pad = $blockSize - (strlen($text) % $blockSize);
        return $text . str_repeat(chr($pad), $pad);
    }

    private function _pkcs5Unpad($text)
    {
        $end = substr($text, -1);
        $last = ord($end);
        $len = strlen($text) - $last;
        if(substr($text, $len) == str_repeat($end, $last))
        {
            return substr($text, 0, $len);
        }
        return false;
    }

    public function encrypt($encrypt, $key)
    {
        $blockSize = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $paddedData = $this->_pkcs5Pad($encrypt, $blockSize);
        $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($ivSize, MCRYPT_RAND);
        $key2 = substr(openssl_digest(openssl_digest($key, 'sha1', true), 'sha1', true), 0, 16);
        $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key2, $paddedData, MCRYPT_MODE_ECB, $iv);
        return base64_encode($encrypted);
    }

    public function decrypt($decrypt, $key)
    {
        $decoded = $this->hex2bin($decrypt);
        $blockSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($blockSize, MCRYPT_RAND);
        $decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $decoded, MCRYPT_MODE_ECB, $iv);
        return $this->_pkcs5Unpad($decrypted);
    }

    function hex2bin($str)
    {
        $sbin = "";
        $len = strlen($str);
        for($i = 0; $i < $len; $i += 2)
        {
            $sbin .= pack("H*", substr($str, $i, 2));
        }

        return $sbin;
    }

以上是php中關於AES加密對應Java中的SHA1PRNG方式加密的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn