aeslua/ciphermode.lua

1
local aes = require("aeslua.aes");
2
local util = require("aeslua.util");
3
local buffer = require("aeslua.buffer");
4
 
5
local public = {};
6
 
7
local aeslua = require("aeslua");
8
aeslua.ciphermode = public;
9
 
10
--
11
-- Encrypt strings
12
-- key - byte array with key
13
-- string - string to encrypt
14
-- modefunction - function for cipher mode to use
15
--
16
function public.encryptString(key, data, modeFunction)
17
    local iv = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
18
    local keySched = aes.expandEncryptionKey(key);
19
    local encryptedData = buffer.new();
20
    
21
    for i = 1, #data/16 do
22
        local offset = (i-1)*16 + 1;
23
        local byteData = {string.byte(data,offset,offset +15)};
24
		
25
        modeFunction(keySched, byteData, iv);
26
 
27
        buffer.addString(encryptedData, string.char(unpack(byteData)));    
28
    end
29
    
30
    return buffer.toString(encryptedData);
31
end
32
 
33
--
34
-- the following 4 functions can be used as 
35
-- modefunction for encryptString
36
--
37
 
38
-- Electronic code book mode encrypt function
39
function public.encryptECB(keySched, byteData, iv) 
40
	aes.encrypt(keySched, byteData, 1, byteData, 1);
41
end
42
 
43
-- Cipher block chaining mode encrypt function
44
function public.encryptCBC(keySched, byteData, iv) 
45
    util.xorIV(byteData, iv);
46
 
47
    aes.encrypt(keySched, byteData, 1, byteData, 1);    
48
        
49
    for j = 1,16 do
50
        iv[j] = byteData[j];
51
    end
52
end
53
 
54
-- Output feedback mode encrypt function
55
function public.encryptOFB(keySched, byteData, iv) 
56
    aes.encrypt(keySched, iv, 1, iv, 1);
57
    util.xorIV(byteData, iv);
58
end
59
 
60
-- Cipher feedback mode encrypt function
61
function public.encryptCFB(keySched, byteData, iv) 
62
    aes.encrypt(keySched, iv, 1, iv, 1);    
63
    util.xorIV(byteData, iv);
64
       
65
    for j = 1,16 do
66
        iv[j] = byteData[j];
67
    end        
68
end
69
 
70
--
71
-- Decrypt strings
72
-- key - byte array with key
73
-- string - string to decrypt
74
-- modefunction - function for cipher mode to use
75
--
76
function public.decryptString(key, data, modeFunction)
77
    local iv = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
78
    
79
    local keySched;
80
    if (modeFunction == public.decryptOFB or modeFunction == public.decryptCFB) then
81
    	keySched = aes.expandEncryptionKey(key);
82
   	else
83
   		keySched = aes.expandDecryptionKey(key);
84
    end
85
    
86
    local decryptedData = buffer.new();
87
 
88
    for i = 1, #data/16 do
89
        local offset = (i-1)*16 + 1;
90
        local byteData = {string.byte(data,offset,offset +15)};
91
 
92
		iv = modeFunction(keySched, byteData, iv);
93
 
94
        buffer.addString(decryptedData, string.char(unpack(byteData)));
95
    end
96
 
97
    return buffer.toString(decryptedData);    
98
end
99
 
100
--
101
-- the following 4 functions can be used as 
102
-- modefunction for decryptString
103
--
104
 
105
-- Electronic code book mode decrypt function
106
function public.decryptECB(keySched, byteData, iv) 
107
 
108
    aes.decrypt(keySched, byteData, 1, byteData, 1);
109
    
110
    return iv;
111
end
112
 
113
-- Cipher block chaining mode decrypt function
114
function public.decryptCBC(keySched, byteData, iv) 
115
	local nextIV = {};
116
    for j = 1,16 do
117
        nextIV[j] = byteData[j];
118
    end
119
        
120
    aes.decrypt(keySched, byteData, 1, byteData, 1);    
121
    util.xorIV(byteData, iv);
122
 
123
	return nextIV;
124
end
125
 
126
-- Output feedback mode decrypt function
127
function public.decryptOFB(keySched, byteData, iv) 
128
    aes.encrypt(keySched, iv, 1, iv, 1);
129
    util.xorIV(byteData, iv);
130
    
131
    return iv;
132
end
133
 
134
-- Cipher feedback mode decrypt function
135
function public.decryptCFB(keySched, byteData, iv) 
136
    local nextIV = {};
137
    for j = 1,16 do
138
        nextIV[j] = byteData[j];
139
    end
140
 
141
    aes.encrypt(keySched, iv, 1, iv, 1);
142
        
143
    util.xorIV(byteData, iv);
144
    
145
    return nextIV;
146
end
147
 
148
return public;