我目前正试图复制Douglas Crockfords演示文稿Principles of Security中显示的效果。为了证明使用“One Time Pad”加密密钥两次的风险,他展示了两个图像,用相同的密钥加密它们并从另一个中减去它们,导致两个图像同时显示。
我的方法使用四个画布元素,一个用于显示键,两个用于加载图像,第四个用作减法的目标。我能够生成(某种程度上)随机密钥,加载图像并加密它们。尝试解密图像时出现问题。为此,我将图像加载到第一个容器,加密它,然后加密第二个容器(这导致密钥的副本),然后减去两个容器的像素。原始图像仍然可以识别,但画布上会出现随机像素。
将图像加载到第二个容器时,应该能够从空的第一个容器中减去它时获得反转版本。出乎意料的是,画布保持空白。
我目前的状态可在JSFiddle查看,请查看。
答案 0 :(得分:1)
<强> Updated Demo 强>
首先你将alpha设置为255,然后继续并且仍然减去数据,所以无论你已经将它设置为255,你都减去了alpha通道。我所要做的就是让它成为条件。< / p>
然后你将值变为256,但范围是0-255。最后但并非最不重要的是,您需要在生成部分中使用另一个alpha条件。
//generate a random image
(function() {
var ct = getCTX("c0");
var imgData = ct.createImageData(400, 400);
var data = imgData.data;
for (var i = 0, j = data.length; i < j; i++) {
// Added conditional
if (i % 4 === 3){
data[i] = 255;
}else{
// random * 255 since color ranges are from 0-255
data[i] = Math.floor(Math.random() * 255);
}
}
ct.putImageData(imgData, 0, 0);
})();
function encodeWrap(id) {
return (function() {
var img = getCTX(id);
var imgData = img.getImageData(0, 0, 400, 400);
var data = imgData.data;
for (var i = 0, j = data.length; i < j; i++) {
if (i % 4 === 3){
// added condition for alpha
data[i] = 255;
}else{
// changed to 255
data[i] = (data[i] + randomValues[i]) % 255;
}
}
img.putImageData(imgData, 0, 0);
});
}
document.getElementById("bt3").addEventListener("click", function() {
var img1 = getImageData("c1"),
img2 = getImageData("c2"),
ct = getCTX("c3"),
imgData = ct.createImageData(400, 400),
data = imgData.data,
tmp;
for (var i = 0, j = data.length; i < j; i++) {
if (i % 4 === 3){
data[i] = 255;
}else{
tmp = img1[i] - img2[i];
// changed to 255 since ranges go from 0 - 255
if (tmp < 0){ tmp +=255;};
data[i] = tmp;
}
}
ct.putImageData(imgData, 0, 0);
});