Вы вдохновили меня попробовать.Я написал в блоге об этом, и вы можете найти демо здесь .
Я использовал Crypto-JS для шифрования и дешифрования с помощью AES и Rabbit.
Сначала я получаю CanvasPixelArray из объекта ImageData.
var ctx = document.getElementById('leif')
.getContext('2d');
var imgd = ctx.getImageData(0,0,width,height);
var pixelArray = imgd.data;
Массив пикселей имеет четыре байта для каждого пикселя как RGBA, но Crypto-JS шифрует строку, а не массив.Сначала я использовал .join () и .split (","), чтобы перейти от массива к строке и обратно.Это было медленно, и нить стала намного длиннее, чем должна была быть.На самом деле в четыре раза дольше.Чтобы сэкономить еще больше места, я решил отказаться от альфа-канала.
function canvasArrToString(a) {
var s="";
// Removes alpha to save space.
for (var i=0; i<pix.length; i+=4) {
s+=(String.fromCharCode(pix[i])
+ String.fromCharCode(pix[i+1])
+ String.fromCharCode(pix[i+2]));
}
return s;
}
Эта строка - то, что я затем шифрую.После прочтения String Performance a Analysis я придерживался + = .
var encrypted = Crypto.Rabbit.encrypt(imageString, password);
Я использовал небольшое изображение размером 160x120 пикселей.С четырьмя байтами для каждого пикселя, что дает 76800 байтов.Несмотря на то, что я удалил альфа-канал, зашифрованное изображение все еще занимает 124680 байт, в 1,62 раза больше.При использовании .join () это было 384736 байт, в 5 раз больше.Одна из причин, по которой он по-прежнему больше исходного изображения, заключается в том, что Crypto-JS возвращает строку в кодировке Base64 и добавляет примерно 37%.
Прежде чем я смог записать его обратно на холст, мне пришлось преобразовать его вснова массив.
function canvasStringToArr(s) {
var arr=[];
for (var i=0; i<s.length; i+=3) {
for (var j=0; j<3; j++) {
arr.push(s.substring(i+j,i+j+1).charCodeAt());
}
arr.push(255); // Hardcodes alpha to 255.
}
return arr;
}
Расшифровка проста.
var arr=canvasStringToArr(
Crypto.Rabbit.decrypt(encryptedString, password));
imgd.data=arr;
ctx.putImageData(imgd,0,0);
Протестировано в Firefox, Google Chrome, WebKit3.1 (Android 2.2), iOS 4.1 и в недавнем выпускеОпера.
