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;		
	}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值