JS实现置换密码加解密

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()">&nbsp;
		<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;		
	}

发布了40 篇原创文章 · 获赞 2 · 访问量 2393

猜你喜欢

转载自blog.csdn.net/qq_42404383/article/details/104682826