DES加密算法java实现

匿名 (未验证) 提交于 2019-12-02 21:52:03

转载自: https://blog.csdn.net/zyhlwzy/article/details/77948137

由于计算机软件的非法复制,通信的泄密、数据安全受到威胁,解密及盗版问题日益严重,甚至引发国际争端,所以在信息安全技术中,加密技术占有不可替代的位置,因此对信息加密技术和加密手段的研究与开发,受到各国计算机界的重视,发展日新月异。

在系统研发过程中,有些数据对于系统或者用户来说,都是非常重要且不可泄露的,对重要数据的加密对于任何系统来说都是非常必要的,例如用户的登录密码,交易密码等等,本文借助用户注册时对用户密码的加密,来大致说说一些常用的加密算法以及相关实现。

DES加密算法

DES加密算法是一种分组密码,以64位为分组对数据加密,它的密钥长度是56位,加密解密用同一算法。DES加密算法是对密钥进行保密,而公开算法,包括加密和解密算法。这样,只有掌握了和发送方相同密钥的人才能解读由DES加密算法加密的密文数据。

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

DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。

在java中,使用DES算法的例子如下:

public class SecurityDESUtils {
private static Logger logger = LogManager.getLogger(SecurityDESUtils.class);

private static final String ENCODEING = "UTF-8"; private static final String ALGORITHM = "DES";//加密算法  /**  * @Comment DES算法加密  * @param plaintext 需要加密的文本  * @param secureKey 长度不能小于8  * @Author Ron  * @Date 2017年9月12日 上午11:54:12  * @return  */ public static String encrypt(String plaintext, String secureKey) {     String encryptStr = "";     try {         byte[] datasource = plaintext.getBytes(ENCODEING);         SecureRandom random = new SecureRandom();         DESKeySpec desKey = new DESKeySpec(secureKey.getBytes(ENCODEING));          SecretKeyFactory keyFactory =  SecretKeyFactory.getInstance(ALGORITHM);         SecretKey securekey = keyFactory.generateSecret(desKey);          //Cipher对象实际完成加密操作         Cipher cipher = Cipher.getInstance(ALGORITHM);          //用密匙初始化Cipher对象         cipher.init(Cipher.ENCRYPT_MODE, securekey, random);          //现在,获取数据并加密         //正式执行加密操作         byte[] encryptSrc = cipher.doFinal(datasource);          encryptStr = Base64Utils.encodeToString(encryptSrc);     } catch (Exception e) {         logger.error("DES加密报异常",e);     }     return encryptStr; }  /**  * @Comment 解密  * @param encryptStr 已加密的字符串  * @param secureKey 长度不能小于8  * @Author Ron  * @Date 2017年9月12日 下午1:12:56  * @return  * @throws BadPaddingException   * @throws IllegalBlockSizeException   */ public static String decrypt(String encryptStr, String secureKey){     String decryptStr = "";      try {         byte[] src = Base64Utils.decodeFromString(encryptStr);         // DES算法要求有一个可信任的随机数源         SecureRandom random = new SecureRandom();         // 创建一个DESKeySpec对象         DESKeySpec desKey = new DESKeySpec(secureKey.getBytes(ENCODEING));          // 创建一个密匙工厂         SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);          // 将DESKeySpec对象转换成SecretKey对象         SecretKey securekey = keyFactory.generateSecret(desKey);         // Cipher对象实际完成解密操作         Cipher cipher = Cipher.getInstance(ALGORITHM);         // 用密匙初始化Cipher对象         cipher.init(Cipher.DECRYPT_MODE, securekey, random);         // 真正开始解密操作         byte[] decryptSrc = cipher.doFinal(src);         decryptStr = new String(decryptSrc,ENCODEING);     } catch (Exception e) {         logger.error("DES解密失败",e);     }     return decryptStr; }  public static void main(String[] arg) throws Exception{     String src="ninhao";     String srKey="40c7f529c177487bb3b03cf16e962c82";     String enString = encrypt(src,srKey);     System.out.println("加密:"+enString);      System.out.println("解密:"+decrypt(enString,srKey)); } 

}

攻击 DES 的主要形式被称为蛮力的或穷举,即重复尝试各种密钥直到有一个符合为止。如果 DES 使用 56 位的密钥,则可能的密钥数量是 2 的 56 次方个。随着计算机系统能力的不断发展,DES 的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。不过 ,DES 现在仅用于旧系统的鉴定,而更多地选择新的加密标准 ― 高级加密标准(Advanced Encryption Standard,AES)。

文章来源: https://blog.csdn.net/weixin_40224981/article/details/97017605
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!