概述
对称密钥算法和非对称密钥算法是两种常见的加密技术,它们在加密和解密数据时采用不同的方法。
-
对称密钥算法 :
- 对称密钥算法使用相同的密钥来加密和解密数据。
- 加密者和解密者必须共享相同的密钥。
- 加密速度快,适合大量数据的加密和解密。
- 典型的对称密钥算法包括DES、3DES、AES等。
- 缺点是密钥管理困难,需要安全地共享密钥,并且在传输过程中可能会被窃取。
-
非对称密钥算法 :
- 非对称密钥算法使用一对密钥,分别是公钥和私钥,用于加密和解密数据。
- 公钥是公开的,任何人都可以使用它来加密数据;私钥是保密的,只有拥有者才能解密数据。
- 加密者使用接收者的公钥来加密数据,接收者使用自己的私钥来解密数据。
- 非对称密钥算法还可以用于数字签名和密钥交换等安全操作。
- 典型的非对称密钥算法包括RSA、DSA、ECC等。
- 优点是密钥管理相对简单,不需要在传输过程中共享私钥,但加密和解密速度较慢。
总的来说,对称密钥算法适合加密大量数据,但需要安全地管理密钥;而非对称密钥算法相对更安全,但速度较慢,适合用于安全通信和数字签名等场景。通常,在实际应用中,对称密钥算法和非对称密钥算法会结合使用,以发挥各自的优势。
对称密钥算法
凯撒密码
凯撒密码是一种简单的替换加密技术,也称为移位密码。它是古典密码学中最早的密码之一,得名于古罗马军队领袖凯撒·尤利乌斯(Julius Caesar),据说他曾经使用过这种加密方法。
凯撒密码的原理很简单:它是一种替换密码,通过将字母按照一个固定的数目进行左移或右移来加密消息。例如,如果采用的是向右移动三个字母的方法,那么原文中的每个字母都被替换成它后面第三个字母。
举个例子,假设我们要加密的消息是 “HELLO”,并且采用的是向右移动三个字母的方法。那么加密后的消息就变成了 “KHOOR”。这是因为 “H” 向右移动三个字母后变成 “K”, “E” 向右移动三个字母后变成 “H”,以此类推。
解密凯撒密码也很简单,只要知道加密时使用的移位数,就可以将每个字母向左移动相同数量的字母来恢复原文。
尽管凯撒密码很容易理解和实现,但由于它的简单性,它并不安全,容易受到字母频率分析等攻击。因此,现代加密通常不再使用凯撒密码,而是使用更加复杂的加密算法来保护数据的安全。
恺撒密码,也称为恺撒加密或恺撒变换,是一种最古老且最简单的密码之一。它的原理很简单,就是通过将明文中的每个字母按照字母表顺序向后(或向前)移动固定的位置来进行加密。这个固定的位置就是密钥,通常用一个整数来表示,称为偏移量。
例如,当偏移量为3时,明文中的字母A将被加密为D,B被加密为E,以此类推。如果偏移量是负数,则向前移动相应的位置。这种方法相当于在字母表上进行循环移位。
加密过程 :
- 确定偏移量(密钥)。
- 对于要加密的明文中的每个字母,按照偏移量进行移位。
- 输出密文。
解密过程 :
- 知道加密时使用的偏移量。
- 对于密文中的每个字母,按照偏移量的负值进行移位。
- 输出明文。
示例 :
假设明文为:“HELLO”,偏移量为3。
- 加密:H + 3 = K,E + 3 = H,L + 3 = O,L + 3 = O,O + 3 = R
- 密文为:“KHOOR”
安全性 :
恺撒密码的安全性非常低,因为它只有26种可能的密钥(偏移量),攻击者可以很容易地通过穷举法来破解。因此,它更多地被用于教学和娱乐,而不是实际的安全通信中。
应用 :
恺撒密码虽然安全性低,但在教学、编程练习以及简单的加密需求中仍有一定的应用价值。
public class KaiserDemo {
public static void main(String[] args) {
// 定义原文
String input = "Hello Artisan";
// 把原文右边移动3位
int key = 3;
// 凯撒加密
String s = encrypt(input, key);
System.out.println("加密 " + s);
String s1 = decrypt(s, key);
System.out.println("明文 " + s1);
}
/**
* 解密
*
* @param s 密文
* @param key 密钥
* @return
*/
public static String decrypt(String s, int key) {
char[] chars = s.toCharArray();
StringBuilder sb = new StringBuilder();
for (char aChar : chars) {
int b = aChar;
// 偏移数据
b -= key;
char newb = (char) b;
sb.append(newb);
}
return sb.toString();
}
/**
* 加密
*
* @param input 原文
* @return
*/
public static String encrypt(String input, int key) {
// 抽取快捷键 ctrl + alt + m
// 把字符串变成字节数组
char[] chars = input.toCharArray();
StringBuilder sb = new StringBuilder();
for (char aChar : chars) {
int b = aChar;
// 往右边移动3位
b = b + key;
char newb = (char) b;
sb.append(newb);
}
return sb.toString();
}
}
优点
对称密钥算法的优点主要包括以下几个方面:
- 速度快 :对称密钥算法通常执行速度非常快,因为它们的加密和解密过程都使用同一个密钥。相比于非对称密钥算法,对称密钥算法在处理大量数据时更加高效。
- 安全 :尽管对称密钥算法在密钥管理方面存在挑战(例如安全地共享密钥),但在合适的环境中,它们可以提供足够的安全性。合理选择密钥长度、使用安全的算法以及正确实施密钥管理策略可以确保对称密钥算法的安全性。
- 紧凑 :对称密钥算法生成的密文通常比非对称密钥算法生成的密文更紧凑,因为它们不需要存储公钥和签名等额外信息。这使得对称密钥算法在网络通信和存储方面更加高效。
综上所述,对称密钥算法具有快速、安全和紧凑的优点,使其成为许多加密应用中的首选算法。然而,仍需谨慎使用并采取适当的安全措施,以确保密钥的安全性和算法的适用性。
缺点
对称密钥算法虽然具有许多优点,但也存在一些缺点:
- 密钥传输安全性问题 :在对称密钥算法中,密钥需要在通信的两端共享。然而,这种密钥共享过程可能会受到中间人攻击或窃听的威胁,导致密钥被泄露或篡改,进而危及通信的安全性。
- 密钥管理困难 :随着参与通信的参与者数量增加,需要的密钥数量呈指数级增长。密钥的管理和分发变得更加复杂,尤其是在大规模网络中,这可能会导致密钥管理问题变得非常困难。
- 密钥存储问题 :由于需要大量的密钥用于不同的通信对,因此密钥的存储成为一个重要的问题。对大量密钥的安全存储和管理需要耗费大量资源和精力,容易成为安全漏洞的来源。
- 缺乏数字签名和不可否认性支持 :对称密钥算法通常不支持数字签名和不可否认性,这意味着它们不能提供验证消息来源的功能,也不能防止发送者否认发送过消息的能力。这在某些安全应用场景下可能是一个限制因素。
综上所述,尽管对称密钥算法具有许多优点,但它们也存在一些显著的缺点,特别是在密钥管理和安全性方面的挑战。在选择加密方案时,需要综合考虑这些因素,并根据具体需求选择合适的算法和措施来确保通信的安全性。
非对称密钥算法
非对称密钥算法的主流协议为RSA,需要每一个参与者产生一对密钥。共享公钥到服务器,严格保障私钥的安全性。根据这种操作的特点,也被称作公共密钥系统。
工作原理
想象一下,你有一把神奇的锁,这个锁有两把钥匙:一把是公钥,一把是私钥。这两把钥匙是特殊设计的,只有一把钥匙可以打开锁,而另一把钥匙只能锁上锁,但无法打开。
现在,假设你想向你的朋友发送一封信,但你不想别人偷看你的信内容。你可以把你的锁放在信封上,然后把信封寄给你的朋友。你的朋友收到了信封后,只能用你的公钥(锁)来锁上信封,而无法打开。然后,他将这个信封寄回给你。当你收到回信时,你可以用你的私钥(另一把钥匙)来打开信封,读取里面的内容。
这就是非对称密钥算法的工作原理:发送方使用接收方的公钥加密数据,接收方使用自己的私钥解密数据。这样,即使数据在传输过程中被窃听,也只有接收方能够解密并阅读数据,因为私钥是只有接收方知道的。
这种方式保证了数据的安全传输,同时也确保了数据的完整性和真实性。
优点
您列出的非对称密钥的优点是正确的,让我更详细地解释一下:
- 安全性高 :非对称密钥算法基于数学上的难解问题,如大素数的乘积分解(RSA)或离散对数问题(DSA),因此具有较高的安全性。攻击者很难通过破解密钥来获取数据或伪造签名。
- 密钥分发安全 :由于非对称密钥的分发不需要在传输过程中交换私钥,只需要在安全通道中传输公钥,因此更安全。即使公钥被窃听,攻击者也无法获取私钥或篡改数据。
- 密钥数量与参与者数量相同 :每个参与者只需要生成一对密钥(公钥和私钥),并将公钥发布给其他参与者。这样可以简化密钥管理,不像对称密钥算法那样会出现密钥数量急剧膨胀的问题。
- 无需预先建立信任关系 :在使用非对称密钥算法进行通信时,不需要事先建立信任关系。参与者只需使用对方的公钥加密数据或验证签名即可,不需要担心安全性问题。
- 支持数字签名和不可否认性 :非对称密钥算法支持数字签名,发送者可以使用私钥对数据进行签名,接收者使用发送者的公钥验证签名的有效性。这确保了数据的完整性和真实性,同时也提供了不可否认性,即发送方无法否认发送过数据的事实。
综上所述,非对称密钥算法具有高安全性、安全的密钥分发、简化的密钥管理、不需要预先建立信任关系以及支持数字签名和不可否认性等优点,使其成为安全通信和数字签名中的重要工具。
缺点
非对称密钥算法虽然具有许多优点,但也存在一些缺点,其中包括:
- 加密速度较慢 :相比对称密钥算法,非对称密钥算法的加密和解密速度通常较慢。这是因为非对称密钥算法通常使用更复杂的数学运算,例如大数乘法、离散对数等,导致计算量较大,速度较慢。
- 密文长度变长 :非对称密钥算法加密后的密文长度通常会比原始数据长度长。这是因为非对称密钥算法的加密过程中涉及到公钥和私钥的运算,导致生成的密文长度较长。相比之下,对称密钥算法生成的密文长度通常较短。
这些缺点使得非对称密钥算法在某些应用场景下可能不太适合,特别是在需要高效加密和解密大量数据的情况下。因此,在选择加密算法时,需要根据具体的需求和应用场景综合考虑算法的优缺点,并选择合适的算法来确保通信的安全性和效率。
非对称密钥的的用途一: 一种简单而优雅的“混合加密”解决方案
用 对称密钥算法加密大块数据 (因为速度快) , 用 非对称密钥算法加密密钥 (因为安全)。
该方案是一种常见的组合使用对称密钥和非对称密钥算法的方式,被称为“混合加密”。
具体操作步骤如下:
-
对称密钥加密大块数据 :
- 首先,使用对称密钥算法(如AES/DES/DES3)生成一个随机的对称密钥。
- 然后,使用这个随机生成的对称密钥来加密要传输的大块数据。对称密钥算法由于速度快,适合加密大块数据。
-
非对称密钥加密对称密钥 :
- 接下来,选择接收方的公钥进行加密。这个公钥是公开的,任何人都可以获得。
- 将随机生成的对称密钥使用接收方的公钥加密,得到密文。
- 将密文发送给接收方。
-
接收方解密 :
- 接收方收到密文后,使用自己的私钥解密得到对称密钥。
- 然后,使用解密得到的对称密钥对加密的大块数据进行解密,得到原始数据。
这种混合加密方案兼顾了对称密钥算法的速度和非对称密钥算法的安全性。对称密钥算法用于加密大块数据,因为其速度快;而非对称密钥算法用于加密对称密钥,以确保密钥的安全传输。这样既能保证数据的安全传输,又能提高效率。
加密
对称密钥加密大块数据 :
- 首先,使用DES对称密钥算法生成一个随机的对称密钥。
- 然后,使用这个随机生成的对称密钥来加密要传输的大块数据。
非对称密钥加密对称密钥 :
- 接下来,选择接收方的公钥进行加密。这个公钥是公开的,任何人都可以获得。
- 将随机生成的对称密钥使用接收方的公钥加密,得到密文。
- 将密文和数据一起打包发送给接收方。
解密
接收方解密 :
- 接收方收到密文后,使用自己的私钥解密得到对称密钥。
- 然后,使用解密得到的对称密钥对加密的大块数据进行解密,得到原始数据。
非对称密钥的的用途二: 数字签名
非对称密钥的另一个重要用途是数字签名。 ( 私钥签名, 公钥确认 )
数字签名就像是一个人在文件上盖上他的个人印章一样,但是更加安全和可靠。它使用了一对非常特殊的钥匙,一个是公开的(公钥),一个是私密的(私钥)。
想象一下,你有一个神奇的钥匙,这个钥匙可以把你的名字(数字签名)刻在文件上。但是这个钥匙有两个部分,一个是公开的,所有人都能看到(公钥),另一个是只有你自己知道的(私钥)。
当你想给某个文件签名时,你使用你的私钥对文件进行加密,这样就生成了你的数字签名。只有拥有你的公钥的人才能解密你的数字签名,从而确认这个签名是你所创建的,没有被伪造或篡改。
工作原理
数字签名是一种用于验证数据来源和完整性的技术。它类似于手写签名,但使用了密码学的技术,可以提供更高的安全性和可靠性。
下面是数字签名的基本原理:
-
签名过程 :
- 发送方使用自己的私钥对数据进行加密(签名)。这个过程类似于使用私章在文件上盖章,表明文件的真实性和所有权。
- 然后,发送方将加密后的数据(签名)和原始数据一起发送给接收方。
-
验证过程 :
- 接收方收到数据后,会使用发送方的公钥对签名进行解密。如果成功解密,说明这个签名是由发送方的私钥加密的,即确实是发送方签署的。
- 接收方再对原始数据进行一些计算,以确保数据的完整性和真实性。如果计算得到的结果与签名匹配,那么数据就可以被验证为是由发送方签署的,且在传输过程中未被篡改。
通过数字签名,接收方可以验证数据的来源和完整性,确保数据的安全性和可靠性。这种技术在数字证书、电子合同、电子商务等领域广泛应用,是保障网络通信安全的重要手段之一。
工作示意图
用通俗易懂的语言解释数字签名的工作示意图:
-
用户一发送重要信息给用户二 :
- 用户一想要发送一条重要信息给用户二,但他们希望确保这个信息在传输过程中不会被篡改或伪造。
-
计算信息的散列值 :
- 首先,用户一使用散列算法对这条信息进行处理,得到一个唯一的散列值。这个散列值就像是这条信息的指纹一样,可以唯一识别这个信息。
-
用私钥进行加密 :
- 接下来,用户一使用自己的私钥对这个散列值进行加密。这个加密过程是使用非对称密钥算法完成的,确保只有用户一的公钥能够解密。
-
生成数字签名 :
- 加密后的散列值就是数字签名 。这个数字签名相当于用户一对这条信息的签名,确保了这个信息的真实性和完整性。
-
发送信息和数字签名给用户二 :
- 用户一将原始信息和数字签名一起发送给用户二。用户二收到后,就可以通过验证数字签名来确认这条信息的真实性。
-
验证数字签名 :
- 用户二首先使用相同的散列算法对接收到的原始信息进行处理,得到一个散列值。
- 然后,用户二使用用户一的公钥对数字签名进行解密,得到加密后的散列值。
- 最后,用户二比较两个散列值是否相等。如果相等,就说明这个数字签名是由用户一私钥加密的,这条信息是真实的;如果不相等,就说明这个数字签名可能被伪造或篡改。
这样,通过数字签名,用户一可以确保发送的信息在传输过程中不会被篡改或伪造,同时用户二也可以确认接收到的信息的真实性和完整性。
类比一下:
想象一下,你要给朋友寄一个包裹,但是你希望在包裹到达朋友手中之前,包裹不被别人偷开或者替换掉里面的东西。为了实现这个目标,你做了以下几个步骤:
-
你的“印章” :首先,你有一个特殊的印章,只有你自己有这个印章。这个印章就是你的私密钥。
-
包裹封口 :你把包裹封好,然后用你的印章盖上一个印章。这个印章就相当于数字签名。
-
发送包裹 :你把包裹寄给你的朋友,让他收到。
-
朋友验证 :你的朋友收到包裹后,他想确认这个包裹确实是你寄给他的,并且没有被别人篡改过。他会做以下几个步骤:
- 用一个特殊的方式打开包裹,这个方式只有他知道。这就相当于用你的公钥解密数字签名。
- 然后,他检查包裹上的印章是否和他预期的一样。如果印章和他预期的一样,就表示这个包裹确实是你寄给他的,并且没有被篡改过。
这就是数字签名的工作原理: 发送者使用自己的私密钥对信息进行加密生成数字签名,接收者使用发送者的公钥解密数字签名来验证信息的真实性和完整性。这种方式确保了信息的安全传输,同时也证明了信息的来源和完整性 。
数字签名的应用
扩展 DSA vs RSA
DSA(Digital Signature Algorithm,数字签名算法)和RSA(Rivest-Shamir-Adleman)都是常见的非对称加密算法,用于数字签名和加密通信。
-
RSA :
- RSA是由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出的,是目前最常用的非对称加密算法之一。
- RSA算法基于大整数的因子分解问题,其安全性基于两个大质数相乘产生的数难以分解为质数的乘积。
- RSA算法可以用于加密、解密、数字签名和密钥交换等方面。在数字签名中,发送者使用私钥对消息进行签名,接收者使用发送者的公钥验证签名的有效性。
- RSA算法的主要缺点是其计算复杂度较高,尤其是在加密和解密大量数据时。
-
DSA :
- DSA是一种数字签名算法,由美国国家安全局(NSA)于1991年提出。
- DSA算法基于离散对数问题,其安全性基于计算离散对数的困难性。
- DSA算法专门设计用于数字签名,不能用于加密和解密数据。发送者使用私钥对消息进行签名,接收者使用发送者的公钥验证签名的有效性。
- 与RSA相比,DSA算法在数字签名方面效率更高,但只能用于数字签名,不能用于加密通信。
总的来说,RSA和DSA都是非对称加密算法,用于数字签名和加密通信。RSA适用于加密、解密、数字签名和密钥交换等多种应用场景,而DSA专门设计用于数字签名。选择适合的算法取决于具体的安全需求和应用场景。
RSA 收取专利费,美国因此搞了个DSA。 RSA专利过期以后,美国也改为使用RSA。