仅供自己学习使用,原文链接

Java  加密解密基础

密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。

密码学常用术语

明文: 待加密数据。

密文: 明文经过加密后数据。

加密: 将明文转换为密文的过程。

加密算法: 将明文转换为密文的转换算法。

加密密钥: 通过加密算法进行加密操作的密钥。

解密: 将密文转换为铭文的过程。

解密算法: 将密文转换为明文的转换算法。

解密密钥: 通过解密短发进行解密操作的密钥。

密码学分类

1. 按时间分

a.古典密码:以字符为基本加密单元。

b.现代密码:以信息块为基本加密单元。

2按保密内容的算法划分

a.受限制算法:算法的保密性基于保持算法的秘密。

b.基于密钥算法:算法的保密性基于对密钥的保密。

3.按密钥体制划分

a.对称密码体制:也叫单钥或私钥密码体制,加密过程与解密过程使用同一套密钥。对应的算法就是对称加密算法,例如 DESAES

b.非对称密码体制:也叫双钥或公钥密码体制,加密过程与解密过程使用不同的密钥。对应的算法就是非对称加密算法,例如 RSA

4.按明文处理方式划分

a.流密码:也称为序列密码,加密时每次加密一位或者一个字节的明文。例如 RC4算法。

b. 分组密码:加密时将明文分成固定长度的组,用同一个密钥和算法对每一组进行加密输出也是固定长度的明文。当最后一组大小不满足指定的分组大小时,

有两种处理模式:

无填充模式,直接对剩余数据进行加密,此组加密后大小与剩余数据有关;

有填充模式,对于不满足指定长度分组的进行数据填充;如果恰巧最后一组数据与指定分组大小相同,那么直接添加一个指定大小的分组;填充的最后一个字节记录了填充的字节数。

分组密码工作模式简介

1 .电子密码本模--ECB

将明文的各个分组独立的使用相同的密钥进行加密,这种方式加密时各分组的加密独立进行互不干涉,因而可并行进行。同样因为各分组独立加密的缘故,相同的明文分组加密之后具有相同的密文。该模式容易暴露明文分组的统计规律和结构特征。不能防范替换***。

其实照实现来看, ECB的过程只是把明文进行分组,然后分别加密,最后串在一起的过程。当消息长度超过一个分组时,不建议使用该模式。在每个分组中增加随机位 (128位分组中 96位为有效明文, 32位的随机数 )则可稍微提高其安全性 ,但这样无疑造成了加密过程中数据的扩张。

优点 :

1.简单;

2.有利于并行计算;

3.误差不会被传送;

缺点 :

1.不能隐藏明文的模式;

2.可能对明文进行主动***;

2.密码分组链接模 -- CBC

需要一个初始化向量 IV,第一组明文与初始化向量进行异或运算后再加密,以后的每组明文都与前一组的密文进行异或运算后再加密。 IV 不需要保密,它可以明文形式与密文一起传送。

优点:

1.不容易主动***,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。

缺点:

1.不利于并行计算;

2.误差传递;

3.需要初始化向量IV

3. 密文反馈模式--CFB

需要一个初始化向量IV ,加密后与第一个分组明文进行异或运算产生第一组密文,然后对第一组密文加密后再与第二组明文进行异或运算缠身第二组密文,一次类推,直到加密完毕。

优点:

1.隐藏了明文模式;

2.分组密码转化为流模式;

3.可以及时加密传送小于分组的数据;

缺点 :

1.不利于并行计算;

2.误差传送:一个明文单元损坏影响多个单元;

3.唯一的IV;

4. 输出反馈模式--OFB

需要一个初始化向量IV ,加密后得到第一次加密数据,此加密数据与第一个分组明文进行异或运算产生第一组密文,然后对第一次加密数据进行第二次加密,得到第二次加密数据,第二次加密数据再与第二组明文进行异或运算产生第二组密文,一次类推,直到加密完毕。

优点 :

1.隐藏了明文模式;

2.分组密码转化为流模式;

3.可以及时加密传送小于分组的数据;

缺点 :

1.不利于并行计算;

2. 对明文的主动***是可能的 ;

3. 误差传送:一个明文单元损坏影响多个单元 ;

5. 计数器模式--CTR

使用计数器,计数器初始值加密后与第一组明文进行异或运算产生第一组密文,

计数器增加,然后,加密后与下一组明文进行异或运算产生下一组密文,以此类推,直到加密完毕

优点 :

1. 可并行计算 ;

2. 安全性至少与CBC 模式一样好 ;

3. 加密与解仅涉及密码算法的加密 ;

缺点 :

1. 没有错误传播,不易确保数据完整性 ;

分组密码填充方式简介

PKCS5 : 填充字符串由一个值为 5 的字节序列组成,每个字节填充该字节序列的长度。 明确定义 Block 的大小是 8 位

PKCS7 : 填充字符串由一个值为 7 的字节序列组成,每个字节填充该字节序列的长度。 对于块的大小是不确定的,可以在 1-255 之间

ISO10126: 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据。