JS实现置换密码加解密
一、原理:
(百度的)
在简单的纵行换位密码中,明文以固定的宽度水平的写在一张图表纸上,密文按垂直方向读出,解密就是密文按相同的宽度垂直的写在图表纸上,然后水平的读出明文。
效果图:
二、加密方法:
例如周期为e的换位是将明文字母划分为组,每组e个字母,密钥是1,2,…e的一个置换f。
然后按照公式Yi+ne=Xf(i)+ ne,(其中i=1,…e;n=0,1,…)
将明文X1X2X3…加密为密文Y1Y2Y3…。
解密过程则按照下式进行:Xj+ne=Yf-1(j)+ ne,(其中j=1,…e;n=0,1…)。
明文:COMPUTER CRAPHICS MAY BE SLOW BUT ATLEASTTIE’S EXPENSIVE
C O M P U T E R C R
A P H I C S M A Y B
E S L O W B U T A T
L E A S T I T S E X
P E N S I V E
密文:CAELP OPSEE MHLAN PIOSS UCWTI TSBIV EMUTE RATSC YAERB TX
已知明文求密文:
明文 -->> 写出矩阵 -->> 根据秘钥垂直方向读出
密钥:3214
已知密文求明文
密文 -->> 写出矩阵 -->> 根据解密秘钥水平方向读出
解密秘钥求法:
解密密钥得到方式为用密钥的顺序(1234)写出下方正常排序的(12345)例1-3,2-2,3-1,4-4
3 2 1 4
1 2 3 4
解密密钥:3 2 1 4
三、代码实践
<form name="replacement" class="form-kaisa">
<h2 class="text-head">加密/解密</h2>
<table>
<tr><td>明文:</td><td><input type="text" name="plaintext" size=50 placeholder="Please input in here!"></td></tr>
<tr><td>密钥:</td><td><input type="text" name="key" placeholder="请输入密钥!<1-n>" ></td></tr>
<tr><td>密文:</td><td><input type="text" name="ciphertext" size=50></td></tr>
</table>
<input type="button" value="点击加密" onClick="replacement_encrypt()">
<input type="button" value="点击解密" onClick="replacement_decrypt()">
</form>
//置换密码
//加密
function replacement_encrypt(){
let key = document.replacement.key.value;
let plaintext = document.replacement.plaintext.value;
let ciphertext = "";
let tempArr = new Array(); //二维数组
let numLog = 0; //标记位
let chang = plaintext.length / key.length;
//排列矩阵
for(let i = 0; i < chang; i++){
tempArr[i] = new Array();
for(let j =0, len = key.length; j < len; j++){
tempArr[i][j] = plaintext.charAt(numLog) || " ";
numLog ++;
}
}
//根据密钥写出密文
for(let i = 0, len = key.length; i < len; i++){
let numFlag = key.charAt(i);
for(let j = 0; j < chang; j++){
ciphertext += tempArr[j][numFlag-1];
}
}
document.replacement.ciphertext.value = ciphertext;
}
//解密
function replacement_decrypt(){
let key = document.replacement.key.value;
let ciphertext = document.replacement.ciphertext.value;
let plaintext = "";
let tempArr = new Array(); //二维数组
let numLog = 0; //标记位
let jiemimiyao = new Array(); //解密秘钥
let chang = ciphertext.length / key.length;
//创建二维数组
for(let i = 0; i < chang; i++){
tempArr[i] = new Array();
for(let j =0, len = key.length; j < len; j++){
tempArr[i][j] = " ";
}
}
//排列矩阵
for( let i = 0; i < key.length; i++){
for( let j = 0; j < chang; j++){
tempArr[j][i] = ciphertext.charAt(numLog) || " ";
numLog ++;
}
}
//求解密秘钥
for(let i = 0, len = key.length; i < len; i++){
let numFlag = key.charAt(i);
jiemimiyao[numFlag] = i + 1;
}
//根据密钥写出明文
for(let i = 0; i < chang; i++){
for(let j =0, len = key.length; j < len; j++){
let numFlag = jiemimiyao[j+1];
plaintext += tempArr[i][numFlag-1];
}
}
document.replacement.plaintext.value = plaintext;
}