]>
Commit | Line | Data |
---|---|---|
ace37679 CP |
1 | # write me |
2 | ||
3 | def xor(a, b): | |
4 | assert(len(a) == len(b)) | |
5 | out = [] | |
6 | for i in range(0, len(a)): | |
7 | out.append(chr(ord(a[i]) ^ ord(b[i]))) | |
8 | ||
9 | return "".join(out) | |
10 | ||
11 | class CBC: | |
12 | def __init__(self, cipher, iv): | |
13 | self.__cipher = cipher | |
14 | self.__prevblock = False | |
15 | self.__iv = iv | |
16 | ||
17 | def encrypt(self, block): | |
18 | if not self.__prevblock: | |
19 | i = self.__iv | |
20 | else: | |
21 | i = self.__prevblock | |
22 | ||
23 | c = xor(block, i) | |
24 | ||
25 | self.__prevblock = self.__cipher.encrypt(c) | |
26 | return self.__prevblock | |
27 | ||
28 | def decrypt(self, block): | |
29 | c = self.__cipher.decrypt(block) | |
30 | if not self.__prevblock: | |
31 | i = self.__iv | |
32 | else: | |
33 | i = self.__prevblock | |
34 | ||
35 | c = xor(c, i) | |
36 | ||
37 | self.__prevblock = block | |
38 | return c |