明文(Plaintext):指待加密信息。明文可以是文本文件、图片文件、二进制数据等。
密文(Ciphertext):指经过加密后的明文。密文通常以文本、二进制数据等形式存在。
发送者(Sender):指发送消息的人。
接收者(Receiver):指接收消息的人。
加密(Encryption):指将明文转换为密文的过程。
加密算法(Encryption Algorithm):指将明文变化为密文的转换算法。
加密密钥(Encryption Key):指通过加密算法进行加密操作用的密钥。
解密(Decryption):指将密文转换成明文的过程。
解密算法(Decryption Algorithm):指将密文转换为明文的转换算法。
解密密钥(Decryption Key):指通过解密算法进行解密操作用的密钥。
密码分析(Cryptanalysis):指截获密文者试图通过分析截获的密文从而推断出原来的明文或密钥的过程。
密码分析者(Cryptanalyst):等同于密码破译者,指从事密码分析的人。
被动攻击(Passive Attack):指对一个保密系统采取截获密文并对其进行分析和攻击。这种攻击对密文没有破坏作用。
主动攻击(Active Attack):指攻击者非法入侵密码系统,采用伪造、修改、删除等手段向系统注入假消息进行欺骗。这种攻击对密文具有破坏作用。
密码体制(Cipher System):由明文空间、密文空间、密钥空间、加密算法和解密算法五部分构成。
密码协议(Cryptographic Protocol):有时也称为安全协议,是指以密码学为基础的消息交换的通信协议,其目的是在网络环境中提供各种安全服务。密码协议与密码算法同等重要,堪称当今密码学研究的两大课题。密码学是网络安全的基础,但网络安全不能单纯依靠安全的密码算法。密码协议是网络安全的一个重要组成部分,通过密码协议进行实体之间的认证、在实体之间安全地分配密钥或其他各种秘密、确认发送和接收的消息的不可否认性等。
密码系统(Cryptography):指用于加密和解密的系统。加密时,系统输入明文和加密密钥,加密变化后,输出密文;解密时,系统输入密文和解密密钥,解密变换后,输入明文。一个密码系统由信源、加密变换、解密变化、信宿和攻击者组成。密码系统强调密码方案的实际应用,通常应当是一个包含软、硬件的系统。
柯克霍夫原则(Kerckhoffs’Principle):数据的安全基于密钥而不是算法的保密。换句话说,系统的安全性取决于密钥,对密钥保密,对算法公开。信息论始祖克劳德·艾尔伍德·香农(Claude Elwood Shannon)将其改为“敌人了解系统”,这样的说法称为香农箴言。柯克霍夫原则是现代密码学设计的基本原则。
按密码体制划分
对称密码体制(Symmetric Cryptosystem):也称为单钥密码体制或私钥密码体制指该密码体制中的加密密钥与解密密钥相同,即加密过程与解密过程使用同一套密钥。
非对称密码体制(Asymmetric Cryptosystem):也称为双钥密码体制或公钥密码体制。指该密码体制中的加密密钥与解密密钥不同,密钥分为公钥与私钥。公钥对外公开,私钥对外保密。
对称密码算法(Symmetric Cipher):也称为单钥密码算法或私钥密码算法。指对应于对称密码体制的加密、解密算法。常见的DES、AES算法都是对称密码算法的典范。
非对称密码算法(Asymmetric Cipher):也称为双钥密码算法或公钥密码算法。指对应于非对称密码体制的加密、解密算法。大名鼎鼎的RSA算法就是非对称密码算法,多应用于数字签名、身份认证等。当然,非对称密码算法的相对于对称密码算法有着更高的安全性,却有着不可回避的加密解密的耗时长的问题。
对称密码体制分为两种:
一种是对明文的单个位(或字节)进行运算,称为流密码,也称为序列密码
另一种是把明文信息划分成不同的组(或块)结构,分别对每个组(或块)进行加密和解密,称为分组密码。
2.6 非对称密码体制
非对称密码体制的加密密钥和解密密钥不相同,分为两个密钥,一个公开,一个保密。
对称密码体制使得发送者和接收者无密钥传输的保密通信成为可能,弥补了对称密码体制的缺陷。
公钥与私钥分属通信双方,一份消息的加密与解密需要公钥与私钥共同参与。公钥加密则需要私钥解密,反之,私钥加密则需要公钥解密。
2.7 散列函数
对于信息完整性验证需要其他技术来支持,这种技术就是由散列函数提供的消息认证技术。
2.8 数字签名
通过散列函数可以确保数据内容的完整性,但这还远远不够。
还需要确保数据来源的可认证(鉴别)性和数据发送行为的不可否认性。
在java.security.interfaces包和javax.crypto.interfaces包中包含了密钥相关的接口
在java.security.spec包和javax.crypto.spec包中包含了密钥规范和算法参数规范的类和接口
于编码格式的转换
如Base64、二进制、十六进制、字符集和Url编码的转换。甚至,Commons Codec还提供了语音编码的转换。除此之外,Commons Codec还对Java原生的消息摘要算法做了良好的封装,提高了方法的易用性。
Commons Codec的API主要包含了以下几个方面:
❑org.apache.commons.codec:该包内主要定义了一些编码转换的接口。
❑org.apache.commons.codec.binary:该包内主要完成了编码转换实现,如Base64、二进制、十六进制和字符集编码。
❑org.apache.commons.codec.digest:该包内仅有一个实现类DigestUtils,它是对Java原生消息摘要实现的改进。
❑org.apache.commons.codec.language:该包内主要完成了语言和语音编码器实现。
❑org.apache.commons.codec.net:该包内主要完成了网络相关的编码和解码,如Url编码/解码。
Base64算法并不是加密算法,仅仅是加密算法的近亲。
Base64算法的转换方式很像古典加密算法中的单表置换算法.
Base64算法最早应用于解决电子邮件传输的问题
电子邮件只允许ASCII码字符。如果要传输一封带有非ASCII码字符的电子邮件,会乱码,于是产生了Base64算法。
base64是一种基于64个字符的编码算法
Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别
经过Base64编码后的数据会比原始数据略长,为原来的4/3倍。经Base64编码后的字符串的字符数是以4为单位的整数倍。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HVvEBUXP-1601826667504)(assets/2020-09-13-15-15-14.png)]
这张字符映射表中,Value指的是十进制编码,Encoding指的是字符,共映射了64个字符,这也是Base64算法命名的由来。映射表的最后一个字符是等号,它是用来补位的。
Base64算法与加密算法的关系
Base64算法有编码和解码操作可充当加密和解密操作,还有一张字符映射表充当了密钥。
Base64算法仍不能叫做加密算法。Base64算法公开,这一点与柯克霍夫原则并无违背,但充当密钥的字符映射表公开,直接违反了柯克霍夫原则,而且Base64算法的加密强度并不够高。因此,不能将Base64算法看做我们所认可的现代加密算法。
5.4 实现原理
Base64算法主要是将给定的字符以与字符编码(如ASCII码,UTF-8码)对应的十进制数为基准,做编码操作:
1)将给定的字符串以字符为单位,转换为对应的字符编码(如ASCII码)。
2)将获得的字符编码转换为二进制码。
3)对获得的二进制码做分组转换操作,每3个8位二进制码为一组,转换为每4个6位二进制码为一组(不足6位时低位补0)。这是一个分组变化的过程,3个8位二进制码和4个6位二进制码的长度都是24位(3×8=4×6=24)。
4)对获得的4-6二进制码补位,向6位二进制码添加2位高位0,组成4个8位二进制码。
5)将获得的4-8二进制码转换为十进制码。
6)将获得的十进制码转换为Base64字符表中对应的字符。
消息摘要算法—MD5
消息摘要算法包含MD、SHA和MAC共3大系列,常用于验证数据的完整性,是数字签名算法的核心算法。
如何来验证下载到的文件和官方提供的文件是否一致?这就引入了数据完整性验证的问题。
消息摘要算法又称为散列算法,其核心在于散列函数的单向性。即通过散列函数可获得对应的散列值,但不可通过该散列值反推其原始信息。这是消息摘要算法的安全性的根本所在。
消息摘要算法主要分为三大类:MD(Message Digest,消息摘要算法)、SHA(Secure Hash Algorithm,安全散列算法)和MAC(Message Authentication Code,消息认证码算法)。
MD系列算法包括MD2、MD4和MD5共3种算法;SHA算法主要包括其代表算法SHA-1和SHA-1算法的变种SHA-2系列算法(包含SHA-224、SHA-256、SHA-384和SHA-512);MAC算法综合了上述两种算法,主要包括HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384和HmacSHA512算法。
不论是哪一种MD算法,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要。如果将这个128位的二进制摘要信息换算成十六进制,可以得到一个32位(每4位二进制数转换为1位十六进制数)的字符串,故我们见到的大部分MD5算法的数字指纹都是3 2位十六进制的字符串
MD5:5a077abefee447cbb271e2aa7f6d5a47)就是32位的十六进制串
虽然,MD5算法漏洞越来越多,已不再安全,但至今我们仍没有看到它的下一版本—MD6算法的出现。或许,同样基于MD4算法改进而来的SHA算法将会是MD系列算法的主要替代者。
MD系列算法的实现是通过MessageDigest类来完成的,如果需要以流的处理方式完成消息摘要,则需要使用DigestInputStream和DigestOutputStream
SHA算法基于MD4算法基础之上,作为MD算法的继任者,成为了新一代的消息摘要算法的代表。SHA与MD算法不同之处主要在于摘要长度,SHA算法的摘要长度更长,安全性更高。
SHA(Secure Hash Algorithm,安全散列算法)是消息摘要算法的一种,被广泛认可为MD5算法的继任者。
SHA算法是在MD4算法的基础上演进而来的,通过SHA算法同样能够获得一个固定长度的摘要信息。与MD系列算法不同的是:若输入的消息不同,则与其相对应的摘要信息的差异概率很高。
随着时间的推移,安全算法已不再安全。继山东大学王小云教授顺利破解MD5算法后,SHA-1算法也难逃此劫,终被王小云教授破解。
两大著名消息摘要算法被破解,预示着数字签名在理论上可被伪造,B2B和B2C系统将存在安全隐患。
6.4 MAC算法家族
MAC算法结合了MD5和SHA算法的优势,并加入密钥的支持,是一种更为安全的消息摘要算法。
MAC(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加入了密钥。因此,我们也常把MAC称为HMAC(keyed-Hash Message Authentication Code)。
MAC算法主要集合了MD和SHA两大系列消息摘要算法。MD系列算法有HmacMD2、HmacMD4和HmacMD5三种算法;SHA系列算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384和HmacSHA512五种算法。
经MAC算法得到的摘要值也可以使用十六进制编码表示,其摘要值长度与参与实现的算法摘要值长度相同。
6.6 循环冗余校验算法—CRC算法
“奇偶校验码”、“循环冗余校验码”和“CRC32”都是同一套东西,它们和CRC有着紧密的联系。
CRC算法并不属于加密算法范畴
CRC(Cyclic Redundancy Check,循环冗余校验)是可以根据数据产生简短固定位数的一种散列函数,主要用来检测或校验数据传输/保存后出现的错误。
生成的散列值在传输或储存之前计算出来并且附加到数据后面。在使用数据之前,对数据的完整性做校验。
一般来说,循环冗余校验的值都是32位的二进制数,以8位十六进制字符串形式表示。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。
由上述内容分析,消息摘要算法与CRC算法同属散列函数,并且CRC算法很可能就是消息摘要算法的前身。
消息摘要算法就是这样一种专门用于验证数据完整性的算法。它源于CRC冗余校验算法,派生出MD和SHA两大系列消息算法,并在此基础上衍生出MAC算法。消息摘要算法是数字签名算法的基础。
虽然MD5算法的破解使其安全性大为降低,但在用户注册/登录模块中仍然是架构师首选的方案。各大软件厂商在其软件下载页面上仍然使用MD5算法作为数据完整性验证的首选方法。MD5算法常作为安全性要求不高的环境中的常用算法。
SHA算法较之MD算法更为安全,常常出现在一些安全系数要求较高的环境中。
MAC是一种基于密钥的散列函数算法,它吸收了MD算法和SHA算法的精髓,并将其发扬光大
加密和解密操作使用同一套密钥,这就是对称加密算法的核心。
可通过Java语言实现的对称加密算法大约有20多种
在Java实现层面上,DES、DESede、AES和IDEA这4种算法略有不同。
DES和DESede算法在使用密钥材料还原密钥时,建议使用各自相应的密钥材料实现类(DES算法对应DESKeySpec类,DESede算法对应DESedeKeySpec类)完成相应转换操作。
AES算法在使用密钥材料还原密钥时,则需要使用一般密钥材料实现类(SecretKeySpec类)完成相应转换操作。其他对称加密算法可参照该方式实现,如RC2、RC4、Blowfish以及IDEA等算法均可参照AES算法实现方式做相应实现。
DES算法和DESede算法统称DES系列算法。
DES算法是对称加密算法领域中的典型算法
DESede算法基于DES算法进行三重迭代,增加其算法安全性。
以当今计算机技术能力,经DES算法加密的数据在24小时内可能被破解。
由此,DES算法正式退出历史舞台,AES算法成为它的替代者。
密钥长度与安全性成正比,但Java 6仅支持56位密钥长度,作为补充,Bouncy Castle提供64位密钥长度支持。