卡在新的铁路围栏密码(Zig Zac Patten)中的解密



我正在绑定新密码,类似于铁路围栏,但在zic zac Patten例如

*   * *   *
* * * * *
*     *

我成功地完全能够用上面的帕滕加密文本。

这是我在 JavaScript 中的代码

var plain_txt = "mynameismanan5439"
var a = ''
var b = ''
var c = ''
var d = ''
var flag_a = 0
function enc(plain) {
for (var i = 0; i < plain.length; i = i + 4) {
if (flag_a == 0) {
a += plain.charAt(i)
//console.log(i+","+(i+1)+","+(i+2)+","+(i+3))
b += plain.charAt(i + 1)
c += plain.charAt(i + 2)
b += plain.charAt(i + 3)
flag_a = 1
continue
} else {
a += plain.charAt(i)
b += plain.charAt(i + 1)
//console.log(i+","+(i+1))
i = i - 2
flag_a = 0
}
}
return (a + b + c)
}
console.log(enc(plain_txt))

但是在这里我的问题是我没有弄清楚如何编写给定问题的解密程序请帮助我

我想要输出类似dec(enc(plain_text))==plain_text

提前谢谢你

@zaph也许三个是另一种方式,通过我欣赏你的答案来找出答案 最后,我找到了一个解决方案 感谢@zaph的动力和您给我提示的时间,请删除抓住任何为什么这不是一个好的密码是必须知道完整的长度才能分离字符以进行解密。从您的评论中,因为没有什么是不可能的

这是我想要的解密代码

var plain_txt = "mynameismanan5439"
function enc(plain){
var a = ''
var b = ''
var c = ''
var d =''
var flag_a = 0
for(var i = 0;i<plain.length;i=i+4){
if(flag_a == 0){
a += plain.charAt(i)
//console.log(i+","+(i+1)+","+(i+2)+","+(i+3))
b += plain.charAt(i+1)
c += plain.charAt(i+2)
b += plain.charAt(i+3)
flag_a = 1
continue
}
else{
a += plain.charAt(i)
b += plain.charAt(i+1)
//console.log(i+","+(i+1))
i = i-2
flag_a = 0
}
}
return (a+b+c)
}
console.log("encryption is = "+enc(plain_txt))
function dec(cipher){
var plain = ''
var a =''
var b =''
var c =''
var length = cipher.length
var multply = parseInt(length/6)
if (length>=6){
a = cipher.slice(0, (2*multply));
b = cipher.slice((2*multply),(5*multply));
c = cipher.slice((5*multply));
}
if((length%6)==1){
a =  cipher.slice(0, (2*multply)+1);
b = cipher.slice((2*multply)+1,(5*multply)+1);
c = cipher.slice((5*multply)+1);
}
else if((length%6)==2){
a =  cipher.slice(0, (2*multply)+1);
b = cipher.slice((2*multply)+1,(5*multply)+2);
c = cipher.slice((5*multply)+3);
}
else if((length%6)==3){
a =  cipher.slice(0, (2*multply)+1);
b = cipher.slice((2*multply)+1,(5*multply)+2);
c = cipher.slice((5*multply)+2);
}
else if((length%6)==4){
a =  cipher.slice(0, (2*multply)+1);
b = cipher.slice((2*multply)+1,(5*multply)+3);
c = cipher.slice((5*multply)+3);
}
else if((length%6)==5){
a =  cipher.slice(0, (2*multply)+2);
b = cipher.slice((2*multply)+2,(5*multply)+4);
c = cipher.slice((5*multply)+4);
}
var a_counter = 0
var b_counter = 0
var c_counter = 0
for(var i = 0;i<length-1;i+=6){
plain += a.charAt(a_counter) + b.charAt(b_counter) + c.charAt(c_counter)+b.charAt(b_counter+1)+a.charAt(a_counter+1)+b.charAt(b_counter+2);
a_counter+=2;
b_counter+=3;
c_counter++;
}
if((length % 6)==1){
plain += a.charAt(a_counter) ;
}
else if((length % 6)==2){
plain += a.charAt(a_counter) + b.charAt(b_counter);
}
else if((length % 6)==3){
plain += a.charAt(a_counter) + b.charAt(b_counter) + c.charAt(c_counter);
}
else if((length % 6)==4){
plain += a.charAt(a_counter) + b.charAt(b_counter) + c.charAt(c_counter)+b.charAt(b_counter+1);
}
else if((length % 6)==5){
plain += a.charAt(a_counter) + b.charAt(b_counter) + c.charAt(c_counter)+b.charAt(b_counter+1)+a.charAt(a_counter+1);
}                                                                                           
return plain;
}
console.log("decryption is = "+dec(enc(plain_txt)))

告诉您是否有任何关于优化代码的想法 谢谢

制作一些图表:

mynameismanan5439
abcbababcbababcba the order the letters are assigned to a, b, c
a: mminn9
b: yaesaa53
c: nm4
mminn9yaesaa53nm4 result

现在倒退

mminn9yaesaa53nm4
a: mminn9
b: yaesaa53
c: nm4
abcbababcbababcba
mynameismanan5439

代码一次按顺序处理六个字符abcbabas、一个c和三个bs。因此,您可以知道对于 99 个字符,有 16 个完整序列 6*16 = 96 和另外 4 个字符。最后 4 个字符必须是"abcb",因此有 32:'a'、48:'b' 、16:'c'。将最后一个块中的字符相加,你会得到 33 个 'a', 50:'b' 17:'c'。现在分解"A"、"B"和"C"。为什么这不是一个好的密码,那就是必须知道完整的长度才能分隔要解密的字符。

对总长度的模 6 运算将提供最后一个块中的字符数。然后 1/3 = 'a's,1/6 = 'c',1/2 = "b"。

以下是OP在创建破译a,b和c字符串时的答案的简化。

function dec(cipher){
var plain = ''
var a =''
var b =''
var c =''
// -- begin simplification --
var length = cipher.length
var lastChunkLength = length%6
var chunkSize = (length-lastChunkLength)/6
console.log("lastChunkLength: " + lastChunkLength)
console.log("chunkSize:       " + chunkSize)
var aLength = chunkSize * 2
var bLength = chunkSize * 3
var cLength = chunkSize * 1
if(lastChunkLength>0){
aLength += 1
}
if(lastChunkLength>1){
bLength += 1
}
if(lastChunkLength>2){
cLength += 1
}
if(lastChunkLength>3){
bLength += 1
}
if(lastChunkLength>4){
aLength += 1
}
a = cipher.slice(0, aLength);
b = cipher.slice(aLength, aLength+bLength);
c = cipher.slice(aLength+bLength, aLength+bLength+cLength);
// -- end simplification --
var a_counter = 0
var b_counter = 0
var c_counter = 0
for(var i = 0;i<length-1;i+=6){
plain += a.charAt(a_counter) + b.charAt(b_counter) + c.charAt(c_counter)+b.charAt(b_counter+1)+a.charAt(a_counter+1)+b.charAt(b_counter+2);
a_counter+=2;
b_counter+=3;
c_counter++;
}
if((length % 6)==1){
plain += a.charAt(a_counter) ;
}
else if((length % 6)==2){
plain += a.charAt(a_counter) + b.charAt(b_counter);
}
else if((length % 6)==3){
plain += a.charAt(a_counter) + b.charAt(b_counter) + c.charAt(c_counter);
}
else if((length % 6)==4){
plain += a.charAt(a_counter) + b.charAt(b_counter) + c.charAt(c_counter)+b.charAt(b_counter+1);
}
else if((length % 6)==5){
plain += a.charAt(a_counter) + b.charAt(b_counter) + c.charAt(c_counter)+b.charAt(b_counter+1)+a.charAt(a_counter+1);
}                                                                                           
return plain;
}
var cipher = "mminn9yaesaa53nm4"
console.log("cipher: " + cipher)
var deCipher = dec(cipher);
console.log("decryption is = " + deCipher)

最新更新