PHP对接java的AES/ECB/PKCS5Padding加密方式

因项目需要,要和一家保险公司对接调用API,我公司是PHP后台,保险公司是java后台,中间的数据传输就避免不了要加密、解密了,目前通行的加密AES比较推荐。

对接的过程中,就难免要翻山越水的了,

下面是我对接公司的加密说明:

一定要屡清楚自己的加密方式,否则一个加密模式ECB、CBC的差别,结果就千差万别的。

附上最终能使用的代码:

<?php
class Security {
	public static function encrypt($input, $key) {
	$size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
	$input = Security::pkcs5_pad($input, $size);
	$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, ‘‘, MCRYPT_MODE_ECB, ‘‘);
	$iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
	mcrypt_generic_init($td, $key, $iv);
	$data = mcrypt_generic($td, $input);
	mcrypt_generic_deinit($td);
	mcrypt_module_close($td);
	$data = base64_encode($data);
	return $data;
	}
 
	private static function pkcs5_pad ($text, $blocksize) {
		$pad = $blocksize - (strlen($text) % $blocksize);
		return $text . str_repeat(chr($pad), $pad);
	}
 
	public static function decrypt($sStr, $sKey) {
		$decrypted= mcrypt_decrypt(
		MCRYPT_RIJNDAEL_128,
		$sKey,
		base64_decode($sStr),
		MCRYPT_MODE_ECB
	);

		$dec_s = strlen($decrypted);
		$padding = ord($decrypted[$dec_s-1]);
		$decrypted = substr($decrypted, 0, -$padding);
		return $decrypted;
	}
}
 
 
 
// $key = "1234567891234567";
// $data = "example";
 
// $value = Security::encrypt($data , $key );
// echo "加密::".$value.‘<br/>‘;
// echo Security::decrypt($value, $key );

公共函数中调用:

/**
     * request body加密
     * @param array $content 投保人的信息
     * @return string
     */
    function hetai_encrypt($content) {
        
        // 方案七
        print_r("\r\n");
        vendor(‘encrypt.Security‘) or die("方案7引入失败");
        $sec = new \Security();
        $string = $content;
        $sec_res = $sec->encrypt($string, base64_decode("eeSvvVtUDLi5lTBHDjCeFw=="));
        $sec_res = strToHex($sec_res);// 结果转16进制并转成大写
        // 这里做了好几次的转换
        // 只是为了迎合出来我需要的结果而已
        // 根据自己的加密要求来定
        $encrypt_upper = strToHex(base64_decode(hexToStr($sec_res)));
        var_dump("\r\n方案7加密的结果\r\n" . $encrypt_upper);
        // 解密
        $sec_res_lower = strtolower($sec_res);// 转小写
        $sec_res_lower_tostr = hexToStr($sec_res);// 16进制转成string
        $sec_dec = $sec->decrypt($sec_res_lower_tostr, base64_decode("eeSvvVtUDLi5lTBHDjCeFw=="));
        var_dump("\r\n方案7解密的结果\r\n" . $sec_dec);
        return $encrypt_upper;
        
    }

二进制字符串转16进制、16进制字符串转二进制:

/**
     * 字符串转十六进制
     * @param string $string
     * @return string
     */
    function strToHex($string)
    {
        $hex="";
        for($i=0;$i<strlen($string);$i++)
            $hex.=dechex(ord($string[$i]));
        $hex=strtoupper($hex);
        return $hex;
    }
    
    /**
     * 十六进制转字符串
     * 16进制的转为2进制字符串    
     * @param 十六进制 $hex
     * @return string
     */
    function hexToStr($hex)
    {
        $string="";
        for($i=0;$i<strlen($hex)-1;$i+=2)
            $string.=chr(hexdec($hex[$i].$hex[$i+1]));
        return  $string;
    }

附上折磨我三天的加密功能块,仅供自己作提醒之用,不喜勿喷~

相同问题的

时间: 2024-08-12 09:55:50

PHP对接java的AES/ECB/PKCS5Padding加密方式的相关文章

golang AES/ECB/PKCS5 加密解密 url-safe-base64

因为项目的需要用到golang的一种特殊的加密解密算法AES/ECB/PKCS5,但是算法并没有包含在标准库中,经过多次失败的尝试,终于解码成功,特此分享: /* 描述 : golang AES/ECB/PKCS5 加密解密 date : 2016-04-08 author: herohenu */ package main import ( "bytes" "crypto/aes" "crypto/cipher" "encoding/

java/php DES/CBC/PKCS5Padding加密解密算法实现过程

先看java代码 Java代码   public static String encrypt(String message, String key) throws Exception { Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding"); DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8")); SecretKeyFactory k

.NET 对接JAVA 使用Modulus,Exponent RSA 加密

最近有一个工作是需要把数据用RSA发送给Java 虽然一开始标准公钥 net和Java  RSA填充的一些算法不一样 但是后来这个坑也补的差不多了 具体可以参考 http://www.cnblogs.com/dudu/p/csharp-openssl-encrypt-decrypt.html 但是别人给我直接一串10进制的数字 然后我又查了一些.net 有一个RSAParameters的类, 我尝试把 modulus 转成Base64 然后生成 RSAParameters对象 然后 使用RSAC

php实现AES/CBC/PKCS5Padding加密解密

<?php class MagicCrypt { private $iv = "0102030405060708";//密钥偏移量IV private $encryptKey = "58e15e87488a47c9";//AESkey //加密 public function encrypt($encryptStr) { $localIV = $this->iv; $encryptKey = $this->encryptKey; //Open mo

C写的AES(ECB/PKCS5Padding)

摘自POLARSSL 1 #pragma once 2 3 #define AES_ENCRYPT 1 4 #define AES_DECRYPT 0 5 6 struct aes_context 7 { 8 int nr; /*!< number of rounds */ 9 unsigned int* rk; /*!< AES round keys */ 10 unsigned int buf[68]; /*!< unaligned data */ 11 }; 12 13 14 vo

AES/CBC/PKCS7Padding加密方式

在网上找了大半天资料,终于找到一个可以用的 public static class AES { // 算法名称 final static String KEY_ALGORITHM = "AES"; // 加解密算法/模式/填充方式 final static String algorithmStr = "AES/CBC/PKCS7Padding"; // private static Key key; private static Cipher cipher; boo

php与java通用AES加密解密算法

php与java通用AES加密解密算法 AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的AES加密解密算法. php版代码如下: <?php class CryptAES { protected $cipher = MCRYPT_RIJNDAEL_128; protected $mode = MCRYPT_MODE_ECB; protected

使用java进行 AES 加密 解密?

百度百科是这样定义的: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用.经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准.2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一. 1 imp

java使用AES加密解密 AES-128-ECB加密

http://www.cnblogs.com/chen-lhx/p/5817161.html ************************************************* import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import org.apache.commons.codec.binary.Base64; /** * * @author Administrator * */ pub