-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.js
150 lines (134 loc) · 4.1 KB
/
main.js
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
var messageText = document.getElementById("message");
var errorText = document.getElementById("textError");
var successText = document.getElementById("textSuccess");
var canvas;
var ctx;
var imageData;
var data;
function draw(img) {
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d');
ctx.clearRect(0, 0, canvas.width, canvas.height);
canvas.width = img.width;
canvas.height = img.height;
ctx.drawImage(img, 0, 0);
img.style.display = 'none';
imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
data = imageData.data;
}
var encryptbtn = document.getElementById('encryptbtn');
encryptbtn.addEventListener('click', encrypt);
var decryptbtn = document.getElementById('decryptbtn');
decryptbtn.addEventListener('click', decrypt);
var downloadtbtn = document.getElementById('downloadbtn');
downloadtbtn.addEventListener('click', saveImage);
function encrypt() {
try{
errorText.style.display = "none";
successText.style.display = "none";
var message = messageText.value;
var messageLength = message.length;
var pixelsNeeded = (messageLength* 8) + 9; // max 512 characters
if(pixelsNeeded > canvas.height*canvas.width){
throw "Image too small";
}
var binaryMessage = ASCIItoBinary(message);
var binaryLength = messageLength.toString(2);
binaryLength = new Array(10 - binaryLength.length).join('0') + binaryLength; // pad to nine bits
binaryMessage = binaryLength + binaryMessage;
var currentBit = 0;
var pixelOdd = false;
for (var i = 0; i < pixelsNeeded * 4; i += 4) {
pixelOdd = isOdd(data[i]);
if (binaryMessage.charAt(currentBit) == 1 && !pixelOdd) {
data[i] = ++data[i];
} else if (binaryMessage.charAt(currentBit) == 0 && pixelOdd) {
data[i] = --data[i];
}
currentBit++;
}
ctx.putImageData(imageData, 0, 0);
messageText.value = '';
successText.style.display = "block";
}
catch(e){
errorText.style.display = "block";
}
}
function decrypt() {
errorText.style.display = "none";
successText.style.display = "none";
var binaryLength = '';
for (var i = 0; i < 36; i += 4) {
if (isOdd(data[i])) {
binaryLength += '1';
} else {
binaryLength += '0';
}
}
var pixelsNeeded = parseInt(binaryLength, 2) * 8;
var binaryMessage = '';
for (var i = 36; i < pixelsNeeded * 4 + 36; i += 4) {
if (isOdd(data[i])) {
binaryMessage += '1';
} else {
binaryMessage += '0';
}
}
var decryptedMessage = '';
for (var k = 0; k < binaryMessage.length; k += 8) {
decryptedMessage += binarytoASCII(binaryMessage.slice(k, k + 8));
}
messageText.value = decryptedMessage;
}
function ASCIItoBinary(message) {
var output = '';
for (i = 0; i < message.length; i++) {
var binary = message[i].charCodeAt(0).toString(2);
binary = new Array(9 - binary.length).join('0') + binary; // pad to eight bits
output += binary;
}
return output;
}
function binarytoASCII(str) {
return str.split(/\s/).map(function(val) {
return String.fromCharCode(parseInt(val, 2));
}).join("");
}
function isOdd(x) {
return (x & 1) ? true : false;
}
$(function() {
$(":file").change(function() {
if (this.files && this.files[0]) {
var reader = new FileReader();
reader.readAsDataURL(this.files[0]);
reader.onload = imageIsLoaded;
}
});
});
function imageIsLoaded(e) {
successText.style.display = "none";
var img = new Image();
img.src = e.target.result;
img.crossOrigin = "Anonymous"
img.onload = function() {
draw(this);
};
};
$(document).ready(function(){
$('[data-toggle="popover"]').popover();
});
function saveImage(){
var imageToSave = canvas.toDataURL("image/jpg");
downloadtbtn.href = imageToSave;
}
//TODO
// $("#message").keydown(function(e)
// {
// var allowed = /^[\x00-\x7F]*$/; //regex
// var value = String.fromCharCode(e.keyCode); //get the charcode and convert to char
// if (!value.match(allowed)) {
// return false;
// }
// });