3des php,PHP7 3DES加解密

// ===============================================================================

/*

* lvesu.com

* Note:

* 加解密

*

*/

// ===============================================================================

class Crypt3Des

{

private $key = "";

private $iv = "";

/**

* 构造,传递二个已经进行base64_encode的KEY与IV

*

* @param string $key

* @param string $iv

*/

function __construct($key, $iv)

{

if (empty($key) || empty($iv)) {

echo 'key and iv is not valid';

exit();

}

$this->key = $key;

$this->iv = $iv;//8

//$this->iv = $iv.'00000000000';//16

}

/**

* @title 加密

* @param string $value 要传的参数

* @ //OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING //AES-128-ECB|AES-256-CBC|BF-CBC

* @return json

* */

public function encrypt($value)

{

//参考地址:https://stackoverflow.com/questions/41181905/php-mcrypt-encrypt-to-openssl-encrypt-and-openssl-zero-padding-problems#

$value = $this->PaddingPKCS7($value);

$key = base64_decode($this->key);

$iv = base64_decode($this->iv);

//AES-128-ECB|不能用 AES-256-CBC|16 AES-128-CBC|16 BF-CBC|8 aes-128-gcm|需要加$tag  DES-EDE3-CBC|8

$cipher = "DES-EDE3-CBC";

if (in_array($cipher, openssl_get_cipher_methods())) {

//$ivlen = openssl_cipher_iv_length($cipher);

// $iv = openssl_random_pseudo_bytes($ivlen);

$result = openssl_encrypt($value, $cipher, $key, OPENSSL_SSLV23_PADDING, $iv);

//$result = base64_encode($result); //为3的时间要用

//store $cipher, $iv, and $tag for decryption later

/* $original_plaintext = openssl_decrypt($result, $cipher, $key, OPENSSL_SSLV23_PADDING, $iv);

echo $original_plaintext."\n";*/

}

return $result;

}

/**

* @title 解密

* @param string $value 要传的参数

* @return json

* */

public function decrypt($value)

{

$key = base64_decode($this->key);

$iv = base64_decode($this->iv);

$decrypted = openssl_decrypt($value, 'DES-EDE3-CBC', $key, OPENSSL_SSLV23_PADDING, $iv);

$ret = $this->UnPaddingPKCS7($decrypted);

return $ret;

}

private function PaddingPKCS7($data)

{

//$block_size = mcrypt_get_block_size('tripledes', 'cbc');//获取长度

//$block_size = openssl_cipher_iv_length('tripledes', 'cbc');//获取长度

$block_size = 8;

$padding_char = $block_size - (strlen($data) % $block_size);

$data .= str_repeat(chr($padding_char), $padding_char);

return $data;

}

private function UnPaddingPKCS7($text)

{

$pad = ord($text{strlen($text) - 1});

if ($pad > strlen($text)) {

return false;

}

if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {

return false;

}

return substr($text, 0, -1 * $pad);

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP和Java都有支持3DES密和解密的库,可以通过这些库来实现互通。以下是一个简单的PHP和Java之间3DES密和解密的例子: PHP代码: ```php $key = "123456789012345678901234"; // 24位密钥 $data = "Hello, world!"; // 待密的数据 // 密 $encrypted = openssl_encrypt($data, "DES-EDE3", $key, OPENSSL_RAW_DATA); $encrypted = base64_encode($encrypted); // 转成base64字符串 // 解密 $encrypted = base64_decode($encrypted); // 将base64字符串转成二进制数据 $decrypted = openssl_decrypt($encrypted, "DES-EDE3", $key, OPENSSL_RAW_DATA); echo $decrypted; // 输出:Hello, world! ``` Java代码: ```java import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESedeKeySpec; import java.util.Base64; public class Main { public static void main(String[] args) throws Exception { String key = "123456789012345678901234"; // 24位密钥 String data = "Hello, world!"; // 待密的数据 // 密 byte[] encrypted = encrypt(data.getBytes("UTF-8"), key.getBytes("UTF-8")); String encryptedStr = Base64.getEncoder().encodeToString(encrypted); // 转成base64字符串 System.out.println(encryptedStr); // 解密 byte[] encryptedBytes = Base64.getDecoder().decode(encryptedStr); // 将base64字符串转成二进制数据 byte[] decrypted = decrypt(encryptedBytes, key.getBytes("UTF-8")); System.out.println(new String(decrypted, "UTF-8")); // 输出:Hello, world! } public static byte[] encrypt(byte[] data, byte[] key) throws Exception { DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey secretKey = keyFactory.generateSecret(spec); Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); return cipher.doFinal(data); } public static byte[] decrypt(byte[] data, byte[] key) throws Exception { DESedeKeySpec spec = new DESedeKeySpec(key); SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede"); SecretKey secretKey = keyFactory.generateSecret(spec); Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secretKey); return cipher.doFinal(data); } } ``` 这两段代码都使用了3DES算法进行密和解密PHP使用了OpenSSL库,Java使用了JCE库。在密时,PHP和Java都使用了相同的密钥和密模式(ECB),因此可以互相解密

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值