Smilor
20.07.2002, 12:18
Hi!
Es geht um das hier: http://www.angelfire.com/yt/jmyers/get/dev/web_cipher/cipher.shtml
Dort kann man eine html Seite mit Javascript verschlüsseln, welche nach Eingabe des richtigen Passwortes entschlüsselt angezeigt wird.
Mich würde dabei interessieren, wie sicher das Verfahren ist. Von Schlüssellänge steht da nix.
Kann es sein, dass das nur eine XOR Verschlüsselung ist?
Gibt es eigentlich Blowfish-JavaScript Implementierungen?
cipher.js
/*
* Written by Joseph K. Myers on 2001/05/18
* e_mayilme@hotmail.com; http://www.angelfire.com/yt/jmyers/
*/
var cipher_block_size=64, encoding_buffer=1024;
function b0f(c) {
return c < 16 ? '0' + c.toString(16) : c.toString(16);
}
function bff(c) {
return parseInt(c, 16);
}
function salt(s) {
var n = 0;
for (var i=0; i<s.length; i++) n += i&s.charCodeAt(i);
return b0f(n%256);
}
function encrypt(s,k) {
if (s.length > cipher_block_size) {
var m=parseInt(s.length/cipher_block_size), t=Math.round(m/2)*cipher_block_size;
return encrypt(s.substr(0, t), k) + encrypt(s.substr(t), k);
}
var r=parseInt(Math.random()*256), o=b0f(r), i;
for (i=0; i<s.length; i++) {
o += b0f(s.charCodeAt(i)^r^k.charCodeAt(i%k.length));
}
return o;
}
function decrypt(s,k) {
var dbs = (cipher_block_size+1)*2;
if (s.length > dbs) {
var m=parseInt(s.length/dbs), t=Math.round(m/2)*dbs;
return decrypt(s.substr(0, t), k) + decrypt(s.substr(t), k);
}
var n=bff(s.substr(0,2)), o='';
for (var i=2; i<s.length; i+=2) {
o += String.fromCharCode(bff(s.substr(i,2))^n^k.charCod eAt((i-2)/2%k.length));
}
return o;
}
function encipher(f) {
var s=f.stream.value, k=salt(f.key.value), r=k, b=encoding_buffer,
p=0, n=Math.floor(s.length/b)+1;
while (n > p++) {
self.status = 'Encrypting block ' + p + '/' + n;
r += encrypt(s.substr((p-1)*b, b), f.key.value);
}
f.stream.value = r;
self.status = 'Done';
}
function decipher(f) {
var s=f.stream.value.substr(2), k=salt(f.key.value), r='',
b=2*(encoding_buffer+encoding_buffer/cipher_block_size), p=0, n=Math.floor(s.length/b)+1;
if (k != f.stream.value.substr(0, 2)) {
if (!confirm('The key is probably incorrect.\nContinue decryption?'))
return;
}
while (p++ < n) {
self.status = 'Decrypting block ' + p + '/' + n;
r += decrypt(s.substr((p-1)*b, b), f.key.value);
}
f.stream.value = r;
return self.status = 'Done';
}
Es geht um das hier: http://www.angelfire.com/yt/jmyers/get/dev/web_cipher/cipher.shtml
Dort kann man eine html Seite mit Javascript verschlüsseln, welche nach Eingabe des richtigen Passwortes entschlüsselt angezeigt wird.
Mich würde dabei interessieren, wie sicher das Verfahren ist. Von Schlüssellänge steht da nix.
Kann es sein, dass das nur eine XOR Verschlüsselung ist?
Gibt es eigentlich Blowfish-JavaScript Implementierungen?
cipher.js
/*
* Written by Joseph K. Myers on 2001/05/18
* e_mayilme@hotmail.com; http://www.angelfire.com/yt/jmyers/
*/
var cipher_block_size=64, encoding_buffer=1024;
function b0f(c) {
return c < 16 ? '0' + c.toString(16) : c.toString(16);
}
function bff(c) {
return parseInt(c, 16);
}
function salt(s) {
var n = 0;
for (var i=0; i<s.length; i++) n += i&s.charCodeAt(i);
return b0f(n%256);
}
function encrypt(s,k) {
if (s.length > cipher_block_size) {
var m=parseInt(s.length/cipher_block_size), t=Math.round(m/2)*cipher_block_size;
return encrypt(s.substr(0, t), k) + encrypt(s.substr(t), k);
}
var r=parseInt(Math.random()*256), o=b0f(r), i;
for (i=0; i<s.length; i++) {
o += b0f(s.charCodeAt(i)^r^k.charCodeAt(i%k.length));
}
return o;
}
function decrypt(s,k) {
var dbs = (cipher_block_size+1)*2;
if (s.length > dbs) {
var m=parseInt(s.length/dbs), t=Math.round(m/2)*dbs;
return decrypt(s.substr(0, t), k) + decrypt(s.substr(t), k);
}
var n=bff(s.substr(0,2)), o='';
for (var i=2; i<s.length; i+=2) {
o += String.fromCharCode(bff(s.substr(i,2))^n^k.charCod eAt((i-2)/2%k.length));
}
return o;
}
function encipher(f) {
var s=f.stream.value, k=salt(f.key.value), r=k, b=encoding_buffer,
p=0, n=Math.floor(s.length/b)+1;
while (n > p++) {
self.status = 'Encrypting block ' + p + '/' + n;
r += encrypt(s.substr((p-1)*b, b), f.key.value);
}
f.stream.value = r;
self.status = 'Done';
}
function decipher(f) {
var s=f.stream.value.substr(2), k=salt(f.key.value), r='',
b=2*(encoding_buffer+encoding_buffer/cipher_block_size), p=0, n=Math.floor(s.length/b)+1;
if (k != f.stream.value.substr(0, 2)) {
if (!confirm('The key is probably incorrect.\nContinue decryption?'))
return;
}
while (p++ < n) {
self.status = 'Decrypting block ' + p + '/' + n;
r += decrypt(s.substr((p-1)*b, b), f.key.value);
}
f.stream.value = r;
return self.status = 'Done';
}