加密原理

概念:加密是指通过加密算法加密密钥将明文转变为密文,而解密则是通过解密算法解密密钥将密文恢复为明文

原理:利用数学上逆运算比正运算难的原理,例如除法比乘法难;找两个质数,把它们乘起来得到一个合数容易,给一个合数把它分解成两个质数相乘很难等。

简单举例:设明文为12, 加密算法为乘上一个数,假设为3(就是加密秘钥),得到密文为36,而解密算法为除以一个数,解密秘钥这里也为3。但是在不知道解密秘钥的情况下,即使知道解密算法,结果也有各种可能。

加密分类

对称加密:加密秘钥和解密秘钥一样(效率高)

非对称加密:加密秘钥和解密秘钥不一样(破解难)

对称加密(略)
非对称加密

为什么会有非对称加密?

非对称加密相对于对称加密解决的问题:秘钥在传输过程中的安全性问题

举例:

对称加密的局限性:假设A,B分处两地,A加密送出,B接受解密。使用对称加密的话,加密秘钥和解密秘钥是一样的,A必须把秘钥通过公开渠道(比如写信,网络传输等)发送给B一份,B才能实现最终解密。秘钥在公开渠道的传输过程中就是有可能被窃取的。

非对称加密的解决方案:加密算法生成两个秘钥,一个公钥,给人谁便看都行;一个私钥,自己保留,完全不传播

同样还是,假设A,B分处两地,A加密送出,B接受解密。此时使用非对称加密,在B处(接收解密方)先运行算法,生成公私钥,然后B通过任何渠道(写信,发mail,或者直接在网站上贴出来等方式),把公钥发送给A。

然后A通过公钥,运行算法加密明文送出,B用自己保留的私钥,接收解密。简单来说,非对称加密解决秘钥在传输过程中的安全性问题的原理,就是不传输解密秘钥

应用举例:SSH加密通信

ssh采用了对称秘钥和非对称秘钥相结合的方式。数据通信采用客户端生成对称秘钥,简称会话秘钥

而客户端又是通过非对称加密将会话秘钥送达服务器端的,保证秘钥传输过程中不被窃取。

ssh加密通讯流程

这里进行一下说明:

  1. 首先服务端会通过非对称加密,产生一个公钥和私钥;
  2. 在客户端发起请求时,服务端将公钥暴露给客户端,这个公钥可以被任意暴露;
  3. 客户端在获取公钥后,会先产生一个由256位随机数字组成的会话密钥,这里称为口令;
  4. 客户端通过公钥将这个口令加密,发送给服务器端;
  5. 服务器端通过私钥进行解密,获取到通讯口令;
  6. 之后,客户端和服务端的信息传递,都通过这个口令进行对称的加密。
电子签名(非对称加密的另一个应用)

电子签名的作用:不可伪造性,向别人证明(电脑另一端的我就是我)

如何实现电子签名?

首先我们看加密流程:公钥加密送出,私钥接收解密。反加密流程过来的话,就是签名:私钥加密(签名)送出,公钥解密(验证)接收。由于私钥你自己独有,所以你加密出来的东西独一无二,就像别人没有办法伪造你的签名一样。而对于接受者,通过公钥很容易验证签名真伪(想想如何?)

电子证书

由于任何人都可以自己生成公私钥,如果通讯的双方互相认识,比如朋友A和B,使用自己的公私钥加密通讯是没有问题的。假设双方不认识,比如你和银行之间,你如何确定和你交易的是真的银行?这个时候需要一个大家都认可的机构来证明,和你打交道的是真的银行。方法是,由这个大家都认可的机构来帮银行生成公私钥,相当于给银行发了一份证书,用来正面银行就是银行。而你可以使用公钥来验证银行证书的真假。

常见的证书机构:CA

Linux全盘加密

Linux可以使用Dmcrypt实现全盘加密。dm-crypt: Linux kernel device-mapper crypto target

支持的算法:

1
2
3
loop-AES: aes, Key 256 bits
plain: aes-cbc-essiv:sha256, Key: 256 bits, Password hashing: ripemd160
LUKS1: aes-xts-plain64, Key: 256 bits, LUKS header hashing: sha1, RNG: /dev/urandom

操作举例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 依赖:暂时略
sudo cryptsetup luksFormat /dev/mmcblk1 # 按提示输入加密盘的密码
# 打开加密盘(解密), 解密后会生成/dev/mapper/sdcard设备文件
sudo cryptsetup luksOpen /dev/mmcblk1 sdcard # 这里输入你设置的密码
# 格式化解密后的sdcard为ext4文件系统
sudo mkfs.ext4 /dev/mapper/sdcard
# 挂载文件系统
sudo mount /dev/mapper/sdcard /mnt
# 修改文件系统的用户名和用户组,假设nvidia为最终的工作用户
sudo chown -R nvidia:nvidia /mnt
# 测试
echo 'helloworld' > /mnt/test.txt
cat /mnt/test.txt
# 卸载文件系统
sudo umount /mnt
# 重新加密磁盘,################### 这一步非常重要 #######################
sudo cryptsetup luksClose sdcard
# 为加密盘添加第二密码,################### 这一步非常重要 ################
# 假设第二密码存在/tmp/keyfile文件中
sudo cryptsetup luksAddKey /dev/mmcblk1 /tmp/keyfile #之后会提示你先输入第一密码
#  使用第二密码解密磁盘
sudo cryptsetup --key-file /tmp/keyfile open --type luks /dev/mmcblk1 sdcard
# 再次挂载
sudo mount /dev/mapper/sdcard /mnt

通过api调用来实现加密解密:

1
sudo apt-get install libcryptsetup-dev
文件系统加密

文件系统级别加密可以使用ecryptfs

1
sudo apt-get install ecryptfs-utils

例如安装ubuntu时候的home目录加密:

home目录加密

操作举例:

1
2
3
4
5
6
7
8
# 此命令会在当前home目录创建三个目录:.ecryptfs/ .Private/ Private/
ecryptfs-setup-private
# 挂载(解密文件夹)
ecryptfs-mount-private
# 查看被解密的文件夹
ls ~/Private/
# 卸载(重新加密文件夹)
ecryptfs-umount-private

高级用法(暂略)