DES加密算法java实现

转载自: 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)。

上一篇:与第三方公司对接接口的权限校验


下一篇:AES加密算法java实现