DES ECB模式JAVA PHP C#实现加密、解密兼容

来源:互联网 发布:网络语鹅是什么意思 编辑:程序博客网 时间:2024/06/04 17:53

版本一:

JAVA:

复制代码
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;import javax.crypto.*;import javax.crypto.spec.DESKeySpec;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.spec.InvalidKeySpecException;/** * 该加密工具兼容PHP */public class DesEcbCompatiblePhpUtil {    private static final Logger LOGGER = LoggerFactory.getLogger(DesEcbCompatiblePhpUtil.class);    /**     * 密钥算法     */    private static final String ALGORITHM = "DES";    /**     * 加解密算法/工作模式/填充方式     */    private static final String ALGORITHM_STR = "DES/ECB/NoPadding";    private static final String CHARSET = "UTF-8";    /**     * 填充内容     */    private static final String PAD_STR = "\0";    public static void main(String[] args) throws Exception {        String clearText = "123";        String key = "123";        System.out.println("明文:" + clearText + "\n密钥:" + key);        String encryptText = encrypt(clearText, key);        System.out.println("加密后:" + encryptText);        String decryptText = decrypt(encryptText, key);        System.out.println("解密后:"+decryptText);        System.out.println(decryptText.trim().equals("123456"));    }    public static String encrypt(String souce, String key) {        try {            return encryptByDes(pkcs5Pad(souce), pkcs5Pad(key));        } catch (Exception e) {            LOGGER.error("加密数据: {}异常,原因:{},{}", souce, e.getMessage(), e);        }        return "";    }    public static String decrypt(final String souce, final String key) {        try {            return decryptByDes(souce, pkcs5Pad(key)).trim();        } catch (Exception e) {            LOGGER.error("解密数据: {}异常,原因:{},{}", souce, e.getMessage(), e);        }        return "";    }    private static String encryptByDes(final String souce, final String key) throws InvalidKeyException,            NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException,            IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {        // DES算法要求有一个可信任的随机数源        SecureRandom sr = new SecureRandom();        // 从原始密匙数据创建DESKeySpec对象        DESKeySpec dks = new DESKeySpec(key.getBytes(CHARSET));        // 创建一个密匙工厂,然后用它把DESKeySpec转换成 一个SecretKey对象        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);        SecretKey key1 = keyFactory.generateSecret(dks);        // Cipher对象实际完成加密操作        Cipher cipher = Cipher.getInstance(ALGORITHM_STR);        // 用密匙初始化Cipher对象        cipher.init(Cipher.ENCRYPT_MODE, key1, sr);        // 现在,获取数据并加密        byte encryptedData[] = cipher.doFinal(souce.getBytes(CHARSET));        // 通过BASE64位编码成字符创形式        String base64Str = new BASE64Encoder().encode(encryptedData);        return base64Str;    }    private static String decryptByDes(final String souce, final String key) throws InvalidKeyException,            NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IOException,            IllegalBlockSizeException, BadPaddingException {        // DES算法要求有一个可信任的随机数源        SecureRandom sr = new SecureRandom();        // 从原始密匙数据创建DESKeySpec对象        DESKeySpec dks = new DESKeySpec(key.getBytes(CHARSET));        // 创建一个密匙工厂,然后用它把DESKeySpec转换成 一个SecretKey对象        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);        SecretKey key1 = keyFactory.generateSecret(dks);        // Cipher对象实际完成加密操作        Cipher cipher = Cipher.getInstance(ALGORITHM_STR);        // 用密匙初始化Cipher对象        cipher.init(Cipher.DECRYPT_MODE, key1, sr);        // 将加密报文用BASE64算法转化为字节数组        byte[] encryptedData = new BASE64Decoder().decodeBuffer(souce);        // 用DES算法解密报文        byte decryptedData[] = cipher.doFinal(encryptedData);        return new String(decryptedData, CHARSET);    }    private static String pkcs5Pad(final String souce) {        //密文和密钥的长度必须是8的倍数        if (0 == souce.length() % 8) {            return souce;        }        StringBuffer tmp = new StringBuffer(souce);        while (0 != tmp.length() % 8) {            tmp.append(PAD_STR);        }        return tmp.toString();    }}
复制代码

 

 

PHP:

复制代码
class DesUtil{        public function ecbEncrypt($key = "", $encrypt) {        $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB), MCRYPT_RAND);        $decrypted = mcrypt_encrypt(MCRYPT_DES, $key, $encrypt, MCRYPT_MODE_ECB, $iv);        $encode = base64_encode($decrypted);        return $encode;    }    public function ecbDecrypt($key = "", $decrypt) {        $decoded = base64_decode($decrypt);        $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB), MCRYPT_RAND);        $decrypted = mcrypt_decrypt(MCRYPT_DES, $key, $decoded, MCRYPT_MODE_ECB, $iv);        return self::trimEnd($decrypted);    }    /*     * 去掉填充的字符     */    private function trimEnd($text) {        $len = strlen($text);        $c = $text[$len - 1];        if (ord($c) == 0) {            return rtrim($text, $c);        }        if (ord($c) < $len) {            for ($i = $len - ord($c); $i < $len; $i++) {                if ($text[$i] != $c) {                    return $text;                }            }            return substr($text, 0, $len - ord($c));        }        return $text;    }}

复制代码

版本二:

JAVA:

复制代码
import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.SecureRandom;import java.security.spec.InvalidKeySpecException;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import sun.misc.BASE64Decoder;import sun.misc.BASE64Encoder;public class SecretUtilTools {        public static String encryptForDES(String souce, String key) throws InvalidKeyException,            NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException,            IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException {        // DES算法要求有一个可信任的随机数源        SecureRandom sr = new SecureRandom();        // 从原始密匙数据创建DESKeySpec对象        DESKeySpec dks = new DESKeySpec(key.getBytes("UTF-8"));        // 创建一个密匙工厂,然后用它把DESKeySpec转换成 一个SecretKey对象        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");        SecretKey key1 = keyFactory.generateSecret(dks);        // Cipher对象实际完成加密操作        Cipher cipher = Cipher.getInstance("DES");        // 用密匙初始化Cipher对象        cipher.init(Cipher.ENCRYPT_MODE, key1, sr);        // 现在,获取数据并加密        byte encryptedData[] = cipher.doFinal(souce.getBytes("UTF-8"));        // 通过BASE64位编码成字符创形式        String base64Str = new BASE64Encoder().encode(encryptedData);        return base64Str;    }        public static String decryptForDES(String souce, String key) throws InvalidKeyException,            NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, IOException,            IllegalBlockSizeException, BadPaddingException {        // DES算法要求有一个可信任的随机数源        SecureRandom sr = new SecureRandom();        // 从原始密匙数据创建DESKeySpec对象        DESKeySpec dks = new DESKeySpec(key.getBytes());        // 创建一个密匙工厂,然后用它把DESKeySpec转换成 一个SecretKey对象        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");        SecretKey key1 = keyFactory.generateSecret(dks);        // Cipher对象实际完成加密操作        Cipher cipher = Cipher.getInstance("DES");        // 用密匙初始化Cipher对象        cipher.init(Cipher.DECRYPT_MODE, key1, sr);        // 将加密报文用BASE64算法转化为字节数组        byte[] encryptedData = new BASE64Decoder().decodeBuffer(souce);        // 用DES算法解密报文        byte decryptedData[] = cipher.doFinal(encryptedData);        return new String(decryptedData,"UTF-8");    }}
复制代码

 

PHP:

复制代码
<?php  class SecretUtilTools  {         //加密算法           function encryptForDES($input,$key)       {                $size = mcrypt_get_block_size('des','ecb');         $input = $this->pkcs5_pad($input, $size);         $td = mcrypt_module_open('des', '', '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;      }       //解密算法          function decryptForDES($encrypted,$key)      {                $encrypted = base64_decode($encrypted);         $td = mcrypt_module_open('des','','ecb','');          //使用MCRYPT_DES算法,cbc模式         $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);         $ks = mcrypt_enc_get_key_size($td);         @mcrypt_generic_init($td, $key, $iv);         //初始处理                        $decrypted = mdecrypt_generic($td, $encrypted);         //解密         mcrypt_generic_deinit($td);         //结束                      mcrypt_module_close($td);         $y=$this->pkcs5_unpad($decrypted);         return $y;         }                 function pkcs5_pad ($text, $blocksize)       {                $pad = $blocksize - (strlen($text) % $blocksize);         return $text . str_repeat(chr($pad), $pad);      }             function pkcs5_unpad($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);      }  }
复制代码

 

C#:

复制代码
using System;using System.IO;using System.Security.Cryptography;using System.Text;using System.Threading;public class SecretUtilTools  {    public string encryptForDES(string message, string key)    {        using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())        {            byte[] inputByteArray = Encoding.UTF8.GetBytes(message);            des.Key = UTF8Encoding.UTF8.GetBytes(key);            des.IV = UTF8Encoding.UTF8.GetBytes(key);            des.Mode = System.Security.Cryptography.CipherMode.ECB;            System.IO.MemoryStream ms = new System.IO.MemoryStream();            using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))            {                cs.Write(inputByteArray, 0, inputByteArray.Length);                cs.FlushFinalBlock();                cs.Close();            }            string str = Convert.ToBase64String(ms.ToArray());            ms.Close();            return str;        }    }    public string decryptForDES(string message, string key)    {        byte[] inputByteArray = Convert.FromBase64String(message);        using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())        {            des.Key = UTF8Encoding.UTF8.GetBytes(key);            des.IV = UTF8Encoding.UTF8.GetBytes(key);            des.Mode = System.Security.Cryptography.CipherMode.ECB;            System.IO.MemoryStream ms = new System.IO.MemoryStream();            using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))            {                cs.Write(inputByteArray, 0, inputByteArray.Length);                cs.FlushFinalBlock();                cs.Close();            }            string str = Encoding.UTF8.GetString(ms.ToArray());            ms.Close();            return str;        }    }   }

原创粉丝点击