欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

PHP、Java des加密解密实例

程序员文章站 2022-05-22 13:14:45
des加密是对称加密中在互联网应用的比较多的一种加密方式,php 通过mcrypt扩展库来支持des加密,要在php中使用des加密,需要先安装mcrypt扩展库 下面是...

des加密是对称加密中在互联网应用的比较多的一种加密方式,php 通过mcrypt扩展库来支持des加密,要在php中使用des加密,需要先安装mcrypt扩展库

下面是加密解密的实例

复制代码 代码如下:

$iv_size = mcrypt_get_iv_size(mcrypt_rijndael_256, mcrypt_mode_ecb); 
$iv = mcrypt_create_iv($iv_size, mcrypt_rand); 
$key = "this is a very secret key";//密钥 
$text = "meet me at 11 o'clock behind the monument.";//需要加密的内容 
echo ($text) . "\n"; 
 
$crypttext =base64_encode(mcrypt_encrypt(mcrypt_rijndael_256, $key, $text, mcrypt_mode_ecb, $iv)); 
echo $crypttext . "\n";//加密后的内容 
 
echo mcrypt_decrypt(mcrypt_rijndael_256,$key,base64_decode($crypttext),mcrypt_mode_ecb,$iv);//解密后的内容 

在aes加密算法中通常会用到mcrypt_rijndael_128、mcrypt_rijndael_192、mcrypt_rijndael_256三种,后面的128、192、256代表的是秘钥(也就是加密的key)是多少bit的,比如使用的是mcrypt_rijndael_128,那么用这个算法加密时秘钥长度就是128bit的,比如 $key = 'fjjda0&9^$$#+*%$fada',是20个字符,那在实际加密的时候只用到前16个字符加密(16*8=128),不足128bit的php中会用'\0'来补齐。

有的时候做项目对接的时候,可能你用的是php加密的,而对方用的是java写的,对接的过程中就发现机加密后的内容对方解密不了,这是因为php跟java在实现这个算法的时候有差别,要想正确加密解密需要两边都做下处理:

php:

复制代码 代码如下:

<?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 ); 

java:
复制代码 代码如下:

import javax.crypto.cipher; 
import javax.crypto.spec.secretkeyspec; 
  
import org.apache.commons.codec.binary.base64; 
  
public class security { 
    public static string encrypt(string input, string key){ 
        byte[] crypted = null; 
        try{ 
            secretkeyspec skey = new secretkeyspec(key.getbytes(), "aes"); 
            cipher cipher = cipher.getinstance("aes/ecb/pkcs5padding"); 
            cipher.init(cipher.encrypt_mode, skey); 
            crypted = cipher.dofinal(input.getbytes()); 
        }catch(exception e){ 
        system.out.println(e.tostring()); 
    } 
    return new string(base64.encodebase64(crypted)); 

  
    public static string decrypt(string input, string key){ 
        byte[] output = null; 
        try{ 
            secretkeyspec skey = new secretkeyspec(key.getbytes(), "aes"); 
            cipher cipher = cipher.getinstance("aes/ecb/pkcs5padding"); 
            cipher.init(cipher.decrypt_mode, skey); 
            output = cipher.dofinal(base64.decodebase64(input)); 
            }catch(exception e){ 
            system.out.println(e.tostring()); 
        } 
        return new string(output); 
    } 
  
    public static void main(string[] args) { 
        string key = "1234567891234567"; 
        string data = "example"; 
         
        system.out.println(security.encrypt(data, key)); 
         
        system.out.println(security.decrypt(security.encrypt(data, key), key)); 
         
             
    }