menu E4b9a6's blog
rss_feed
E4b9a6's blog
有善始者实繁,能克终者盖寡。

程序开发常见加密算法

作者:E4b9a6, 创建:2021-02-03, 字数:4113, 已阅:36, 最后更新:2021-02-03

这篇文章更新于 1387 天前,文中部分信息可能失效,请自行甄别无效内容。

日常开发里经常遇到一些加密算法,大部分都是略知一些细节,这次有时间整理一下程序开发时经常遇到的加密算法

算法种类

加密算法普遍来说分为三类

  • 对称加密(Symmetric-key algorithm)
  • 非对称加密(Public-key cryptography)
  • 散列加密(Hashing)

而常见主要算法有如下

  • 对称加密
    • DES/3DES/AES
  • 非对称加密
    • RSA/DSA
  • 散列
    • SHA-1/MD5

算法区别

对称加密 - Symmetric-key algorithm

实现过程

  1. 发送方A将原始数据(明文)和加密密钥一起经过特殊的加密处理,生成复杂的加密密文,发送给接收方B
  2. 接收方B接收到密文,使用相同的密钥进行解密即可得到明文

在这个过程里,任意一个拥有密钥的人均可充当接收方,对称加密是非绝对安全的加密方式,也是无法认证解密人身份的加密方式 对称加密的速度比非对称加密要快很多,适用于安全性不高但对速度敏感的应用场景 广为人知的对称加密算法主要有DES和AES,另外还有Blowfish、Skipjack、session key等对称加密的算法应用 其中最为流行的是AES加密算法

非对称加密(公开密钥加密) - Public-key cryptography

实现过程

  1. 发送方A将原始数据(明文)使用接收方B的公钥进行特殊的加密处理,生成复杂的加密密文,发送给接收方B
  2. 接收方B接收到密文,使用接收方B(自己)私钥进行解密即可得到明文

在这个过程中,除非接收方B泄露了自己的私钥,否则不存在其他人可以读取密文的情况,公钥只能用于加密无法用于解密,基于这种特性,非对称个加密也提供数字签名的功能,即使签发电子文件使得有与实际纸张上签名效果一般

数字签名(英语:Digital Signature,又称公钥数字签名)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法,一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证,但法条中的电子签章与数字签名,代表之意义并不相同,电子签章用以辨识及确认电子文件签署人身份、资格及电子文件真伪者,而数字签名则是以数学算法或其他方式运算对其加密,才形成的电子签章,意即并非所有的电子签章都是数字签名, --维基百科

公开密钥基础建设透过信任数字证书认证机构的根证书、及其使用公开密钥加密作数字签名核发的公开密钥认证,形成信任链架构,已在TLS实现并在万维网的HTTP以HTTPS、在电子邮件的SMTP以STARTTLS引入, --维基百科

散列加密

散列(英语:Hashing)是计算机科学中一种对数据的处理方法,通过某种特定的函数/算法(称为散列函数/算法)将要检索的项与用来检索的索引(称为散列,或者散列值)关联起来,生成一种便于搜索的数据结构(称为散列表),旧译哈希(误以为是人名而采用了音译),它也常用作一种信息安全的实现方法,由一串数据中经过散列算法(Hashing algorithms)计算出来的数据指纹(data fingerprint),经常用来识别文件与数据是否有被窜改,以保证文件与数据确实是由原创者所提供

简单讲就是数据的指纹,通过特定的算法将数据制作成唯一识别码

使用方式

  • 加密散列
  • 散列表
  • 关联数组
  • 几何散列

常见的加密算法

DES - Data Encryption Standard

非安全加密方式,引用DES - 维基百科的睡眠

DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短,1999年1月,distributed.net与电子前哨基金会合作,在22小时15分钟内即公开破解了一个DES密钥,也有一些分析报告提出了该算法的理论上的弱点,虽然在实际中难以应用,为了提供实用所需的安全性,可以使用DES的派生算法3DES来进行加密,虽然3DES也存在理论上的攻击方法,在2001年,DES作为一个标准已经被高级加密标准(AES)所取代,另外,DES已经不再作为国家标准科技协会(前国家标准局)的一个标准

3DES - Triple Data Encryption Algorithm

非安全加密方式,实际上是DES加密的强化版,对每个数据块应该3次DES加密,详细可参考3DES - 维基百科

密码学中,三重数据加密算法(英语:Triple Data Encryption Algorithm,缩写为TDEA,Triple DEA),或称3DES(Triple DES),是一种对称密钥加密块密码,相当于是对每个数据块应用三次数据加密标准(DES)算法,由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解;3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法>

AES - Advanced Encryption Standard

又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,是一种安全的加密方式,也是对称加密中最为主流的加密方式,其密钥长度为128/192/256 Bit,详细可参考AES - 维基百科

高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准,这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用,经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准,2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一

RSA - Ron Rivest & Adi Shamir & Leonard Adleman

RSA加密算法破解难度主要来自极大整数做因数分解的难度,目前而言对极大整数做因数分解仍没有很好的解决方法,故该算法在其钥匙足够长的情况下,理论上是不可能被破解的,详细可参考RSA - 维基百科

RSA加密算法是一种非对称加密算法,在公开密钥加密和电子商业中被广泛使用,RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的,当时他们三人都在麻省理工学院工作,RSA就是他们三人姓氏开头字母拼在一起组成的

DSA - Digital Signature Algorithm

数字签名算法(DSA)是基于模块化指数和离散对数问题的数学概念的,用于数字签名的联邦信息处理标准,DSA是Schnorr和ElGamal签名方案的变体,详细可参考Digital Signature Algorithm - Wiki

ECC - Elliptic-curve cryptography

椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线的代数结构的公钥密码学方法,与非EC加密(基于普通Galois字段)相比,ECC需要更小的密钥来提供同等的安全性,详细可参考Elliptic-curve cryptography - Wiki

SHA-1 加密算法

SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数,详细可参考SHA - Wiki

TIP:SHA1已不再是安全算法,目前业界主流也慢慢使用SHA-2/SHA-3来替换该算法

MD5 加密算法

MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致,MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法,这套算法的程序在 RFC 1321 中被加以规范,详细可参考MD5 - wiki

1996年后被证明存在弱点,可以加以破解,但普通用途安全性仍然足够(例如密码加密),针对高安全性的数据则应选择SHA-2,MD5算法本身也无法防御碰撞破解,


[[replyMessage== null?"发表评论":"发表评论 @ " + replyMessage.m_author]]

account_circle
email
web_asset
textsms

评论列表([[messageResponse.total]])

还没有可以显示的留言...
gravatar
[[messageItem.m_author]] [[messageItem.m_author]]
[[messageItem.create_time]]
[[getEnviron(messageItem.m_environ)]]
[[subMessage.m_author]] [[subMessage.m_author]] @ [[subMessage.parent_message.m_author]] [[subMessage.parent_message.m_author]]
[[subMessage.create_time]]
[[getEnviron(messageItem.m_environ)]]