Bootstrap

几种加密算法

背景:

一、概述

在安全领域,利用密钥加密算法来对通信的过程进行加密是一种常见的安全手段。利用该手段能够保障数据安全通信的三个目标:

1、数据的保密性,防止用户的数据被窃取或泄露
2、保证数据的完整性,防止用户传输的数据被篡改
3、通信双方的身份确认,确保数据来源与合法的用户
而常见的密钥加密算法类型大体可以分为三类:对称加密、非对称加密、单向加密。下面我们来了解下相关的算法原理及其常见的算法。

加密方式:

二、对称加密

在加密传输中最初是采用对称密钥方式,也就是加密和解密都用相同的密钥。

对称加密过程如下:
1.对称加密算法采用单密钥加密,在通信过程中,数据发送方将原始数据分割成固定大小的块,经过密钥和加密算法逐个加密后,发送给接收方

2.接收方收到加密后的报文后,结合解密算法使用相同密钥解密组合后得出原始数据。

图示:

优点
是效率高,算法简单,系统开销小,适合加密大量数据。
缺点
安全性差
加解密算法是公开的,因此在这过程中,密钥的安全传递就成为了至关重要的事了。而密钥通常来说是通过双方协商,以物理的方式传递给对方,或者利用第三方平台传递给对方,一旦这过程出现了密钥泄露,不怀好意的人就能结合相应的算法拦截解密出其加密传输的内容。
扩展性差
每对通信用户之间都需要协商密钥,n个用户的团体就需要协商n*(n-1)/2个不同的密钥,不便于管理;而如果都使用相同密钥的话,密钥被泄漏的机率大大增加,加密也就失去了意义。
常见的对称加密算法
DES:分组式加密算法,以64位为分组对数据加密,加解密使用同一个算法。
3DES:三重数据加密算法,对每个数据块应用三次DES加密算法。
AES:高级加密标准算法,是美国联邦政府采用的一种区块加密标准,用于替代原先的DES,目前已被广泛应用。
Blowfish:Blowfish算法是一个64位分组及可变密钥长度的对称密钥分组密码算法,可用来加密64比特长度的字符串。

三、非对称加密

非对称加密算法采用公钥和私钥两种不同的密码来进行加解密。公钥和私钥是成对存在,公钥是从私钥中提取产生公开给所有人的,如果使用公钥对数据进行加密,那么只有对应的私钥(不能公开)才能解密,反之亦然。N 个用户通信,需要2N个密钥。

用途
非对称密钥加密适合对密钥或身份信息等敏感信息加密,从而在安全性上满足用户的需求。

非对称加密过程
1.甲使用乙的公钥并结合相应的非对称算法将明文加密后发送给乙,并将密文发送给乙。
2.乙收到密文后,结合自己的私钥和非对称算法解密得到明文,得到最初的明文。

图示:

优点
具有比对称密钥加/解密方式更高的安全性,因为加密和解密用的是不同密钥,而且无法从一个密钥推导出另一个密钥,且公钥加密的信息只能用同一方的私钥进行解密。
缺点
1.非对称密钥加密的缺点是算法非常复杂,导致加密大量数据所用的时间较长,只适合对少量数据进行加密。而且由于在加密过程中会添加较多附加信息,使得加密后的报文比较长,容易造成数据分片,不利于网络传输。
2.无法确认公钥的来源合法性以及数据的完整性。如何确认我们接下来会说
常见算法包括:
RSA:RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,可用于加密,也能用于签名。
DSA:数字签名算法,仅能用于签名,不能用于加解密。
DSS:数字签名标准,技能用于签名,也可以用于加解密。
ELGamal:利用离散对数的原理对数据进行加解密或数据签名,其速度是最慢的。

四、单向加密

单向加密算法只能用于对数据的加密,无法被解密,其特点为定长输出、雪崩效应(少量消息位的变化会引起信息摘要的许多位变化)。

用途
单向加密算法常用于提取数据指纹,验证数据的完整性、数字摘要、数字签名等等。

单向加密过程
1.发送者将明文通过单向加密算法加密生成定长的密文串,然后传递给接收方。

2.接收方将用于比对验证的明文使用相同的单向加密算法进行加密,得出加密后的密文串。

3.将之与发送者发送过来的密文串进行对比,若发送前和发送后的密文串相一致,则说明传输过程中数据没有损坏;若不一致,说明传输过程中数据丢失了。

图示:

常见算法

MD5、sha1、sha224等等

五、密钥交换

密钥交换IKE(Internet Key Exchange)通常是指双方通过交换密钥来实现数据加密和解密

常见的密钥交换方式有下面两种:

1、公钥加密
将公钥加密后通过网络传输到对方进行解密,这种方式缺点在于具有很大的可能性被拦截破解,因此不常用

2、Diffie-Hellman
DH算法是一种密钥交换算法,其既不用于加密,也不产生数字签名。

DH算法通过双方共有的参数、私有参数和算法信息来进行加密,然后双方将计算后的结果进行交换,交换完成后再和属于自己私有的参数进行特殊算法,经过双方计算后的结果是相同的,此结果即为密钥。

如:

A 有p和g两个参数,A还有一个属于自己的私有参数x;
B 有p和g两个参数,A还有一个属于自己的私有参数y;
A和B均使用相同的加密算法计算其对应的值:value_A=p(x%g),value_B=p(y%g)
随后双方交换计算后的值,然后再分别使用自己的私有参数对去求次方,如:
A拿到value_B值后,对其求x平方得value_Bx=p(xy%g);
B拿到value_A值后,对其求y平方得value_Ay=p(xy%g);
最终得到的结果是一致的。
安全性

在整个过程中,第三方人员只能获取p、g两个值,AB双方交换的是计算后的结果,因此这种方式是很安全的。

如何确认公钥的来源合法性?
答案:使用公钥证书

公钥基础设施(PKI)
公钥基础设施是一个包括硬件、软件、人员、策略和规程的集合

用途
用于实现基于公钥密码机制的密钥和证书的生成、管理、存储、分发和撤销的功能

组成
签证机构CA、注册机构RA、证书吊销列表CRL和证书存取库CB。

公钥证书
公钥证书是以数字签名的方式声明,它将公钥的值绑定到持有对应私钥的个人、设备或服务身份。公钥证书的生成遵循X.509协议的规定,其内容包括:证书名称、证书版本、序列号、算法标识、颁发者、有效期、有效起始日期、有效终止日期、公钥 、证书签名等等的内容。

CA(Certificate Authority)证书认证的流程
1.客户A准备好要传送的数字信息(明文)。**(准备明文) **

2.客户A对数字信息进行哈希(hash)运算,得到一个信息摘要。**(准备摘要) **

3.客户A用CA的私钥(SK)对信息摘要进行加密得到客户A的数字签名,并将其附在数字信息上。**(用私钥对数字信息进行数字签名)  **

4.客户A随机产生一个加密密钥(DES密钥),并用此密钥对要发送的信息进行加密,形成密文。**(生成密文) **

5.客户A用双方共有的公钥(PK)对刚才随机产生的加密密钥进行加密,将加密后的DES密钥连同密文一起传送给乙。**(非对称加密,用公钥对DES密钥进行加密)   **

6.银行B收到客户A传送过来的密文和加过密的DES密钥,先用自己的私钥(SK)对加密的DES密钥进行解密,得到DES密钥。(用私钥对DES密钥解密)

7.银行B然后用DES密钥对收到的密文进行解密,得到明文的数字信息,然后将DES密钥抛弃(即DES密钥作废)。**(解密文)   **

8.银行B用双方共有的公钥(PK)对客户A的数字签名进行解密,得到信息摘要。银行B用相同的hash算法对收到的明文再进行一次hash运算,得到一个新的信息摘要。**(用公钥解密数字签名) **

9.银行B将收到的信息摘要和新产生的信息摘要进行比较,如果一致,说明收到的信息没有被修改过。**(对比信息摘要和信息) **

如何保证CA的公钥没有被篡改呢?
答案是没法保证CA的公钥没有被篡改。通常操作系统和浏览器会预制一些CA证书在本地。所以发送方应该去那些通过认证的CA处申请数字证书。这样是有保障的。

但是如果系统中被插入了恶意的CA证书,依然可以通过假冒的数字证书发送假冒的发送方公钥来验证假冒的正文信息。所以安全的前提是系统中不能被人插入非法的CA证书。

总结:

对称加密算法:使用相同的密钥进行加密和解密的算法,如DES、AES等。对称加密算法速度较快,但密钥的分发和管理比较困难。

非对称加密算法:使用不同的密钥进行加密和解密的算法,如RSA、ECC等。非对称加密算法安全性较高,但速度较慢。

散列函数:将任意长度的输入数据映射为固定长度的输出,常用于数据完整性校验和密码存储。常见的散列函数有MD5、SHA-1、SHA-256等。

数字签名算法:用于验证数据的真实性和完整性,常用于身份认证和数据防篡改。常见的数字签名算法有RSA、DSA等。

公钥加密算法:结合了非对称加密和数字签名的特点,既可以用公钥加密数据,也可以用私钥解密数据或生成数字签名。常见的公钥加密算法有RSA、ElGamal等。

哈希函数:将任意长度的输入数据映射为固定长度的输出,常用于数据的唯一标识和查找。常见的哈希函数有MD5、SHA-1、SHA-256等。
数据结构算法和加密算法是计算机科学中重要的概念和技术。数据结构算法用于组织和处理数据,提供了高效的数据操作和存储方式。而加密算法则用于保护数据的安全性和隐私性,确保数据在传输和存储过程中不被非法获取和篡改。掌握和应用这些算法可以提高程序的性能和安全性,对于计算机科学和信息安全领域的学习和实践都具有重要意义。

当涉及到加密算法时,还有一些重要的概念和注意事项可以补充:

密钥长度:密钥长度是衡量加密算法强度的一个重要指标。通常来说,密钥越长,破解难度越大。在选择加密算法时,应该考虑使用足够长的密钥长度来提高安全性。

安全性评估:加密算法的安全性需要经过严格的评估和测试。一些加密算法可能存在漏洞或被攻击者破解的可能性。因此,选择被广泛接受并经过专业评估的加密算法是很重要的。

密钥管理:密钥的安全管理对于加密算法的有效性至关重要。密钥应该被妥善保管,避免被未授权的人获取。此外,定期更换密钥也是一种提高安全性的措施。

加密运算的性能:不同的加密算法在性能方面可能存在差异。一些算法可能会占用更多的计算资源或时间。因此,在选择加密算法时,需要综合考虑安全性和性能之间的平衡。

总而言之,加密算法是保护数据安全的重要工具,但在使用时需要综合考虑安全性、性能和实际需求。

现在流行的加密算法包括以下几种:

AES(Advanced Encryption Standard):对称加密算法,用于保护敏感数据的机密性。它是目前广泛使用的加密算法之一,具有高度的安全性和效率。

RSA(Rivest-Shamir-Adleman):非对称加密算法,用于加密和解密数据以及数字签名。RSA算法基于大素数的因子分解难题,被广泛应用于数据传输和数字证书领域。

ECC(Elliptic Curve Cryptography):非对称加密算法,使用椭圆曲线上的点运算来实现加密和解密。ECC算法具有相同安全级别下更短的密钥长度和更高的计算效率,因此在资源受限的环境中被广泛采用。

SHA(Secure Hash Algorithm):哈希算法,用于生成数据的唯一摘要值。SHA算法有多个版本,如SHA-1、SHA-256等,用于验证数据的完整性和一致性。

HMAC(Hash-based Message Authentication Code):基于哈希的消息认证码,结合哈希算法和密钥来生成消息的认证码,用于验证消息的完整性和真实性。

Diffie-Hellman密钥交换协议:用于在两个通信方之间安全地交换密钥的协议。该协议基于离散对数难题,实现了安全的密钥交换。

这些加密算法在各种应用中被广泛使用,以确保数据的保密性、完整性和可靠性。

从应用层面来看,加密算法广泛应用于各种数据通信和存储场景,以保护数据的机密性、完整性和可信度。以下是一些常见的应用场景:

网络通信:加密算法被用于保护网络通信中的数据传输,例如使用SSL/TLS协议对HTTP通信进行加密,保护用户的敏感信息。

数据存储:加密算法可用于保护存储在本地设备或云端的数据,以防止未经授权的访问。例如,对于移动设备上的敏感数据,如个人信息、银行账号等,可以使用加密算法进行存储加密。

身份验证:加密算法可以用于用户身份验证和授权过程中。例如,使用非对称加密算法来生成数字证书,确保通信双方的身份以及数据的完整性。

文件传输:加密算法可用于安全地传输文件,以防止文件在传输过程中被篡改或窃取。例如,通过加密算法对电子邮件附件进行加密,确保只有授权的接收方可以解密和访问。

数据库加密:对于敏感的数据库中的数据,可以使用加密算法进行字段级或整个数据库的加密,以保护数据的隐私。

数字版权保护:加密算法可以用于保护数字内容的版权,防止盗版和非法复制。例如,通过数字水印技术对音频、视频等媒体进行加密和认证。

总而言之,加密算法在应用层面的应用非常广泛,涵盖了数据通信、存储、身份验证等多个领域,为数据安全提供了重要的保障。

public class EncryptionAlgorithm {

    public static String encrypt(String text) {
        StringBuilder encryptedText = new StringBuilder();
        for (char c : text.toCharArray()) {
            if (Character.isLetter(c)) {
                if (Character.isUpperCase(c)) {
                    encryptedText.append((char) ((c - 'A' + 3) % 26 + 'A')); // 大写字母替换
                } else {
                    encryptedText.append((char) ((c - 'a' + 3) % 26 + 'a')); // 小写字母替换
                }
            } else {
                encryptedText.append(c); // 非字母字符保持不变
            }
        }
        return encryptedText.toString();
    }

    public static String decrypt(String encryptedText) {
        StringBuilder decryptedText = new StringBuilder();
        for (char c : encryptedText.toCharArray()) {
            if (Character.isLetter(c)) {
                if (Character.isUpperCase(c)) {
                    decryptedText.append((char) ((c - 'A' - 3 + 26) % 26 + 'A')); // 大写字母替换
                } else {
                    decryptedText.append((char) ((c - 'a' - 3 + 26) % 26 + 'a')); // 小写字母替换
                }
            } else {
                decryptedText.append(c); // 非字母字符保持不变
            }
        }
        return decryptedText.toString();
    }

    public static void main(String[] args) {
        String plaintext = "Hello, World!";
        String encryptedText = encrypt(plaintext);
        System.out.println("加密后的文本:" + encryptedText);
        String decryptedText = decrypt(encryptedText);
        System.out.println("解密后的文本:" + decryptedText);
    }
}

该加密算法与之前的Python示例相同,将输入的文本中的字母进行替换,大写字母替换为字母表中向后移动3个位置的字母,小写字母替换为字母表中向后移动3个位置的字母。非字母字符保持不变。解密过程与加密过程相反。

;