DES加密算法实现
原创 52cxy 04-04 09:10 阅读数:543

  DES,全名为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。所谓对称性加密即加密和解密密钥相同,对称性加密一般会按照固定长度,把待加密字符串分成块,不足一整块或者刚好最后有特殊填充字符。跨语言做 DES 加密解密经常会出现问题,往往是填充方式不对、编码不一致或者加密解密模式没有对应上造成。常见的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。加密模式有:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。

  在实际开发过程中,不同的开发语言都自带相应的函数来完成加密算法的实现,下面介绍常用的几种开发语言如何完成AES加密算法的加解密操作。


 一、PHP

$pass = "123456";
$data = "ItUtil.net";
$iv = '12345678'; //8位

$enData = openssl_encrypt($data, 'DES-CBC', $pass, 0, $iv);
$deData = openssl_decrypt($enData, 'DES-CBC', $pass, 0, $iv);
var_dump($enData);
var_dump($deData);


   二、JAVA

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

public class Des {
	public static String encrypt(String content, String KEY, String IV) throws Exception {
		try {
			byte[] raw = KEY.getBytes("utf-8");
			SecretKeySpec skeySpec = new SecretKeySpec(raw, "DES");
			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");//"算法/模式/补码方式"
			IvParameterSpec ips = new IvParameterSpec(IV.getBytes());
			cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ips);
			byte[] encrypted = cipher.doFinal(content.getBytes());
			String result = new Base64().encodeToString(encrypted);
			return result;
		} catch (Exception ex) {
			System.out.println(ex.toString());
			return null;
		}
	}
	
	public static String dencrypt(String content, String KEY, String IV) throws Exception {
		try {
			byte[] raw = KEY.getBytes("utf-8");
			SecretKeySpec skeySpec = new SecretKeySpec(raw, "DES");
			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			IvParameterSpec ips = new IvParameterSpec(IV.getBytes());
			cipher.init(Cipher.DECRYPT_MODE, skeySpec, ips);
			byte[] encrypted1 = new Base64().decodeBase64(content);
			try {
				byte[] original = cipher.doFinal(encrypted1);
				String originalString = new String(original);
				return originalString;
			} catch (Exception e) {
				System.out.println(e.toString());
				return null;
			}
		} catch (Exception ex) {
			System.out.println(ex.toString());
			return null;
		}
	}
	
	public static void main(String[] args) {
		try{
			String KEY = "12345678";//必须8位
			String data = "ItUtil.net";
			String IV = "12345678";//必须8位
			String result = encrypt(data, KEY, IV);
			System.out.println("加密后密文:"+result);
			String result2 = dencrypt(result, KEY, IV);
			System.out.println("解密后明文:"+result2);
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}
}




共1条评论
52cxy·2022/06/16

感谢分享。

评论举报
我要评论