密码学概述
密码学:
主要是研究编译密码和破译密码的学科
密码学是网络安全信息安全区块链这些学科的基础
主要目的
研究如何将信息隐藏传递出去的学科
古典密码学
核心原理:
替换法
将原文替换成密文
移位法
经典加密法:
凯撒加密
恺撒密码,或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推。这个加密方法是以罗马共和时期恺撒的名字命名的,当年恺撒曾用此方法与其将军们进行联系。
破译法:
频度分析法:在不知道密码规则的前提下进行破译密码
将明文字母的出现频率与密文字母的频率相比较的过程。通过分析每个符号出现的频率而轻易地破译代换式密码。在每种语言中,冗长的文章中的字母表现出一种可对之进行分辨的频率。
例如,e是英语中最常用的字母,其出现频率为八分之一。最好假定长长的密文中最常用的符号代表e。如果密码分析者根据频率数能破译出9个最常用的字母e,t,a,o,n,i,r,s和h,一般来说他就可破译70%的密码。最现代的译密技术也是以古老的频率分析法为根据的。
频率分析法还可以用来对单词中的字母的位置及其组合进行分析。例如,全部英语单词中有一半以上是以t,a,o,s或w开头的。仅10个单词(the,of,and,to,a,in,that,it,is和I)就构成标准英语文章四分之一以上的篇幅。
编成密码的词汇量越大,用频率分析法译密就越容易。在激战方酣时,电文接连不断地从战场和司令部之间来回发送,其中少不了密电。第一次世界大战时,德国人每月用无线电播送200万编成密码的文字。在第二次世界大战时,盟军最高统帅部常常一天就播发200万字的编密文字。
核心其实是概率论,英文字母在单词中出现的频率不同
近代密码学
恩尼格玛密码机:核心也是位移法和替换法
现代密码学
1.散列函数
常见的加密方式:MD5,SHA-1 SHA-256 SHA-512
也叫作哈希函数、数字摘要
/**
* 功能描述
* @date 2021/11/16 15:42
* @param var 待加密数据
* @param algorithm 算法
* @return java.lang.String 加密后的字符串
*/
public String doHash(String var,String algorithm) throws Exception {
MessageDigest instance = MessageDigest.getInstance(algorithm);
byte[] digest = instance.digest(var.getBytes());
return new String(Base64.encodeBase64(digest));
}
数字摘要
消息摘要又称为数字摘要
他是一个唯一对应消息或文本的固定长度的值
他有一个单向哈希加密函数对消息进行作用而产生
使用数字摘要生成的值是不可篡改的
2.对称加密
加密和解密使用的是同一把秘钥
DES加密和解密,AES加密和解密
des秘钥为8个字节
/**
* des加密
* @date 2021/11/16 9:33
* @param var 原数据
* @param key 密钥
* @param transforms 加密算法
* @return void
*/
private void DES(String var, String key, String transforms) throws Exception {
System.out.println("原始数据:\n");
Cipher instance = Cipher.getInstance(transforms);
SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(),transforms);
String s = encryptCODE(var, instance, secretKeySpec);
System.out.println("加密后转码内容:\n"+s);
s = decryptCode(s,instance, secretKeySpec);
System.out.println("解密后内容:\n"+s);
}
/**
* 解密
* @date 2021/11/16 9:32
* @param bytes 加密后的数据
* @param instance cipher对象
* @param secretKeySpec 密钥规范
* @return java.lang.String
*/
private String decryptCode(String bytes, Cipher instance, SecretKeySpec secretKeySpec) throws Exception {
instance.init(Cipher.DECRYPT_MODE,secretKeySpec);
byte[] bytes1 = Base64.decodeBase64(bytes.getBytes());
return new String(instance.doFinal(bytes1));
}
/**
* 加密
* @date 2021/11/16 9:31
* @param var 原数据
* @param instance cipher对象
* @param secretKeySpec 密钥规范
* @return java.lang.String
*/
private String encryptCODE(String var, Cipher instance, SecretKeySpec secretKeySpec) throws InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
instance.init(Cipher.ENCRYPT_MODE,secretKeySpec);
byte[] bytes = instance.doFinal(var.getBytes());
System.out.println("加密后内容\n"+new String(bytes));
byte[] bytes1 = Base64.encodeBase64(bytes);
return new String(bytes1);
}
对称加密的核心原理:流加密块加密
3.非对称加密
非对称加密有两把密钥,公钥加密私钥解密或者私钥加密公钥解密
公钥加密私钥解密是为了保证数据的安全性
私钥加密公钥解密可以保证一定是秘钥所有者发出的数据且没有篡改
base64
不是加密算法,是可读性算法
目的不是用来保护数据,只是为了保证可读性
toString()和new String()的核心原理和区别
toString()如果没有重写的活会调用Object的toString()方法,返回的是哈希值
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
new String调用的是String中的构造方法。
加密模式:ECB CBC
ECB:同一个文本分成不同块,使用同一个key,分别进行加密,然后组合到一起。
CBC:同一个文本分成不同块,使用向量先加密第一个,加密完后生成一个新的向量进行异或处理后加密下一个,以此往复。
EBC的加密速度快,但是不安全
CBC的加密速度慢但是安全