0%

22年五一总结

Work & Life Balance

侯非侯,王非王,千盛万骑走北邙。

阅读全文 »

4-23周总结

4.23是世界读书日,快来交流喜欢读的书叭,我在这里也写了一点关于读书的感想~~竟然还有2天就期中考试了

四平终于解封了,家人们都很开心~~

阅读全文 »

写一些总结,希望对大家有帮助~

阅读全文 »

基础概念

建议用python,JAVA不是很喜欢

古典密码学

目的:保护信息

·替换法:使用固定信息将原文替换为密文

加密方式:单表替换,多表替换

单表替换:原文和密文使用同一张表;

多表替换:非常复杂,多张表原文、密文进行对比。

多表替换举例:

表单1:abcde-swtrp 表单2:abcde-chfhk

明文:bee    密钥:221

密文:hkp

·移位法:按照字母移动

凯撒加密

古典密码学破解

频率分析法:概率论——研究字母或字母组合在密文中出现的频率。E出现频率最高,X出现频率最低:“ETAOIN SHRDLU”

近代密码学

eg:恩尼格玛密码机 核心 : 移位法、替换法

后来被——图灵破解了(电影:《模仿游戏》

现代密码学

1.散列函数(Hash函数)

eg:MD5,SHA-1,SHA-256

2.对称加密

加密解密同一把密钥

流加密,块加密
3.非对称加密

两把密钥,公约加密,私钥解密 或 私钥加密,公钥解密

?? 怎样设置密码才安全 ??

·   密码不要常见;
·   密码不要设置为同一个,“撞库”;
·   设置特殊标记

ASCII编码

American Standard Code for Information Interchange

代码实现凯撒加密解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class KaiSaEn {
public static void main(String[] args) {
String input = "Hello World ! " ;
//原文右移动3位
int key = 3 ;
String s = encryptKaisa(input);
System.out.println("加密=="+s);
String ans = decryptKaisa(s,key);
System.out.println("解密=="+ans);
}
//解密
private static String decryptKaisa(String s , int key){
char[] chars = s.toCharArray() ;
StringBuilder sb = new StringBuilder() ;
for (char aChar : chars) {
int b = aChar ;
//偏移数据
b -= key ;
char newb =(char) b ;
sb.append(newb) ;
}
return sb.toString() ;
}

private static String encryptKaisa(String input) {
char[] chars = input.toCharArray() ;
StringBuilder sb = new StringBuilder() ;
for (char aChar : chars) {
int b = aChar ;
b = b + 3 ;
char newb = (char) b ;
sb.append(newb) ;
}
//System.out.println(sb.toString());
return sb.toString();
}
}


频率分析法 —— 概率论

·密码棒

·目的:不知道密钥情况下进行破解密文

方法:拿到密文选出频率最高的字母,比如最高的是j,对应明文为e;以此类推

Byte和Bit的关系(总搞混)

Byte:字节,数据存储的基本单位,比如移动硬盘1T,单位是Byte

Bit:位,用0或1表示,是数据传输的单位

关系:1Byte = 8Bit

举个栗子:

a的Byte表示:97;bit表示为:1100001(二进制)

代码实现Byte和Bit互相转化

1
2
3
4
5
6
7
8
9
10
11
12
13
public class ByteBit {
public static void main(String[] args) {
String a = "a" ;
//得到字节数组
byte[] bytes = a.getBytes() ;
for (byte aByte : bytes) {
int c = aByte ;
//byte字节对应bit
String s = Integer.toBinaryString(c);
System.out.println(s);
}
}
}

而中文对应的utf-8是3个字节,高位编码自动补全

如果是GBK,一个中文对应2个字节

DES

具体见另一篇博客(x

base64浅谈

不是加密算法,是可读性算法
原理:3字节为一组,1字节=8位,共24位,base64把3个字节转换成4组,每组6位,缺少2位,要在高位补0。

好处:base64取后6位,前2位会去掉,可以把base64控制到0-63之间(0:000000,1:111111)

坏处:内存占用变大

目的:可读性,否则得到乱码

由64个字符组成:A-Z,a-z,0-9,+,/

base58是用在比特币里面的编码方式,

·没有数字0和字母o,

·没有大写字母I和小写i,

·没有+和/。

加密模式

·ECB:电子密码本

把加密消息分割后独立加密再组合

优点
并行处理,速度快

缺点
使用同一个key,安全性弱

·CBC:密码块链接

每个明文块先与前一个密文块异或后在加密,每个密文块都依赖于它前面所有明文块。

优点
加密强度高

缺点
并行处理,慢

非对称加密

“现代加密算法”

必须2个密钥,公钥和私钥(一公一母)

常见:RSA,ECC

或取公钥和私钥:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import com.sun.org.apache.xml.internal.security.utils.Base64;

import java.security.KeyPair;
import java.security.KeyPairGenerator ;
import java.security.PrivateKey;
import java.security.PublicKey;

public class Rsa {
public static void main(String[] args)throws Exception {
//创建密钥对
//生成器对象
String algorithm = "RSA" ;
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm) ;
//生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair() ;
PrivateKey aPrivate = keyPair.getPrivate();
PublicKey aPublic = keyPair.getPublic();
//获取私钥字节数组
byte[] privateEncoded = aPrivate.getEncoded() ;
byte[] publicEncodeed = aPublic.getEncoded() ;
//base64转码
String privateEncodeString = Base64.encode(privateEncoded) ;
String publicEncodeString = Base64.encode(publicEncodeed) ;
//打印
System.out.println(privateEncodeString);
System.out.println(publicEncodeString);
}
}

数字签名

公钥数字签名,只有信息的发送者才能产生别人无法伪造的一段数字串覆盖在文件上。

数字证书

认证机构把公钥A、通过自己的私钥对认证机构加密、再和数字签名A打包生成证书返回给服务器。

点开一个网址就能看到。

CA认证中心

专门颁发、签发数字证书

网页加密

step1:客户端向服务器发送加密请求;(request)

step2:服务器用自己的私钥加密网页后,连同本身的数字证书一起发送给客户端;(response)

step3:证书管理器里有证书颁发列表,客户会根据这张表查看解开数字证书的公钥是否在列表内;

如果数字证书的网址与正在浏览的网址不一样,那就是证书可能被冒用,浏览器发出警告;

如果可靠,客户端使用证书中服务器公钥,对信息加密,然后与服务器交换加密信息。(exchange encrypted data)

文章脉络解析

阅读全文 »

记录大二下学期第一次进城

阅读全文 »