zoukankan      html  css  js  c++  java
  • php AES加密 对应Java SHA1PRNG方式加密

    做对接的时候,服务商做的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;
        }
    

      

  • 相关阅读:
    整数划分《递归法》
    hdu 1224 Free DIY Tour
    HTTP Response Status Code HTTP响应代码中文详解
    Webserive学习站点
    页面的回传与回调
    JS中apply和call函数的运用
    SOAP协议详解
    JS在firefox和IE下差异及解决方案
    关于路径的问题
    .NET中IDisposable接口的基本使用 (转)
  • 原文地址:https://www.cnblogs.com/dragon16/p/7238858.html
Copyright © 2011-2022 走看看