加密方式
主要有:对称加密算法,基础加密算法,非对称加密算法。
一,对称加密算法
只有一个密钥key进行加密解密,可以逆向加解密。
1.凯撒密码
古代有名的加密算法,将加密的数据进行一定的以为,属于对称加密,密钥key = 2(int 值)。
这种加密非常简单,只需要对相应的明文移位就得到了加密后的密文,如:明文为abc,key = 2(移2位),那么密文为cde,原理非常的简单。
这种加密在后来明显不能满足时代发展的需要,通过**频度分析法**,可以快速的破解。
频度分析法:这种方法通过一定的理论和相关统计,得到一定的规律就是:字母e出现的概率最高,t,a,o,n,i,r,s和是常用频率的字母,通过频度分析和逆向凯撒密码,就可以得到破译的几种明文。
2.DES
速度较快,适用于加密大量数据的场合。
DES密钥至少8个数字(64个比特位),使用了前56个比特位,后8位用作校验码,超过8对密文没有影响。
3.DES
基于DES,强度更高,但是加密效率不高。
对一块数据用3个不同的密钥进行3次加密
DES算法有四种工作模式:
1.ECB:电子密码本模式
优点:
1.有利于并行计算;
2.误差不会被传送;
缺点:
1.不能隐藏明文的模式;
2.可能对明文进行主动攻击。
2.CBC:加密分组链接模式
密文呈分组链接的特点,密文之间有依赖关系,加密强度更高,能防止主动攻击。
3.CFB:加密反馈模式
隐藏了明文模式;
4.OFB:输出反馈模式
5.CTR模式
实现代码
public class DESUtil {
//算法名称
public static final String KEY_ALGORITHM = "DES";
//算法名称/加密模式/填充方式
public static final String CIPHER_ALGORITHM = "DES/ECB/NoPadding";
/**
* 生成密钥key对象
* @param KeyStr 密钥字符串
* @return 密钥对象
* @throws Exception
*/
private static SecretKey keyGenerator(String keyStr) throws Exception {
byte input[] = HexString2Bytes(keyStr);
DESKeySpec desKey = new DESKeySpec(input);
//创建一个密匙工厂,然后用它把DESKeySpec转换成
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(desKey);
return securekey;
}
/**
* 加密数据
* @param data 待加密数据
* @param key 密钥
* @return 加密后的数据
*/
public static String encrypt(String data, String key) throws Exception {
Key deskey = keyGenerator(key);
// 实例化Cipher对象,它用于完成实际的加密操作
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
SecureRandom random = new SecureRandom();
// 初始化Cipher对象,设置为加密模式
cipher.init(Cipher.ENCRYPT_MODE, deskey, random);
byte[] results = cipher.doFinal(data.getBytes());
for (int i = 0; i < results.length; i++) {
System.out.print(results[i] + " ");
}
System.out.println();
// 执行加密操作。加密后的结果通常都会用Base64编码进行传输
return Base64.encodeBase64String(results);
}
/**
* 解密数据
* @param data 待解密数据
* @param key 密钥
* @return 解密后的数据
*/
public static String decrypt(String data, String key) throws Exception {
Key deskey = keyGenerator(key);
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
//初始化Cipher对象,设置为解密模式
cipher.init(Cipher.DECRYPT_MODE, deskey);
// 执行解密操作
return new String(cipher.doFinal(Base64.decodeBase64(data)));
}
4.AES
加密强度升级,密钥为128(只能为128)个比特。
高级加密标准,是下一代加密算法标准, 速度快,安全级别高
代码实现参考DES,两者实现差不多。
二,基本的单向加密算法
基本的单向加密算法有以下几种:
BASE64 严格地说,属于编码格式,而非加密算法
MD5(Message Digest algorithm 5,信息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码)
1.BASE64
Base64编码可用于在HTTP,mime协议下快速传输数据, 严格地说,属于编码格式,而非加密算法。
Base64的作用:将非ASCII字符的数据转换成ASCII字符的一种方法,因为某些系统中只能使用ASCII字符(比如传输邮件只能传输ASCII)。
实现
public class BASE64 {
// 主要使用到两个类,BASE64Decoder,BASE64Encoder
// BASE64解密
public static byte[] decryptBASE64(String key) throws Exception {
return (new BASE64Decoder()).decodeBuffer(key);
}
// BASE64加密
public static String encryptBASE64(byte[] key) throws Exception {
return (new BASE64Encoder()).encodeBuffer(key);
}
}
2.MD5
信息摘要算法,用于确保信息传输完整一致。广泛用于加密和解密技术,常用于文件校验。不管文件多大,经过MD5后都能生成唯一的MD5值(SHA-1与此类似)
特点
1、任意长度的数据,MD5值长度都是固定的。
2、对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
3、弱抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
4、强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的。
以下几行代码可以实现实现
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] inputData = inputStr.getBytes();
md.update(inputData);
bigInteger = new BigInteger(md.digest());
SHA
Secure Hash Algorith,安全散列算法,是数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域,较MD5更为安全。
SHA1比MD5安全,是因为SHA-1摘要为160位,MD5摘要为128位,相差32位,因此SHA1的强度更大。
代码实现
public static byte[] encrypt(byte[] data) throws Exception {
MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
sha.update(data);
return sha.digest();
}
三,非对称加密算法
存在公钥和私钥的概念,要完成加解密操作,需要两个密钥同时参与。公钥加密的数据必须使用私钥才可以解密,同样,私钥加密的数据也 只能通过公钥进行解密。
RSA加密算法
RSA加密算法是一种典型的非对称加密算法。
原理
它的原理非常简单,如下图:
产生的问题1
从上面的传输过程我们可以看出,公钥是直接传输给B,那么它可能被截获,A向B的加密数据就可能用公钥进行解密,造成数据泄露。
建立更加安全的传输通道
建立更加安全的加密通道,在A,B两端分别产生密钥对,分别将各自的公钥暴露给对方,如下图:
产生的问题2
这种安全通道,相对来说已经很坚固,但是这种方式也可能存在数据传递被模拟的隐患,需要通过数字签名进一步提升安全性。
数字签名以及数字证书
(1)信息 + HASH = 摘要 摘要 + 私钥 = 数字签名(给收方做对比用的,验证收发内容是否一致)
(2)公钥 + 相关信息 + CA私钥 = 数字证书(验证发送者是否正确,是可信任的公钥)
A的公钥必须是证书中心颁发的,不然就需要对A做公钥认证(参考这篇博文):
注意:
如果A的公钥被替换掉,B端就不能确认公钥是否是A端的公钥,这时B可以让A可以去找"证书中心"(certificate authority,简称CA),为公钥做认证,证书中心用自己的私钥,对A的公钥和一些相关信息一起加密,生成"数字证书"(Digital Certificate),发送信息给B在签名的同时附上数字证书就可以了。B收信后,用CA的公钥解开数字证书,就可以拿到A真实的公钥了,然后就能证明"数字签名"是否真的是A签的。
四,加密算法的选择
对于对称解密算法和非对称加密算法,在实际使用的过程中该使用哪一种?
使用建议:
1.由于非对称加密算法的运行速度比对称加密算法的速度慢很多,当我们需要加密大量的数据时,建议采用对称加密算法,提高加解密速度。当数据量很小时,我们可以考虑采用非对称加密算法(对称加密的密钥管理也比较复杂)。
2.对称加密算法不能实现签名,因此签名只能非对称算法。
实际使用
实际应用中,两者混合使用
采用非对称加密算法管理对称算法的密钥,然后用对称加密算法加密数据,这样我们就集成了两类加密算法的优点,既实现了加密速度快的优点,又实现了安全方便管理密钥的优点。