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