加密算法
2020-03-10 本文已影响0人
Simon_Ye
对称加密算法
对称加密:加密和解密使用同一个密钥
-
免费
- DES:Data Encryption Stadard,56bits
- 3DES
- AES:Advanced(128,192,256bits)
-
商用
- Blowfish,Twofish
- IDEA,RC6,CAST5
特性
- 加密、解密使用同一个密钥,效率高
- 将原始数据分割成固定大小的块,逐个进行加密
缺陷:
- 密钥过多
- 密钥分发困难
- 数据来源无法确认
非对称加密算法
基于一对公钥/私钥对
密钥是成对出现,用密钥对中的一个加密,另一个解密
- 公钥:公开给所有人;public key
- 私钥:自己留存,必须保证其私密性;secret key
特点
用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
功能
- 数字签名:主要在于让接收方确认发送方身份
- 对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
- 数据加密:适合加密较小数据
缺点
密钥长,加密解密效率低下
算法
- RSA(加密,数字签名)
- DSA(数字签名)
- ELGamal
实现加密
- 接收者:
生成公钥/密钥对:P和S
公开公钥P,保密密钥S - 发送者:
使用接收者的公钥来加密消息M
将P(M)发送给接收者 - 接收者:
使用密钥S来解密:M=S(P(M))
实现数字签名
- 发送者:
生成公钥/密钥对:P和S
公开公钥P,保密密钥S
使用密钥S来加密消息M
发送给接收者S(M) - 接收者
使用发送者的公钥来解密M=P(S(M))
单向散列(hash)算法
将任意数据缩小成固定大小的“指纹”
- 任意长度输入
- 固定长度输出
- 若修改数据,指纹也会改变(“不会产生冲突”)
- 无法从指纹中重新生成数据(“单向”)
功能:
数据完整性
常见算式:
md5:128bits
sha1:160bits
sha224:224bits
sha256:256bits
sha384:384bits
sha512:512bits
常用工具:
- md5sum | sha1sum [--check] file
- openssl、gpg
- rpm -V
密钥交换
密钥交换:IKE(Internet Key Exchange)
- 公钥加密
- DH(Deffie-Hellman):生成会话密钥,参看如下
https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
DH
- A:a,p协商生成公开的整数a,大素数p
B:a,p - A:生成隐私数据:x(x<p),计算得出a^x%p,发送给B
B:生成隐私数据:y,计算得出a^y%p,发送给A - A:计算得出[(a^y%p)^x]%p=a^xy%p,生成为密钥
B:计算得出[(a^x%p)^y]%p=a^xy%p,生成为密钥
应用程序:RPM
文件完整性的两种实施方式
- 被安装的文件
- MD5单向散列
- rpm --verify package_name(or -V)
- 发行的软件报文件
- GPG公钥签名
- rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
- rpm --checksig pakage_file_name(or -k)
使用gpg实现对称加密
示例
- 对称加密 file1 文件
[root@node2 tmp]# gpg -c file1 gpg: directory `/root/.gnupg' created gpg: new configuration file `/root/.gnupg/gpg.conf' created gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run gpg: keyring `/root/.gnupg/pubring.gpg' created [root@node2 tmp]# ls file1 file1.gpg [root@node2 tmp]# ll total 8 -rw-r--r--. 1 root root 257 Mar 10 10:03 file1 -rw-r--r--. 1 root root 185 Mar 10 11:31 file1.gpg
- 解密 file1.gpg 文件为 f1
[root@node2 tmp]# gpg -o f1 -d file1.gpg gpg: keyring `/root/.gnupg/secring.gpg' created gpg: CAST5 encrypted data gpg: encrypted with 1 passphrase gpg: WARNING: message was not integrity protected [root@node2 tmp]# ll total 8 -rw-r--r--. 1 root root 257 Mar 10 11:37 f1 -rw-r--r--. 1 root root 257 Mar 10 10:03 file1 -rw-r--r--. 1 root root 185 Mar 10 11:31 file1.gpg
使用gpg工具实现公钥加密
在hostB主机上用公钥加密,在hostA主机上解密
- 在hostA主机上生成公钥/私钥对,保存路径为
/root/.gnupg
目录
~]# gpg -gen-key
- 在hostA主机上查看公钥
~]# gpg --list-keys
- 在hostA主机上导出公钥为可读格式的指定文件名
~]# gpg -a --export -o wang.pubkey
-a
:编码格式
--export
:导出
-o
:指定文件名 - 从hostA主机上复制公钥文件到需加密的B主机上
~]# scp wang.pubkey hostB:
- 在需加密数据的hostB主机上生成公钥/私钥对
~]# gpg --list-keys
~]# gpg --gen-key
- 在hostB主机上导入hostA的公钥
~]# gpg --import wang.pubkey
~]# gpg --list-keys
- 用从hostA主机导入的公钥,加密hostB主机的文件 file1 ,生成 file1.gpg
~]# gpg -e -r wange file1
~]# file file1.gpg
- 从hostB主机上把刚刚加密生成的文件 file1.gpg 复制给hostA主机
~]# scp file1.gpg hostA:
- 在hostA主机上解密hostB主机传来的文件 file1.gpg
~]# gpg -o file1 -d file1.pgp
- 删除公钥和私钥
~]# gpg --delete-keys wange
~]# gpg --delete-secret-keys wange