BruceFan's Blog

Stay hungry, stay foolish

0%

密码学基础

加密算法分类

根据密钥数量

  • 对称加密:加解密使用相同密钥。基于复杂的非线性变换与迭代运算实现安全性。(DES、AES)
  • 非对称加密:加密使用公钥,解密使用私钥。基于某个数学难题实现安全性。(RSA)

根据加密方式

  • 分组密码:一次处理一个输入块,并产生一个对应的输出块,一个明文分组被作为一个整体来产生一个等长的密文分组,通常使用的分组为64bit或者128bit。(DES、AES)
  • 序列密码:一次只处理一个字节或一个位。(RC4)

TEA加密实现

TEA加密是一种分组密码算法,其分组长度为64bit,密钥长度为128bit。TEA算法利用不断增加的Delta(黄金分割率)值作为变化,使得每轮的加密是不同,该加密算法的迭代次数可以改变,建议的迭代次数为32轮。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h>
#include <string.h>

#define DELTA 0x9e3779b9
unsigned char key[16];

// 扰乱函数
void scramble(unsigned int k[], unsigned int t[])
{
unsigned int t0 = t[0], t1 = t[1];
unsigned int n, sum = 0;
for (n = 0; n < 32; n++) {
sum += DELTA;
t0 += ((t1 << 4) + k[0]) ^ (t1 + sum) ^ ((t1 >> 5) + k[1]);
t1 += ((t0 << 4) + k[2]) ^ (t0 + sum) ^ ((t0 >> 5) + k[3]);
}
t[0] = t0; t[1] = t1;
}

void encrypt(unsigned int k[], char *buf, int len)
{
int i;
for (i = 0; i < len / 8; i++)
scramble(k, (unsigned int *)(buf + (i * 8)));
}
// 解扰函数
void descramble(unsigned int k[], unsigned int t[])
{
unsigned int t0 = t[0], t1 = t[1];
unsigned int n, sum = DELTA << 5;
for (n = 0; n < 32; n++) {
t1 -= ((t0 << 4) + k[2]) ^ (t0 + sum) ^ ((t0 >> 5) + k[3]);
t0 -= ((t1 << 4) + k[0]) ^ (t1 + sum) ^ ((t1 >> 5) + k[1]);
sum -= DELTA;
}
t[0] = t0; t[1] = t1;
}

void decrypt(unsigned int k[], char *buf, int len)
{
int i;
for (i = 0; i < len / 8; i++)
descramble(k, (unsigned int *)(buf + (i * 8)));
}

int main()
{
char *plain = "Fuzzing consists of repeatedly testing an application with modified, or fuzzed input";
char text[256];
strcpy(key, "this is a key");
strcpy(text, plain);

encrypt((unsigned int *)key, text, sizeof(text));
printf("encrypt text: %s\n", text);
decrypt((unsigned int *)key, text, sizeof(text));
printf("decrypt text: %s\n", text);
return 0;
}

pycrypto中的加密算法

1.安装方式:

1
$ sudo pip install pycrypto

2.pycrypto模块是python中用来处理加密解密等信息安全相关的一个很重要模块。
该模块支持的加密方式:

  • 对称加密方式:AES、DES、RC4
  • 散列值计算:MD5、SHA、HMAC
  • 公钥加密和签名:RSA、DSA

3.AES实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/usr/bin/python
from Crypto.Cipher import AES

class AESCrypto():
def __init__(self, key):
self.key = key
self.mode = AES.MODE_CBC
self.iv = "0" * 16 # 默认iv是16个0(这个称为初始化向量),由于是分组加密,所以下一组的iv,就用前一组的加密的密文来充当

def aesencrypt(self, text):
cryptor = AES.new(self.key, self.mode, self.iv)
ciphertext = cryptor.encrypt(text.ljust(16))
return ciphertext

def aesdecrypt(self, text):
decryptor = AES.new(self.key, self.mode, self.iv)
plaintext = decryptor.decrypt(text)
return plaintext.rstrip(' ')

if __name__ == '__main__':
mycrypt = AESCrypto('thisisakeyyyyyyy')
e = mycrypt.aesencrypt("hello,world!")
print e
d = mycrypt.aesdecrypt(e)
print d