加密与解密

来源:互联网 发布:java web视频教程 刘意 编辑:程序博客网 时间:2024/06/04 01:10
 

加解密是码侬们时而会遇到的一个问题。怎么加密呢?为方便解说,p(plain)代表原文, c(cipher)代表密文, k(key)代表密码。

 

1. c = f(p)

最初的C教程会告诉我们,对数据进行简单的移位变换得到一组新的数据,也可以称为加密。

 

例如, 要存储一串文字"shaofa"到文件里,假设这个字符串是敏感信息,我们要对其进行加密后再存储。这是一个把p加密为c的过程,记为c=f(p), f就是我们加密采用的算法function。

unsigned char p[] = { 0x73, 0x68, 0x61, 0x6f, 0x66, 0x61 }; // 即ascii码的'shaofa'

对每个字节的最高位置1,得到

unsigned char c[] = { 0xf3, 0xe8, 0xe1, 0xef, 0xe6, 0xe1 };

 

显然,这在一定程度上起到了加密的效果:一个人在不知道你使用的f()的情况下,是不会看懂你的这个字节是代表什么意义的。

然而,它的缺陷是,在别人猜到了你的算法之后,你必须另行设计一种算法。每次都要设计一种新的算法,会不会很累呢?

实际上,这种算法只能称为变换Transformation,不能称为加密Encryption。类似的标准算法有base64等。

 

2. c = f(p, k)

也许你听过DES, AES等加密算法,它们就是加密算法的典型代表。它们有一个共同的特点,“所有的秘密只存在密码上”。即,算法是公开的,使用者只需要设置一个密码,就可以得到一个密文。别人在不知道密码的情况下,很难算法其原文。

 

例如,对 p = "shaofa" 用DES进行加密,k = "12345678"

unsigned char p[8] = { 's', 'h', 'a', 'o', 'f', 'a', 0,  };  // 填0

unsigned char k[8] = {'1', '2', '3', '4', '5', '6', '7', '8'};

unsigned char c[8];

经过c = DES(p, k)后 c的值为 { 0xc8, 0xce, 0x7e, 0x49, 0x69, 0x76, 0x9f, 0x25}

别人在看到c的值之后,如果不知道你用的k值,那么即使知道你是用DES进行加密的也无法得到原文p。所以这段密文的秘密就是密码k的值。这就把密码和算法独立开来。双方约定好密码之后就可以进行加密传输。

 

3. 对称加密: DES, 3DES, AES

所谓对称加密就是,在加密和解密过程中使用的k值相同。解密是加密的完全逆过程。像DES, 3DES, AES都有这样的特点。

DES简介:

DES加密时,对每组8字节的数据p进行运算,密码k也是8字节,得到的结果c也是8个字节。如果原文不足8字节(对齐),应该填充为8字节。

 DES使用时有好几种模式。最基本也是最常用的是ECB模式,对原始数据每8字节一组进行分组,再分别加密得到密文。每组数据之间是独立的。

  Ci = DES (Pi, K) , i=0,1,2,3,...N

  其他的模式如FCB模式则不是每组独立的。例如在计算C1时,要把C0和P1运算之后,再进行加密。所以每组密文都依赖之前的密文。如果有一个字节传输错误,则会影响到该密文之后的组的解码。

  DES的密码有天生的缺陷,即每个字节的最低位bit0不参与运算,所以密码'11111111'和'22222222'得到的密文是一样的。所以DES密码的有效信息为56bit,称为56bit加密算法。

 

DES3简介:

 DES3采用的基本算法是和DES一样的。输入p为8个字节,输入k为24个字节, 输出c为8个节。实际上是把k分为3组,形成3个密码k1, k2, k3,采用了3次DES运算:

 (1) 用key1对p1进行加密, 得到c1

 (2) 用key2对c1进行解密,得到p2

 (3) 用key3对p2进行加密,得到c3

c3就是最终的输出。这个过程可以看百度的说明:C=Ek3(Dk2(Ek1(P))) 。注意c1, p2都是中间结果。DES密码的有效位共56 * 3 = 168位,称为168位加密算法。

 

AES简介:

 AES每组数据为16字节,密码也是16字节,输出也是16字节。密码的有效位是16 * 8 = 128位,称为128位加密算法。据说AES相对DES要难以破解。

 

4. 非对称加密算法: RSA

加密过程用的密码public key和解密过程用的密码private key不同。

 

5. MD5摘要

给出一个很长的文字p,得到定长的16个字节的数据d,称为摘要。其用途在于完整性保护,即无论p有多长,恒定的p产生恒定的d。如果p中有一个位发生变化,将会导致d随之变化,从而可以检验p的完整性。

 

过程是这样的,发送方把p发送给接收方,同时附带d。接收方在接收到之后,对p进行运算, d' = MD5(p)。如果检查发现d' != d,则认为p在发送过程中被篡改。反之,如果d' == d,却不能直接认定没有被篡改,只能说被篡改的机率极低。因为不同的原文的摘要有可能是相同的。

 

6. CRC校验

CRC即循环冗余校验码(Cyclic Redundancy Check):是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。

它的作用和MD5应该是类似的,区别在于算法,它是通过一个循环来计算出来的。与MD5一样,不同的原文得到的CRC结果也可能是相同的。(CRC32算法出现误码但没有被检出的概率是1/2^32)

 

原创粉丝点击