欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据加密

程序员文章站 2022-03-04 19:45:46
...

最近女友突然问我什么是加密:

我当然毫无求生欲的先偷懒贴一波百度的加密

      数据加密,是一门历史悠久的技术,指通过加密算法和加***将明文转变为密文,而解密则是通过解密算法和解***将密文恢复为明文。它的核心是密码学。
      数据加密仍是计算机系统对信息进行保护的一种最可靠的办法。它利用密码技术对信息进行加密,实现信息隐蔽,从而起到保护信息的安全的作用。

然后我就被打了,原因:你敷衍我。。。。

简单来说就是通过加密算法将明文(谁拿到内容,都能看懂的),变为密文(别人都看不懂,只有某些人才能看懂的内容)。

加密的方法根据**的不同分为两种体系。

对称加密非对称加密

对称加密:就是加密和解密用同一种**。比如我们都了解的阿特巴希加密法,26个英文字母正序和倒叙排列就是对应的关系。

明文是A 对应的 密文就是Z
明文是B 对应的 密文就是Y

在阿特巴希密码中“nlmvb”代表“MONEY”。

制作密文是用阿特巴希加密法制作,读取也就是解密是也用阿特巴希加密法解密。

比如我想对女友说I Love You 。我要先用加密码改造成密文,也就是R OLEV BLF 而而她想看懂也要用相同的加密发。

这就是对称加密。

优点:效率高,加密速度快,可以加密大量的数据,几G到几十G;

缺点:**的传递问题,特别是多个人同时通信。
我用的**怎么远程传递给女友呢?
多人同时通信的问题,如果我在群聊里说了一句密文,只想让女友知道,但是所有知道我加密法的人都能知道我的意思。也就造成的安全隐患。

非对称加密

加密和解密使用不同的**。

通过公钥和私钥实现的,就是我发布了两个规则,一个规则用来加密叫做公钥,一个规则用来解密叫做私钥。比如一段信息:6666 用公钥加密后是rueidgfsnj,然后用私钥解密后是6666。

公钥就随便传播,反正私钥在我手上只有我能读。

进一步解释就是收文件的一方发送公钥给别人。

优点:解决了**传递的问题

缺点:效率低,加密速度慢,比对称加密速度慢1000倍,只能加密少量数据

对称加密+非对称加密
将一段信息先进行对称加密,因为速度快,能加密大文件。然后将对称加密的**进行非对称加密,最后传输的是2个文件,1、被加密的数据文件。2、被加密的**文件。

解密时,先用私钥解***文件,获得对称加密的**,然后用这个**解密数据文件。

数据加密

加密算法:

就是具体的数据加密过程了。

GPG
      PGP是比较成熟的加密算法,由于PGP算法太安全(**它需要3亿年),属于美国*严禁传入中国的计算机产品。我们现在能够得以使用GnuPG(它是PGP的开源产品),是要感谢GNU和*软件运动,这也是我们推崇开源运动的原因!!GPG是一个完全免费、源代码公开,并且与PGP完全兼容的软件产品。今天,GPG已经拥有众多的企业和个人用户。作为一个开源并且免费的加密和数字签名软件已经存在多年。它不但可以为企业、个人之间的重要信息提供加密保护,还可以为出版的软件、内核等电子产品进行数字签名,防止产品被篡改,最大程度地保障信息安全。

SSL
      SSL:Secure Sockets
      Layer 安全套接层,为Netscape(美国网景公司)所研发;
      TLS:Transport Layer Security(传输层安全)是SSL的继任者,为网络通信提供安全及数据完整性的一种安全协议。
SSL的功能:
      TLS与SSL在传输层对网络连接进行加密,用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取及窃听。
      已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。
      目前一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境。
      SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。

HTTPS

具体操作:

secret:172.16.12.95
secret2:172.16.12.96

[aaa@qq.com ~]# useradd username1
[aaa@qq.com ~]# echo 000000 | grep username1 --stdin
[aaa@qq.com ~]# useradd username2
[aaa@qq.com ~]# echo 000000 | passwd username2 --stdin

用这两个用户登录。

【1】GPG

1、对称加密:

[aaa@qq.com ~]$ echo "hi username2" > file.txt
[aaa@qq.com ~]$ gpg -c file.txt

然后弹出这个。

数据加密
输入密码:英文字母,数字,字符,8位以上。

我的是:abc123_# 只要记住就好了。

[aaa@qq.com ~]$ ls
file.txt  file.txt.gpg

然后就很能看到加密后的文件了。

确实无法看懂…

数据加密

[aaa@qq.com ~]$ scp file.txt.gpg aaa@qq.com.16.12.96:/home/username2
把密文发过去。

secret2解密。

 gpg -d file.txt.gpg 

gpg: directory `/home/username2/.gnupg' created
gpg: new configuration file `/home/username2/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/username2/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/home/username2/.gnupg/secring.gpg' created
gpg: keyring `/home/username2/.gnupg/pubring.gpg' created
gpg: CAST5 encrypted data
gpg: encrypted with 1 passphrase
hi username2   >>>>>>>这个就是解密后的内容
gpg: WARNING: message was not integrity protected

需要输入在1上设置的密码。abc123_#。就可以解码了。

[aaa@qq.com ~]$ gpg -d file.txt.gpg  > file1
直接存到硬盘上。

2、非对称加密

这个最好直接连虚拟而不是远程,因为会根据鼠标键盘的移动轨迹记录随机数。远程工具没有鼠标,很慢。

[aaa@qq.com ~]$ gpg --gen-key

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1	##加密算法

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)	##**长度
Requested keysize is 2048 bits

Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 0	##**的有效期
Key does not expire at all

Is this correct? (y/N) y

GnuPG needs to construct a user ID to identify your key.

Real name: user2-node2		##唯一标识
Email address: aaa@qq.com.com	##邮箱
Comment: user2's key		##描述,可以不写

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O	##确认

数据加密
看上边的,动鼠标和键盘记录随机数。

数据加密
完成状态。

数据加密
这几个就是生成的文件了。

在家目录的.gnupg/下。

查看公钥,私钥:

[aaa@qq.com ~]$ gpg --list-key    //公钥
/home/username1/.gnupg/pubring.gpg
----------------------------------
pub   2048R/2318820A 2019-12-13
uid                  username-12.95 (username1's key) <aaa@qq.com.com>
sub   2048R/72FC8115 2019-12-13

[aaa@qq.com ~]$ gpg --list-secret-key   //私钥
/home/username1/.gnupg/secring.gpg
----------------------------------
sec   2048R/2318820A 2019-12-13
uid                  username-12.95 (username1's key) <aaa@qq.com.com>
ssb   2048R/72FC8115 2019-12-13

username1给username2发送文件:

user2导出公钥:

[aaa@qq.com ~]$ gpg --export username2-12.96		//乱数形式  后边的是公钥的real-name,上边说的唯一标识。
[aaa@qq.com ~]$ gpg --export --armor username2-12.96		//二进制形式

数据加密
乱数形式的

[aaa@qq.com ~]$ gpg --export --armor username2-12.96
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)

mQENBF3z3d4BCADKfMNGyidxEChZEuFXErnARnoDeZJluGXkyC/mXSBVzNGnS7mI
e4xQUclVNEdPUYYFDRgW2vE6ggReA1O7giwZX+Fw1ePFYaLtG0mD/zUTzWUP+K5S
/69gX9R87lrLQCB4EilSwF0quLgY9K0MeNkF1655KtEsFxs68jjAGu4VvVRP3xmN
40wNKCXXVwGoW/gUDcVoQPcrCgmfAAkiS46lv5J0X0a8WzB9G+FagPNJvjUGDynC

二进制形式的。

[aaa@qq.com ~]$ gpg --export --armor username2-12.96 > username2.pub
制作公钥文件

用scp发给username1

username1导入2 的公钥

[aaa@qq.com ~]$ gpg --import username2.pub 

查看公钥发现有2个
[aaa@qq.com ~]$ gpg  --list-key
/home/username1/.gnupg/pubring.gpg
----------------------------------
pub   2048R/2318820A 2019-12-13
uid                  username-12.95 (username1's key) <aaa@qq.com>
sub   2048R/72FC8115 2019-12-13

pub   2048R/2BB8ED53 2019-12-13
uid                  username2-12.96 (username2's key) <aaa@qq.com.com>
sub   2048R/1E4DA576 2019-12-13

username1用2 的公钥加密。

[aaa@qq.com ~]$ cp /etc/passwd ./userlist.txt
做一个数据文件。
[aaa@qq.com ~]$ gpg --encrypt --recipient username2-12.96  --armor userlist.txt
加密

此时u2发过来的那个公钥文件基本没啥用了,因为已经导入了公钥。

[aaa@qq.com ~]$ ls
file.txt  file.txt.gpg  userlist.txt  userlist.txt.asc  username2.pub

已经能看到userlist.txt.asc这个加密后的文件。

再把这个加密后的文件发给u2

user2解密:

[aaa@qq.com ~]$ gpg --decrypt --armor userlist.txt.asc
	输入自己的私钥密码
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
就能看到文件内容了

导入的公钥是不被信任的,需要对公钥进行签名操作:
u1

[aaa@qq.com ~]$ gpg --fingerprint username2-12.96
	查看u2的公钥的指纹信息
[aaa@qq.com ~]$ gpg --sign-key username2-12.96
	对u2的公钥进行签名操作
	输入自己的私钥密码
Really sign? (y/N) y

现在在用公钥进行加密就不回提示是危险的公钥。

【2】openssl

[aaa@qq.com ~]$ openssl
OpenSSL> ?
openssl:Error: '?' is an invalid command.

Standard commands
asn1parse         ca                ciphers           cms               
crl               crl2pkcs7         dgst              dh   
Standard commands	
	//命令

Message Digest commands (see the `dgst' command for more details
	//用于签名的加密算法
	
Cipher commands (see the `enc' command for more details)
	//用于加密的加密算法

1、对称加密:
user1

[aaa@qq.com ~]$ openssl enc -e -bf -in userlist.txt -out userlist.txt.ssl
enter bf-cbc encryption password:  //设置对称加密的密码
Verifying - enter bf-cbc encryption password:
	enc	加密操作
	-e	加密
	-bf	加密算法
	-in		准备加密的文件
	-out	加密后生成的文件
[aaa@qq.com ~]$ scp userlist.txt.ssl aaa@qq.com.16.12.96:/home/username2
发给u2

user2

[aaa@qq.com ~]$ openssl enc -d -bf -in userlist.txt.ssl -out userlist.txt
enter bf-cbc decryption password://输入user1 那边设置的密码

然后生成文件userlist.txt

[aaa@qq.com ~]$ cat userlist.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
ok

2、非对称加密
生成公钥和私钥:
私钥可以设置密码,也可以不设置密码。

[aaa@qq.com ~]$ openssl genrsa 1024 > user2.pri
	创建私钥,无密码
 user2.pri私钥文件
 
[aaa@qq.com ~]$ openssl genrsa -des3 1024 > user2.pas
Generating RSA private key, 1024 bit long modulus
......................................................++++++
.........++++++
e is 65537 (0x10001)
Enter pass phrase:
Verifying - Enter pass phrase:
	创建私钥,有密码

从私钥中提取公钥

[aaa@qq.com ~]$ openssl rsa -in user2.pri -pubout -out user2.pub
writing RSA key

user2.pub这个是公钥文件
[useaaa@qq.com ~]$ openssl rsa -in user2.pas -pubout -out user2.pub1
Enter pass phrase for user2.pas:输入私钥密码
writing RSA key

带密码私钥提取公钥
[aaa@qq.com ~]$ scp user2.pub aaa@qq.com.16.12.95:/home/username1

公钥发给u1
[aaa@qq.com ~]$ openssl rsautl -in userlist.txt -out userlist-txt.sec -pubin -inkey user2.pub -encrypt
RSA operation error
139963374098336:error:0406D06E:rsa routines:RSA_padding_add_PKCS1_type_2:data too large for key size:rsa_pk1.c:153:
可以看到报错,因为文件太大了。

[aaa@qq.com ~]$ ls -lh userlist.txt
-rw-r--r-- 1 username1 username1 1.8K Dec 14 03:01 userlist.txt
这都算大。。。。。。

user1重新加密

[aaa@qq.com ~]$ echo "123456" > key
[aaa@qq.com ~]$ openssl rsautl -in key -out key.sec -pubin -inkey user2.pub -encrypt

[aaa@qq.com ~]$ scp key.sec aaa@qq.com.16.12.96:/home/username2
发给user2

user2 解密

[aaa@qq.com ~]$ openssl rsautl -in key.sec -out key -inkey user2.pri -decrypt

[aaa@qq.com ~]$ cat key
123456

3、对称加密+非对称加密
user1给user2发送大文件,并加密。
首先、用对称加密加密大的数据文件。
其次、用非对称加密法加密对称加密的加密算法和密码,生成**密码文件。
最后、user2 用私钥解***密码文件,获得对称加密的算法和密码,用得到的算法和密码解密数据文件。

user1:

[aaa@qq.com ~]$ openssl enc -e -bf -in userlist.txt -out userlist.txt.ssl
对称加密大文件。并设置密码。

[aaa@qq.com ~]$ echo "-bf,123" > key
制作**文件,里边写了对称加密的算法和密码。

[aaa@qq.com ~]$ openssl rsautl -in key -out key.sec -pubin -inkey user2.pub -encrypt
非对称加密加密这个**文件。、

[aaa@qq.com ~]$ scp key.sec aaa@qq.com.16.12.96:/home/username2
[aaa@qq.com ~]$ scp userlist.txt.ssl aaa@qq.com.16.12.96:/home/username2
两个文件都发给user2

user2解密

[aaa@qq.com ~]$ openssl rsautl -in key.sec -out key -inkey user2.pri -decrypt
解***文件
[aaa@qq.com ~]$ cat key
-bf,123
获得对称加密的算法和密码
[aaa@qq.com ~]$ openssl enc -d -bf -in userlist.txt.ssl -out userlist.txt
enter bf-cbc decryption password:
输入密码 用bf算法

[aaa@qq.com ~]$ 
[aaa@qq.com ~]$ ls
key.sec    user2.pub     userlist.txt.asc  username2.pub
key           user2.pri  userlist.txt--->这个就是解密后的大文件, 

到此,加密就基本说完了。我女友是懂了,非常开心的打了我,说又知道了对她来说没啥用的东西。

我直接吓醒了,然后长出了一口气,幸好我没有女朋友。

相关标签: 安全