当前位置:   article > 正文

【ARM 安全系列介绍 3-- Openssl 常用加密算法】_openssl加密算法

openssl加密算法

1.1 Symmetric encryption and decryption

在这里插入图片描述

1.1.1 加密算法分类

分为单向加密双向加密
单向加密 包括 MD5SHA “加密” 算法等等。单向“加密”算法是不可逆的,也就是无法将加密后的数据恢复成原始数据,除非采取碰撞攻击和穷举的方式。像是银行账户密码的存储,一般采用的就是单向加密的方式。

这里的”加密“实际为摘要生成哈希值。

双向加密是可逆的,存在密文的密钥,持有密文的一方可以根据密钥解密得到原始明文,一般用于发送方和接收方都能通过密钥获取明文的情况。

双向加密包括对称加密非对称加密
非对称加密的意思是加密的秘钥和解密的秘钥不一样。
对称加密的意思是加解密用的是同一个秘钥。

对称加密包括 3DES、Blowfish、IDEA、RC4、RC5、RC6、AES等,AES 加密主要包括两个步骤:密钥扩展明文加密
非对称加密包括 RSA加密ECC加密

1.1.2 软件加密

软件加密也即cpu执行加密算法将明文变为密文,加密的过程需要传入的参数有、秘钥、数据地址等。

1.1.3 加密硬件engine加密

有些公司会单独实现硬件加解密 Engine 支持多种加/解密算法。

1.1.4 ARMV8的ACE去加密(ARMV7并不支持硬件加密)

目前 armv8 架构里面已经支持硬件加解密,所以只需要配置相关的寄存器即可。

1.2 AES/DES 对称加解密

(1) 加密
对字符串 ‘abc’(明文) 进行 AES 加密,使用密钥 123,输出结果以 base64 编码格式给出:

# echo -n abc | openssl aes-128-cbc -k 123 -base64
  • 1

Base64是一种基于64个可打印字符来表示二进制数据的表示方法。base64要求将每三个8bits字节转换为四个6bit的字节(3 * 8
= 4 * 6 = 24),然后将转换后的6bit往高位添加2个0,组成4个8bit的字节,再根据这4个8bit字节的十进制在索引表中查找对应的值,此时得到的结果就是Base64值。Base64也起到了一定的加密作用(起码不是人一眼就能看懂的)

加密后的密文:

U2FsdGVkX18ynIbzARm15nG/JA2dhN4mtiotwD7jt4g=
  • 1

(2) 解密
对以上密文进行解密处理:

# echo U2FsdGVkX18ynIbz...7jt4g= | openssl aes-128-cbc -d -k 123 -base64
  • 1

解密结果

abc 
  • 1

若要从文件里取原文(密文)进行加密(解密),只要指定 -in 参数指向文件名就可以了。进行 des3 加解密,只要把命令中的 aes-128-cbc 换成 des3 就可以了。

1.3 SHA 摘要

一个 n 位的哈希函数就是一个从任意长的消息到 n位哈希值的映射,一个n位的加密哈希函数就是一个单向的、避免碰撞的n位哈希函数。这样的函数是目前在数字签名和密码保护当中极为重要的手段。
当前比较流行的哈希函数主要有128 位的 MD4MD5 和160位的 SHA-1

1.3.1 SHA MD5 摘要

1)对字符串进行md5摘要
对字符串 ‘abc’ 进行 md5 摘要计算:

echo abc | openssl md5
  • 1

2)对文件进行 MD5 摘要计算:

openssl md5 -in t.txt
  • 1

使用 md5 进行签名的时候可以指定其他摘要算法, 太别扭了。建议做摘要和签名验证时使用 dgst 指令。

1.3.2 SHA1 摘要

1). 对字符串 ‘abc’ 进行 sha1 摘要计算:

echo abc | openssl sha1
  • 1
  1. 对文件进行sha1摘要计算:
openssl dgst -sha1 file.txt
  • 1

1.3.3 SHA2 简介

安全散列算法2,是 SHA-1的后继者。其下又可再分为六个不同的算法标准,包括了:SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256

1.3.4 SHA256 摘要

对于任意长度的消息,SHA256 都会产生一个 256 位的哈希值,称作消息摘要。这个摘要相当于是个长度为 32 个字节的数组,通常有一个长度为 64 的十六进制字符串来表示。因为 md5sha1 有被碰撞和破解的可能性,所以使用 sha256

  • 对字符串 ‘abc’ 进行 sha256 摘要计算:
echo -n abc | openssl sha256
  • 1
  • 对文件进行sha256摘要计算:
openssl dgst -sha256 file.txt
  • 1

也是同样的命令

  • 使用 sha256sum 命令计算哈希值
    • 当对字符串计算哈希值时,字符串不变,计算出的哈希值结果是一致的
    • 当对两个文件计算时,文件生成时间不同,但文件内容相同,计算出的哈希值是一致的

1.4 RSA 非对称加解密

SSL 是一个缩写,代表的是 Secure Sockets Layer。它是支持在 Internet 上进行安全通信的 标准,并且将数据密码术集成到了协议之中。数据在离开您的计算机之前就已经被加密,然后只有 到达它预定的目标后才被解密。

1.4.1 公钥私钥生成

先生成私钥,再由私钥产生公钥
(1) 私钥生成

openssl genrsa -out rsa_private_key.pem 1024
  • 1

生成一个RSA算法私钥(genrsa),保存到(-out)名为rsa_private_key.pem的文件中。

这个命令还可以加上一些可选参数,如:

openssl genrsa -aes128 -out private.key 2048
  • 1
  • -aes128,将私钥以 AES-128算法保护,另有-aes129-aes256
  • 2048: 指定私钥长度为2048比特,默认是512比特,但512比特长度在现今技术环境下已不够安全

(2) 公钥生成

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
  • 1

1.4.2 公私钥的使用

  • 加密–公钥
  • 解密–私钥
  • 签名–私钥
  • 验证–公钥

genrsa 生成的文件并不包含公钥,但是包含了私钥的详细信息, rsa命令可以根据这个文件生 成对应的公钥。

生成私钥

$ openssl genrsa -out privkey.pem 2048
  • 1

生成公钥

$ openssl rsa -in privkey.pem -pubout -out pubkey.pem 
  • 1

用公钥加密

$ openssl rsautl -encrypt -pubin -inkey pubkey.pem -in test.txt -out test.txt.enc 
  • 1

-encrypt: 选项对明文进行加密;
-pubin: 选项告诉openssl通过;
-inkey: 选项传入的密钥为公钥,因为如果没有该选项,openssl默认认为-inkey传入的是私钥。

用私钥解密.

$ openssl rsautl -decrypt -in test.txt.enc -inkey privkey.pem -out test_decrypt.txt 
  • 1

结果: test_dec.txt 文件内容与test.txt内容一样

加密大文件(用户名及账户)
(1) openssl req -x509 -nodes -days 100000 -newkey rsa:2048 -keyout privatekey.pem -out publickey.pem

(2) openssl smime -encrypt -aes256 -in Readme.zip -binary -outform DEM -out LargeFile_encrypted.zip publickey.pem

(3) openssl smime -decrypt -in LargeFile_encrypted.zip -binary -inform DEM -inkey privatekey.pem -out LargeFile.zip

1.4.3 加签和验签

当用公钥来解密信息,确保信息是真的由具有私钥者发布的,且是完整正确的。这个过程被称作数字签名,公钥的形式就是数字证书。所以这种我们称之为加签和验签。

1.4.4 RSA加密、签名区别

简单的说,加密是为了防止信息被泄露,而签名是为了防止信息被篡改。
第一个场景:战场上,B要给A传递一条消息,内容为某一指令。
RSA 的加密过程如下:
1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。
2)A传递自己的公钥给B,B用A的公钥对消息进行加密。
3)A接收到B加密的消息,利用A自己的私钥对消息进行解密。
在这个过程中,只有2次传递过程,第一次是A传递公钥给B,第二次是B传递加密消息给A,即使都被敌方截获,也没有危险性,因为只有A的私钥才能对消息进行解密,防止了消息内容的泄露。

第二个场景:A 收到 B发的消息后,需要进行回复“收到”。
RSA签名的过程如下:
1)A生成一对密钥(公钥和私钥),私钥不公开,A自己保留。公钥为公开的,任何人可以获取。
2)A 用自己的私钥对消息加签,形成签名,并将加签的消息和消息本身一起传递给B。
3)B 收到消息后,在获取A的公钥进行验签,如果验签出来的内容与消息本身一致,证明消息是A回复的。
在这个过程中,只有2次传递过程,第一次是A传递加签的消息和消息本身给B,第二次是B获取A的公钥,即使都被敌方截获,也没有危险性,因为只有 A 的私钥才能对消息进行签名,即使知道了消息内容,也无法伪造带签名的回复给B,防止了消息内容的篡改。

1.4.3 ECDSA

【ARM 安全系列介绍 3.1 – 数字签名算法 ECDSA】

1.4.4 BASE64

详情见【ARM 安全系列介绍 3.2 – Base64 介绍】

1.4.5 DES3介绍及应用

见:【ARM 安全系列介绍 3.3 – DES3 详细介绍并举例应用】

1.5 证书

1.5.1 不同格式证书的转换

一般证书有三种格式:

  • PEM(.pem)前面命令生成的都是这种格式,
  • DER(.cer .der) Windows上常见
  • PKCS#12文件(.pfx .p12) Mac上常见

(1)PEM转换为DER

#openssl x509 -outform der -in myserver.crt -out myserver.der
  • 1

(2) DER转换为PEM

#openssl x509 -inform der -in myserver.cer -out myserver.pem
#openssl pkcs12 -export -out myserver.pfx -inkey myserver.key -in myserver.crt -certfile ca.crt
  • 1
  • 2

(3) PKCS转换为PEM

#openssl pkcs12 -in myserver.pfx -out myserver2.pem -nodes
  • 1

推荐阅读:
https://juejin.cn/post/6995549209348816909

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/637511
推荐阅读
相关标签
  

闽ICP备14008679号