1.常用加密算法
有对称密码,公钥密码,单向散列函数,数字签名, 伪随机数生成器。
明文:是指没有加密的文字(或者字符串),加密之前的文字。
密文:加了密的的文字。
MDS算法 :单向散列函数 SHA算法: 单向散列函数,秒传。
base64编码与解码:64个符号进行编码,多媒体信息追加到文本中。
64个符号:a到z,A到Z,0到9,- +或者/
对称密码
(最古老的)凯撒密码:通过偏移来实现,比如偏移n位数 n=1 (hello就是ifmmp)。
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* 工具类
* @author Admin
*
*/
public class Util {
/**
* 凯撒密码加密
* @param msg 明文
* @return 密文
*/
public static String toCaesar(String msg) {
// 字符串转换成字符数组
char[] data =msg.toCharArray();
// Arrays
System.out.println(Arrays.toString(data));
// 偏移(加密):把明文转换为密文
// 每个字符偏移特定的位置:如love
// l,o,v,e
for (int i = 0; i < data.length; i++) {
// 对每个字符进行处理,偏移 1
// char c = data[i];
// 不是z的情况,才进行处理,标点符号除外
if((data[i] >='a' && data[i] <'z')
|| (data[i] >='A' && data[i] <'Z')
) {
data[i]++;
}
// z?如何偏移
if(data[i]=='z') {
data[i]='a';
}
if(data[i]=='Z') {
data[i]='A';
}
// todo,如果偏移是其他的值
}
// 返回密文
return new String(data);
}
}
package com.newer.demo;
public class App {
public static void main(String[] args) {
// a后面是b,中后面?
// 中文 在UTF-8是 多个字节
// String msg=" i love u - zoom ? ZOOM";
//
// String msgCaesar= Util.toCaesar(msg);
//
// System.out.println(msgCaesar);
}
}
控制台输出结果为:
[ , i, , l, o, v, e, , u, , -, , z, o, o, m, , ?, , Z, O, O, M]
j mpwf v - appn ? APPN
公钥密码(非对称 RSA):加密与解密使用两个不同的密钥。
https:使用混合加密方式。
单向散列函数:不能解密。
确保数据的完整性,存储用户口令。
散列函数把输入的内容(长度不限),生成固定长度的内容,消息摘要,指纹。
md5
sha128
sha256
sha512
比特币是散列算法。区块的摘要信息
package com.newer.demo;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* 工具类
* @author Admin
*
*/
public class Util {
/**
* 单向散列函数,生成摘要信息(数字指纹),过程不可逆(无法解密
* @param text 目标数据:字符串,字节数组,文件
* @return
*/
public static String toMD5(String text){
// 消息摘要
try {
byte[] data= MessageDigest.getInstance("MD5").digest(text.getBytes());
// 字节数组转换成16进制数
return new BigInteger(1,data).toString(16);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
/**
*
* @param text
* @return
*/
public static String toSha256(String text){
// 消息摘要
try {
byte[] data= MessageDigest.getInstance("SHA").digest(text.getBytes());
// 字节数组转换成16进制数
return new BigInteger(1,data).toString(16);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
}
package com.newer.demo;
public class App {
public static void main(String[] args) {
// MD5---->32
System.out.println(Util.toMD5(""));
System.out.println(Util.toMD5("love"));
System.out.println(Util.toMD5("i love you"));
System.out.println(Util.toMD5("这是一段文本内容...很长,很长...."));
// SHA256--->64
System.out.println(Util.toSha256(""));
System.out.println(Util.toSha256("love"));
System.out.println(Util.toSha256(" I love you"));
System.out.println(Util.toSha256("这是一段文本内容...很长,很长...."));
}
}
控制台输出结果为:
d41d8cd98f00b204e9800998ecf8427e
b5c0b187fe309af0f4d35982fd961d7e
459b9511a7f650ebd327889c45cc4e9b
6801cad5e0c2a026f3d562c2b4ea13cd
da39a3ee5e6b4b0d3255bfef95601890afd80709
9f2feb0f1ef425b292f2f94bc8482494df430413
f6de392817cbb574fa480f63fefc0b85f2f63c93
6c8ba80d95708c301b6228b2258eebc895bb9810