常见的加密和解密算法—DES

一、DES加密概述

  DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。

DES入口参数

DES算法的入口参数有三个:Key、Data、Mode。其中Key为7个字节共56位,是DES算法的工作密钥;Data为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

DES基本原则

DES设计中使用了分组密码设计的两个原则:混淆(confusion)和扩散(diffusion),其目的是抗击敌手对密码系统的统计分析。混淆是使密文的统计特性与密钥的取值之间的关系尽可能复杂化,以使密钥和明文以及密文之间的依赖性对密码分析者来说是无法利用的。扩散的作用就是将每一位明文的影响尽可能迅速地作用到较多的输出密文位中,以便在大量的密文中消除明文的统计结构,并且使每一位密钥的影响尽可能迅速地扩展到较多的密文位中,以防对密钥进行逐段破译。

DES与3DES的区别和联系

3DES(即Triple DES)是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。

  该方法使用两个密钥,执行三次DES算法,加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。  

  3DES加密过程为:C=Ek3(Dk2(Ek1(P)))

  3DES解密过程为:P=Dk1(EK2(Dk3(C)))

  采用两个密钥进行三重加密的好处有:

  ①两个密钥合起来有效密钥长度有112bit,可以满足商业应用的需要,若采用总长为168bit的三个密钥,会产生不必要的开销。

  ②加密时采用加密-解密-加密,而不是加密-加密-加密的形式,这样有效的实现了与现有DES系统的向后兼容问题。因为当K1=K2时,三重DES的效果就和原来的DES一样,有助于逐渐推广三重DES。

  ③三重DES具有足够的安全性,目前还没有关于攻破3DES的报道。

DES 是对称的加密算法(PS:对称加密就是加密用的密码和解密用的密码是一样的,非对称就是加密和解密用的密钥不一样)

参考链接:DES加密和解密

二、Java实现DES加密解密

1、DES加密和解密 使用java自带jar包即可,无需另外单独引入其它jar

2、DES使用代码

package util;
import java.security.SecureRandom;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.SecretKeyFactory;
import javax.crypto.SecretKey;
import javax.crypto.Cipher;
/**
 DES加密介绍
      DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究,
 后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,
 24小时内即可被破解。虽然如此,在某些简单应用中,我们还是可以使用DES加密算法,本文简单讲解DES的JAVA实现
 。
 注意:DES加密和解密过程中,密钥长度都必须是8的倍数
 */
public class DES {
    public DES() {
    }
    //测试
    public static void main(String args[]) {
        //待加密内容
     String str = "测试内容";
     //密码,长度要是8的倍数
     String password = "9588028820109132570743325311898426347857298773549468758875018579537757772163084478873699447306034466200616411960574122434059469100235892702736860872901247123456";

     byte[] result = DES.encrypt(str.getBytes(),password);
     System.out.println("加密后:"+new String(result));
     //直接将如上内容解密
     try {
             byte[] decryResult = DES.decrypt(result, password);
             System.out.println("解密后:"+new String(decryResult));
     } catch (Exception e1) {
             e1.printStackTrace();
     }
 }
    /**
     * 加密
     * @param datasource byte[]
     * @param password String
     * @return byte[]
     */
    public static  byte[] encrypt(byte[] datasource, String password) {
        try{
        SecureRandom random = new SecureRandom();
        DESKeySpec desKey = new DESKeySpec(password.getBytes());
        //创建一个密匙工厂,然后用它把DESKeySpec转换成
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey securekey = keyFactory.generateSecret(desKey);
        //Cipher对象实际完成加密操作
        Cipher cipher = Cipher.getInstance("DES");
        //用密匙初始化Cipher对象
        cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
        //现在,获取数据并加密
        //正式执行加密操作
        return cipher.doFinal(datasource);
        }catch(Throwable e){
                e.printStackTrace();
        }
        return null;
}
    /**
     * 解密
     * @param src byte[]
     * @param password String
     * @return byte[]
     * @throws Exception
     */
    public static byte[] decrypt(byte[] src, String password) throws Exception {
            // DES算法要求有一个可信任的随机数源
            SecureRandom random = new SecureRandom();
            // 创建一个DESKeySpec对象
            DESKeySpec desKey = new DESKeySpec(password.getBytes());
            // 创建一个密匙工厂
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            // 将DESKeySpec对象转换成SecretKey对象
            SecretKey securekey = keyFactory.generateSecret(desKey);
            // Cipher对象实际完成解密操作
            Cipher cipher = Cipher.getInstance("DES");
            // 用密匙初始化Cipher对象
            cipher.init(Cipher.DECRYPT_MODE, securekey, random);
            // 真正开始解密操作
            return cipher.doFinal(src);
        }
}

其中 DES 加密的时候,需要注意 密钥的长度需要时8个字节的整数倍~ 切不能是8

代码参考链接:http://www.cnblogs.com/langtianya/p/3715975.html

PS:3DES加密算法 这里就暂时不给相关的代码的了,感兴趣的可以自己上网查一下~

时间: 2024-10-22 07:53:10

常见的加密和解密算法—DES的相关文章

常见的加密和解密算法—AES

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

常见的加密和解密算法—MD5

一.MD5加密概述 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992). MD5即Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致.是计算机广泛使用

常见的加密和解密算法—BASE64

一.BASE64加密和解密概述 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,Base64编码可用于在HTTP环境下传递较长的标识信息.例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数.在其他应用程序中,也常常需要把二进制数据编码为适合放在URL(包括隐藏表单域)中的形式.此时,采用Base64编码具有不可读性,

一次一密加密、解密算法

1. 一次一密加密.解密算法 一次一密密码系统的一个重要特性是密钥K为一个真随机序列,且密钥只使用一次. 下面通过计算机的伪随机函数产生的随机序列作为密钥来简单演示一次一密的加密解密算法,代码示例如下: /** * 一次一密加密.解密算法 * @param str 明文(密文) * @param key 密钥 * @return 密文(明文) */ static char[] bitcode(char[] str, char[] key){ int len,i; char[] wen; len

c++实现加密和解密算法以及JNI技术的应用实例

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

替换加密、解密算法

替换加密解密算法方案的起源可以追溯到凯撒(Caesar)时代,据说凯撒为了保障情报的可靠性而发明了凯撒密码.凯撒密码是一种简单的置换密码,在加密时,字母表中的每个字母都用其后的第三个字母表示,例如,a用d表示,b用e表示,.......在解密时,只需要执行逆过程即可. 1. 替换加密.解密算法 随这历史的发展,替换密码算法方案已具有很多种形式,主要有以下几种: 单表代替密码算法方案 同音代替密码算法方案 多表代替密码算法方案 多字母组代替密码算法方案 下面以单表代替密码算法方案为例进行介绍. 1

位加密、解密算法

位加密解密算法即将明文信息转化为二进制数据,然后对这些二进制位进行加密便得到密文.位加密算法依托于计算机的强大的位处理能力,在实际应用中非常流行.现代密码学中的很多加密.解密算法方案都依赖于位加密.解密思路,例如,非常流行的序列密码方案. 1. 位加密.解密算法 在java语言中,提供了6种位运算符,如下表所示.在密码学中,可以根据需要来选择合适的位运算符进行加密.解密.一般来说,使用异或运算要比较方便. 位运算 名称 & 按位与(AND) | 按位或(OR) ^ 按位异或(XOR) ~ 取反(

JAVA实现AES的加密和解密算法

原文 JAVA实现AES的加密和解密算法 import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; /** * AES 是一种可逆加密算法,对用户的敏感信息加密处理 * 对原始数据进行AES加密后,在进行Base6

换位加密、解密算法

换位密码算法方案,又称为置换加密方案,其根据一定的规则重新安排明文字母,使之成为密文.换位密码是最简单的密码学算法. 1. 换位加密.解密算法 换位加密解密的算法有很多种,这里介绍基于二维数组移位的换位加密.解密算法.二维数组移位的换位加密.解密算法即将明文字符串按照一个给定的顺序保存在二维数组中,然后按照另外一个顺序读出,便的到密文.执行相反的过程便可以恢复出明文. 1)换位加密算法 基于二维数组移位的加密算法的操作步骤如下: (1)给定一个二维数组的列数,即该二维数组每行可以保存的字符个数.