最近在学Java加密算法的编程使用,,为了加深自己的印象,特意再次回顾一下,做到温故而知新!
既然学习Java加密算法,首先得知道什么是密码学?
- 密码学的基本功能:机密性、鉴别、报文完整性、不可否认性。(不可否认性是啥子呢)
- 基本模型:
- Java密码学算法的分类
消息编码:Base64
消息摘要:MD类、SHA类、MAC
对称密码:DES、3DES、AES
非对称密码:RSA、DH密钥交换
数字签名:RSASignature、DSASignature
本文基本就从以上地算法进行回顾。。 密码学五元组:
明文、密文、加密算法、解密算法、秘钥
注意:加解密算法都是公开的,但秘钥是不可公开的,否则就失去的加密的意义。秘钥不等于密码,密码等于秘钥加规则,,规则可以理解为算法。对称密码(传统密码)与非对称密码
对称密码:加解密使用相同的秘钥的密码体系
非对称密码:加解密使用不同的秘钥—-公钥和私钥- Java编程中常用的类
1)消息编码
BASE64Encoder、BASE64Decoder
2)消息摘要
MessageDigest
3)对称密码
KeyGenerator、SecretKey、Cipher
4)非对称密码
KeyPairGenerator、KeyFactory、KeyPair、PublicKey、PrivateKey、Cipher
5)数字签名
Signature
一、Base64算法定义
Base64开始是应用于解决电子邮件传输问题,是一种基于64个字符的编码算法,以任意8位字节序列组合的描述形式,这种形式不易直接识别。经Base64编码后的字符串的字符数是以4为单位的整数倍。
二、Base64的字符映射表
三、Base64的加解密编程
Base64算法在JDk中有BASE64Encoder()和BASE64Encoder
1)加密:
byte[] data = “jikexueyuan”.getBytes();
String result = new BASE64Encoder().encode(data);
2)解密:
byte[] result = new BASE64Decoder().decodeBuffer(data);
使用Base64算法模拟邮箱登录系统
package key.base64;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
* 使用base64编码制作邮件发送系统
*
* @author mike
*
*/
public class STMPMain {
public static void main(String[] args) {
// 邮箱账号和密码
String sender = "[email protected]";
String receiver = "[email protected]";
String password = "lalalalla";// sender账号的密码
// 将用户名和密码进行base64编码
String userBase64 = Base64Util.encryptBase64(sender.substring(0, sender.indexOf('@')).getBytes());
String passwordBase64=Base64Util.encryptBase64(password.getBytes());
//定义socket的25号端口远程连接邮箱服务器
Socket socket;
try {
socket = new Socket("smtp.163.com", 25);
//定义输入流用来读取服务器返回给我们的信息
InputStream inputStream=socket.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(inputStream));
//输出流用来向服务器发送相应的信息
OutputStream outputStream=socket.getOutputStream();
PrintWriter writer=new PrintWriter(outputStream,true);//自动刷新输出流
//打印邮箱服务器返回的信息
System.out.println(reader.readLine());
//HELO 与邮箱服务器打个招呼并告知客户端使用的机器,可以随便填写
writer.println("HELO hi");
System.out.println(reader.readLine());//服务器响应的结果
//AUTO LOGIN >>>base64
writer.println("AUTH LOGIN");//使用身份认证登录指令
System.out.println(reader.readLine());
writer.println(userBase64);//发送加密过的用户名登录
System.out.println("user:"+userBase64);
System.out.println(reader.readLine());
System.out.println("password:"+passwordBase64);
writer.println(passwordBase64);//发送加密过的密码
System.out.println(reader.readLine());
//如果没有问题表示认证登录成功
System.out.println("登陆成功!");
//SET MAIL FROM AND RCPT TO
writer.println("MAIL FROM:<"+sender+">");//发送发送方的邮箱给服务器
System.out.println(reader.readLine());
writer.println("RCPT TO:<"+receiver+">");//发送接收方的信息给邮箱服务器
System.out.println(reader.readLine());
//SET DATA
writer.println("DATA");
System.out.println(reader.readLine());
writer.println("SUBJECT:嘱咐你学习的邮件");
writer.println("FROM:"+sender);
writer.println("TO:"+receiver);
writer.println("Content-Type:text/plain;charset=\"utf-8\"");
writer.println();
writer.println("好好学习,天天向上!good good study,day day up!");
writer.println(".");//以.作为结尾
writer.println("");
System.out.println(reader.readLine());
//中断和服务器的连接
writer.println("RSET");
System.out.println(reader.readLine());
writer.println("QUIT");
System.out.println(reader.readLine());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}