Created
May 9, 2016 10:47
-
-
Save evsasse/86704711bf311d6e012e7ee5431cb956 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Information Security | |
// Waseda University 2016-1 | |
// Evandro Sasse - 1W15C902-3 | |
function pad(bits, size){ | |
while(bits.length < size) | |
bits = "0"+bits; | |
return bits; | |
} | |
function hexToBin(hex){ | |
return hex.split('').reduce((prv,cur)=>{ | |
return prv+pad(parseInt(cur,16).toString(2),4); | |
},"") | |
} | |
function binToHex(bin){ | |
var hex = ""; | |
for(var i = 0; i < bin.length/4; i++){ | |
hex += parseInt(bin.slice(i*4,i*4+4),2).toString(16); | |
} | |
return hex.toUpperCase(); | |
} | |
function xor(bits1, bits2){ | |
bits1 = bits1.split(''); | |
bits2 = bits2.split(''); | |
return bits1.reduce((prv,cur,ind)=>{ | |
switch(cur+bits2[ind]){ | |
case "00": | |
case "11": | |
return prv + "0"; | |
case "01": | |
case "10": | |
return prv + "1"; | |
} | |
},"") | |
} | |
function permutation(bits, order){ | |
bits = bits.split(''); | |
var reorder = order.reduce((prv,cur)=>prv+bits[cur-1],""); | |
return reorder; | |
} | |
function circularshift(bits,amount){ | |
var [first, ...left] = bits; | |
bits = [...left, first].join(''); | |
if(amount === 1) return bits; | |
return circularshift(bits, amount-1); | |
} | |
const _IP = [58, 50, 42, 34, 26, 18, 10, 2, | |
60, 52, 44, 36, 28, 20, 12, 4, | |
62, 54, 46, 38, 30, 22, 14, 6, | |
64, 56, 48, 40, 32, 24, 16, 8, | |
57, 49, 41, 33, 25, 17, 9, 1, | |
59, 51, 43, 35, 27, 19, 11, 3, | |
61, 53, 45, 37, 29, 21, 13, 5, | |
63, 55, 47, 39, 31, 23, 15, 7] | |
function IP(bits){ | |
return permutation(bits,_IP); | |
} | |
const _FP = [40, 8, 48, 16, 56, 24, 64, 32, | |
39, 7, 47, 15, 55, 23, 63, 31, | |
38, 6, 46, 14, 54, 22, 62, 30, | |
37, 5, 45, 13, 53, 21, 61, 29, | |
36, 4, 44, 12, 52, 20, 60, 28, | |
35, 3, 43, 11, 51, 19, 59, 27, | |
34, 2, 42, 10, 50, 18, 58, 26, | |
33, 1, 41, 9, 49, 17, 57, 25] | |
function FP(bits){ | |
return permutation(bits,_FP); | |
} | |
const _E = [32, 1, 2, 3, 4, 5, | |
4, 5, 6, 7, 8, 9, | |
8, 9, 10, 11, 12, 13, | |
12, 13, 14, 15, 16, 17, | |
16, 17, 18, 19, 20, 21, | |
20, 21, 22, 23, 24, 25, | |
24, 25, 26, 27, 28, 29, | |
28, 29, 30, 31, 32, 1] | |
function E(bits){ | |
return permutation(bits,_E); | |
} | |
const _P = [16, 7, 20, 21, 29, 12, 28, 17, | |
1, 15, 23, 26, 5, 18, 31, 10, | |
2, 8, 24, 14, 32, 27, 3, 9, | |
19, 13, 30, 6, 22, 11, 4, 25] | |
function P(bits){ | |
return permutation(bits,_P); | |
} | |
const _S = [[14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7, | |
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8, | |
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0, | |
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13], | |
[15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10, | |
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5, | |
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, | |
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9], | |
[10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8, | |
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1, | |
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7, | |
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12], | |
[7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15, | |
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9, | |
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4, | |
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14], | |
[2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9, | |
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6, | |
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14, | |
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3], | |
[12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11, | |
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8, | |
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6, | |
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13], | |
[4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1, | |
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6, | |
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2, | |
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12], | |
[13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7, | |
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2, | |
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8, | |
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11]] | |
const _PC1 = [57, 49, 41, 33, 25, 17, 9, | |
1, 58, 50, 42, 34, 26, 18, | |
10, 2, 59, 51, 43, 35, 27, | |
19, 11, 3, 60, 52, 44, 36, | |
63, 55, 47, 39, 31, 23, 15, | |
7, 62, 54, 46, 38, 30, 22, | |
14, 6, 61, 53, 45, 37, 29, | |
21, 13, 5, 28, 20, 12, 4] | |
function PC1(bits){ | |
return permutation(bits,_PC1); | |
} | |
const _PC2 = [14, 17, 11, 24, 1, 5, | |
3, 28, 15, 6, 21, 10, | |
23, 19, 12, 4, 26, 8, | |
16, 7, 27, 20, 13, 2, | |
41, 52, 31, 37, 47, 55, | |
30, 40, 51, 45, 33, 48, | |
44, 49, 39, 56, 34, 53, | |
46, 42, 50, 36, 29, 32] | |
function PC2(bits){ | |
return permutation(bits,_PC2); | |
} | |
const rotations = [1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1]; | |
function K(key){ | |
key = PC1(key); | |
var left = key.slice(0,28); | |
var right = key.slice(28,56); | |
var k = []; | |
for(var i = 0; i < 16; i++){ | |
//console.log(left,right); | |
left = circularshift(left,rotations[i]); | |
right = circularshift(right,rotations[i]); | |
k[i] = PC2(left+right); | |
} | |
return k; | |
} | |
function SBox(ind,bits){ | |
var box = _S[ind]; | |
var y = parseInt(bits.slice(1,5),2); | |
var x = parseInt(bits[0]+bits[5],2); | |
return pad(Number(box[x*16+y]).toString(2),4); | |
} | |
function S(bits){ | |
var s = []; | |
for(var i = 0; i < 8; i++){ | |
s[i] = SBox(i,bits.slice(i*6,i*6+6)); | |
} | |
return s.reduce((prv,cur)=>prv+cur,""); | |
} | |
function F(ri, ki){ | |
var bits = xor(E(ri),ki); | |
bits = S(bits); | |
return P(bits); | |
} | |
function DES(plaintext,key){ | |
var bits = IP(plaintext); | |
var l = []; | |
var r = []; | |
l[0] = bits.slice(0,32); | |
r[0] = bits.slice(32); | |
var k = K(key); | |
//console.log(k); | |
for(var i = 0; i < 16; i++){ | |
l[i+1] = r[i]; | |
r[i+1] = xor(l[i],F(r[i],k[i])) | |
//console.log(l,r); | |
} | |
return FP(r[16]+l[16]); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment