1.概述
在现代社会信息传递非常普遍在传递信息时有很多内容是必须保密的比如密码、军事指令。如何让信息在传输过程中不被他人知道呢?
加密就能完成这个功能,加密是以某种特殊的算法将原有的信息数据进行改变未知用户即使获得加密信息也无法知道信息的内容。
2.术语
(1) 明文(Plain text):需要被保护的消息
(2) 密文(Cipher text):将明文利用一定的算法进行改变后的消息
(3) 被动攻击(Passive Attack):获取密文,经过分析得到明文
(4) 主动攻击(Active Attack):非法入侵篡改,伪造等手段
3.加密方式
3.1 单向加密
单向加密在加密过程中,输入明文后直接由系统加密成密文不需要密钥。既然没有密钥就无法通过密文恢复成明文。
主要是可以用于信息的鉴别在鉴别时重新输入明文,并经过同样的加密算法进行加密处理,得到密文后,然后看看密文和以前的密文是否相同。
算法特点:
(1)加密算法对同一个消息反复执行总得到相同密文。
(2)加密算法生成的密文是不可预见的,密文和明文没关系。
(3)明文的任何微小变化都对生成的密文有重大影响
(4)具有不可逆性,及通过密文得到明文不可以
单向加密算法复杂,通常在数据量很大的情况下使用。如计算机系统的口令保护。广泛应用于 密码认证, 软件序列号等领域。
如:MD5
3.2 对称加密
对称加密算法应用较早,技术较为成熟
(1)发送方将明文用加密密钥和加密算法进行加密处理,变成密文发送给接收方.
(2)接收方收到密文后,使用发送方的加密密钥及相同的算法的逆算法对密文解密,恢复为明文。
加密算法特点:
1.加密时使用什么密钥,解密时必须使用相同的密钥否则无法对密文进行解密。
2.对同样的信息,从理论上来讲,不同的密钥,加密结果不相同,同样的密文用不同的密钥解密结果也不相同。
PS: 在对称加密算法中,双方使用的密钥相同,要求解密方事先必须知道对方使用的加密密钥,其优势是计算量小,加密速度快,效率高。不足之处是,通信双方都使用同样的密钥,在传送过程中可能被截获,
同时密码难于管理。对称加密算法中,目前流行的算法有: DES、3DES、IDEA、AES 在密码学中 AES是最安全常用的算法。
实现过程:
(1)定义一个加密解密器,并指定算法名称
Cipher cipher=Cipher.getInstance(“DES”);
指定算法名称必须是系统支持的
DES 算法: DES
3DES 算法:DESede
AES 算法: AES
(2)指定算法名称,生成密钥
//KeyGenerator提供对称密钥生成器的功能
KeyGenerator keygen=KeyGenerator.getInstance(“DES”);
//SecreKey负责保存对称密钥
Secretkey deskey=keygen.generateKey();
(3)根据密钥对Cipher对象进行初始化
//ENCRYPT_MODE加密模式 DECRYPT_MODE解密模式
.cipher.init(Cipher.ENCRYPT_MODE,deskey);
(4)用Cipher对象对字节数据进行加密
String msg=”hello world”;
Byte[]src=msg.getBytes();
Byte[]enc=cipher.doFinal(src);
System.out.println(“加密后的密文是:”+new String(enc));
(5) 解密
.cipher.init(Cipher.DECRYPT_MODE,deskey);
Byte dec=cipher.doFinal(enc);
System.out.println(“解密结果:”+new String[dec]);
3.3非对称加密
(1) 什么是非对称加密
非对称加密算法需要两个密钥:每个人都可以产生这两个密钥 公开密钥(Public Key)对外公开(可以通过网络等发送) 私有密钥(Private Key)不公开
(2) 非对称加密算法性质
如果用公开密钥对数据进行加密,那么只有用对应的私有密钥才能解密如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。
(3) 非对称加密的使用过程
通信前接收方随机产生一对公开密钥和私有密钥,将公开密钥发送给发送方自己保持私有密钥。发送方利用接收方的公开密钥加密密文使其变成密文接收方收到密文后使用自己的私有密钥解密密文.
目前,在非对称加密体系中使用广泛的是RSA、DSA等RSA是目前最优秀的加密方式。
非对称加密过程
(1)定义一个加密解密器,并指定算法名称
Cipher cipher=Cipher.getInstance(“RSA”):
(2)指定算法名称,生成一对密钥
//KeyPairGenerator类用于生成公钥和私钥对
KeyPair keyPair=KeyPairGen.generateKeyPair();
//得到私钥
PrivateKey privateKey=keyPair.getPrivate();
//得到公钥
PublicKey publicKey=keyPair.getPublic();
String msg=”hello world”;
//对Cipher对象进行初始化,ENCRYPT_MODE表示加密模式
.cipher.init(Cipher.ENCRYPT_MODE,publicKey);//传入公钥
Byte[]src=msg.getBytes[];
Byte[]enc=msg.doFinal(src);
System.out.println(null,”密文是:”+new String[enc]);
//解密器初始化
Cipher.init(Cipher.DECRYPT_MODE,privateKey);
//解密
Byte[]desc=cipher.doFinal(enc);
System.out.println(new String(desc));