密码学密码注意事项

2021-01-17 01:54:50

我以为我应该发表有关密码学密码(算法)之类的文章。例如,在我之前的文章中我提到了AES,EDH等,但这只是冰山一角,因为每种算法都有很多适合不同任务的算法。当我遇到这些内容时,会将它们添加到这篇文章中,作为对自己的快速参考。

对称密钥算法是用于加密的密钥。 F0r示例:服务器与客户端之间的流量加密以及磁盘上的数据加密。

DES –数据加密标准–由IBM DES设计是一种标准。实际使用的算法也称为DES或有时称为DEA(数字加密算法)。

三重DES(3DES)应用DES算法三次,因此具有更好的实用安全性。它具有3个密钥,每个密钥为56位(应用于DES / DEA的每个通道)。

AES –高级加密标准–是DES的后继AES基于Rijndael密码。选择了将成为AES的密码是一场竞争。 Rijndael密码赢得了比赛。但是,Rijndael及其在AES中的实现之间存在一些差异。

AES可以在多种模式下运行。首选AES-GCM(在伽罗瓦/计数器模式(GCM)中运行的AES)(也请查看此博客文章)。它既快速又安全,并且与流密码相似。也可以在低硬件上达到高速。仅在TLS 1.2及更高版本上受支持。

AES-CBC是老客户通常使用的。 AES-CBC模式容易受到Lucky13和BEAST之类的攻击。

河豚鱼-由Bruce Schneier设计,作为DES的替代产品;到目前为止还没有问题,但是如果密钥很弱,可以被攻击,最好使用Twofish或Threefish。使用32到448位的可变大小密钥。被认为是安全的。专为快速CPU而设计,现在是较慢/较旧的CPU。

Twofish-由Bruce Schneier等人设计,作为Blowfish的后继者使用大小为128、192或256位的密钥。设计成比Blowfish更灵活(就硬件要求而言)。

MARS –由Don Coppersmith(曾参与DES)和IBM的其他人设计

RC6 – Rivest Cipher 6或Ron的Code 6 –由Ron Rivest和其他人设计

RC4 – Rivest Cipher 4,或Ron的Code 4 –也称为ARC4或ARCFOUR(称为RC4)。曾经是RSA Data Security Inc(RSADSI)的未专利商业秘密。然后有人匿名将源代码在线发布,并进入了公共领域。

速度很快,但比其他算法研究较少。如果密钥从不重用,则RC4很好。然后许多人认为它是安全的。

实际上,不建议使用RC4。 TLS 1.1及更高版本禁止RC4(也是RFC)。 CloudFlare建议不要这样做(也请查看此博客文章)。 Microsoft建议不要这样做。当前的总体建议是使用TLS 1.2(禁止RC4)和使用AES-GCM。

RC4是流密码。它是使用最广泛的流密码。最近发现分组密码存在问题(例如BEAST,Lucky13),因为RC4的重要性提高了。现在,这种攻击已得到缓解(例如,使用GCM模式),强烈建议使用RC4。

每一方都有一个私钥(保留的秘密)和一个公钥(所有人都知道)。这些以以下方式使用:

公钥用于加密,私钥用于解密。例如:向一方发送加密的内容,请使用其公钥并发送加密的数据。由于只有该参与方具有相应的私钥,因此只有该参与方可以对其进行解密。 (用您的私钥对其进行加密是没有意义的,因为任何人都可以使用您的公钥进行解密!)

私钥用于签名,公钥用于验证。例如:要对某项进行数字签名,请使用您的私钥对其进行加密(通常会进行哈希处理,并对哈希进行加密)。任何人都可以解密此数据(或解密哈希&数据并自己执行哈希以验证您的哈希及其哈希匹配)并验证由于它是由您的私钥签名的,因此数据属于您。

这些算法通常用于对数据进行数字签名和/或交换可以与对称密钥算法一起使用以加密其他数据的密钥。它们通常不用于加密对话,这是因为它们(DSA,Diffie-Hellman)不能这样做,或者是因为收率低并且存在速度限制(RSA)。这些算法大多数都出于内部目的而使用哈希函数(请参见下文)。

RSA-设计师Ron Rivest,Adi Shamir和Leonard Adleman的缩写通常使用RSA共享密钥,然后使用对称密钥算法进行实际加密。

RSA可以用于数字签名,但速度较慢。 DSA(请参阅下文)是首选。但是,RSA签名的验证速度更快。为了对数据进行签名,将对它进行哈希处理,并使用私钥对哈希进行加密。 (注意:RSA要求进行散列而不是对数据本身进行加密)。

公钥和私钥基于两个必须保密的大质数。 RSA的安全性基于难以分解大整数这一事实。 (公钥和私钥是从两个大质数得出的大整数)。

PKCS#1是用于实现RSA算法的标准。如果满足某些条件,则可以攻击RSA算法,因此PKCS#1定义了不满足这些条件的事物。有关更多信息,请参见此帖子。

DSA –数字签名算法–由NSA设计,是用于数字签名的数字签名标准(DSS)的一部分。不进行加密。 (但是实现可以使用RSA或ElGamal加密进行加密)

DSA签名速度很快,但验证速度却很慢。与RSA先对数据进行哈希处理,然后对其进行加密以对邮件进行签名(而此数据加上加密的哈希用于验证签名)不同,DSA的处理过程有所不同。 DSA会直接从私钥中生成由两个160位数字组成的数字签名以及要签名的数据的哈希值。相应的公钥可用于验证签名。验证缓慢。

关于速度的注意事项:DSA签名速度更快,验证速度很慢。 RSA的验证速度更快,但签名的速度却很慢。这的意义与您可能认为的不同。签名可以用于对数据进行签名,也可以用于身份验证。例如,使用SSH时,您需要使用私钥对一些数据进行签名并发送到服务器。服务器会验证签名,如果签名成功,则说明您已通过身份验证。在这种情况下,DSA验证速度很慢并不重要,因为它通常发生在功能强大的服务器上。在相对较慢的计算机/电话/平板电脑上进行DSA签名的过程要快得多,因此在处理器上的强度较低。在这种情况下,首选DSA!记住:慢/快活动发生的地方也很重要。

DSA仅可用于签名。因此,DSA必须使用Diffie-Hellman之类的东西来生成另一个用于加密对话的密钥。这是一件好事,因为它允许完全前向保密(PFS)。转发保密=>用于加密两方之间对话的共享密钥与他们的公共/私有密钥无关。

完美前向保密=>除上述之外,共享密钥是为每个会话生成的,并且彼此独立。

另外,由于DSA仅可用于数字签名而不能用于加密,因此通常不受出口或进口限制。因此,它可以被更广泛地使用。

本文的3.9.1.2节值得一读。由于它是由国家安全局(NSA)设计的,因此DSA存在一些争议。

SSH v2可以使用RSA或DSA密钥(用于身份验证)。它更喜欢DSA,因为RSA曾经受到专利保护。但是现在专利已经过期,支持RSA。

DSA(和ECDSA)需要随机数。如果随机数生成器比较弱,则可以从流量中找出私钥。请参阅此博客文章和RFC,以获得良好的解释。这些StackExchange答案也值得一读:1、2和3。

ECDSA –椭圆曲线DSA ECC基于椭圆曲线理论,解决了很难打破的“椭圆曲线离散对数问题(ECDLP)”问题。

ECC密钥优于RSA& DSA的关键在于算法难以破解。因此,不仅ECC密钥更适合将来使用,还可以使用长度较短的密钥(例如256位ECC密钥与3248位RSA密钥一样安全)。

与DSA一样,它需要一个很好的随机数源。如果来源不好,则私钥可能会泄漏。

尽管ECDLP很难解决,但如果实施中选择的曲线不佳,有许多攻击可以成功打破ECC。为了获得良好的ECC安全性,必须使用SafeCurves。例如D.J.的Curve25519伯恩斯坦。

例如,在比特币中广泛使用,并在iOS中广泛使用。许多Web服务器也在采用它。

ElGamal –由Taher ElGamal设计Taher ElGamal还设计了ElGamal签名,DSA是该签名的变体。 ElGamal签名没有被广泛使用,但DSA被广泛使用。

Diffie-Hellman(DH)–由Whitfield Diffie,Martin Hellman和Ralph Merkle设计。不进行加密或签名。它仅用于获得共享密钥。与RSA由一方选择共享密钥并通过加密将其发送给另一方的RSA不同,此处共享密钥是在会话过程中生成的-双方都无法选择该密钥。

这是它的简要工作原理:(1)双方商定一个较大的质数和一个较小的公用数字,(2)双方然后为自己选择一个秘密数字(私钥)并计算另一个数字(公共密钥) (3)公钥彼此共享,并使用彼此的公钥,素数和小数,各方可以计算(相同)共享密钥。该算法所包含的数学功能的妙处在于,即使窥探者知道素数,小数和两个公钥,它仍然无法推断出私钥或共享密钥!这两方公开地获得了一个共享密钥,因此没有人在他们的谈话中窥探自己。

有两个版本:固定/静态版本(称为“ DH”),其中所有对话都使用相同的密钥,

临时版本(称为“ EDH”(Ephermeral Diffie-Hellman)或“ DHE”(Diffie-Hellman临时),其中每个对话都有不同的密钥。

散列函数获取输入数据并返回一个值(称为散列或摘要)。输入和消息摘要具有一对一的映射,因此,给定输入,您将获得唯一的摘要,即使对输入进行很小的更改也会导致不同的摘要。哈希是一种函数-给定输入即可轻松创建摘要,但给定摘要实际上几乎不可能生成创建摘要的输入。

MD2 –消息摘要2 –由Ron Rivest设计不再被认为是安全的,但仍在公钥基础结构(PKI)证书中使用,但正在逐步淘汰吗?

MD4 –消息摘要4 –由Ron Rivest设计,用于在Windows NT,XP,Vista和7中创建NTLM密码哈希。

不再建议使用MD4,因为存在会产生冲突的攻击(即,针对不同的输入使用相同的哈希值)。

不再建议使用MD5,因为已经在其中发现了漏洞并积极利用了这些漏洞。

由NSA设计的SHA-1(安全哈希算法1)与SHA-0非常相似,但纠正了许多所谓的弱点。也与MD-4有关。

用途非常广泛,但不推荐使用,因为随着技术的进步,对此有理论上的攻击可能会变得实用。

SHA-2是新建议。例如,自2017年1月起,Microsoft和Google将停止接受带有SHA-1哈希的证书。

SHA-2 –安全哈希算法2 –由NSA设计。创建224、256、384或512位的哈希。这些变体称为SHA-224,SHA-256,SHA-384,SHA-512,SHA-512 / 224和SHA-512 / 256。 SHA-256和SHA-512新的哈希函数。它们彼此相似。这些是这个家庭的流行功能。

SHA-512 / 224和SHA-512 / 256也是上述两者的截短版本,但有一些其他区别。

惠而浦-由Vincent Rijmen(AES的共同创建者)和Paulo S. L. M. Barreto设计。

RIPEMD – RACE完整性基元评估消息摘要基于MD-4的设计原理。性能类似于SHA-1。但是没有被广泛使用。

是在一个开放的学术社区中设计的,旨在替代NSA设计的SHA-1和SHA-2。

现在有很多变体:RIPEMD-128创建128位哈希(作为原始RIPEMD哈希),RIPEMD-160创建160位哈希,RIPEMD-256创建256位哈希,RIPEMD-320创建320位哈希。

PEM(隐私增强邮件)是用于存储私钥,数字证书(公共密钥)和受信任的证书颁发机构(CA)的首选格式。如果存储了链,则第一个证书是服务器证书,第二个证书是颁发者证​​书,依此类推。最后一个可以是自签名的,也可以是(根CA的)。

该文件以---- BEGIN CERTIFICATE ----行开头,并以---- END CERTIFICATE ----行结尾。数据为文本格式。

私钥文件(即未存储在密钥库中的私钥)必须采用PKCS#5 / PKCS#8 PEM格式。

P7B(公共密钥密码标准#7(PKCS#7))是一种用于存储数字证书(无私钥)的格式。有关WikiPedia中PKCS的更多信息。 PKCS#7用于在PKI下对消息进行签名和/或加密。还要传播证书。

PFX / P12(公钥密码标准#12(PKCS#12))是用于存储私钥,数字证书(公钥)和可信CA的格式。

SSL / TLS是使用上述SSL的协议,版本为1.0到3.0。 SSL版本3.1变为TLS 1.0。 TLS的版本为1.0到1.2。 SSL和TLS不能互操作(TLS 1.0可以禁用某些较新的功能,因此安全性受到削弱,使其可以与SSL 3.0互操作)

自撰写本文以来,我遇到了一些与上述主题相关的链接。以为我会把它们添加到这篇文章中,以防其他人发现这些有用: