维吉尼亚加密过程

本次实验①从键盘上接收文件路径输入和密钥,然后在硬盘上读取txt文件内容进行维吉尼亚加密后输出密文(鼓励但不强制要求将密文写入文件)。②从键盘上输入密钥和密文,给出解密后的明文(鼓励但不强制要求将密文写入文件)。至少实现下列三个函数:
//生成加密/解密的密码表
private static char[][] GenerateTable(int count)
//根据密文text和密钥key解密出明文
public static String Decode(String text,String key)
//根据明文的文件路径filePath和密钥key加密出密文
public static String Encode(String filePath, String key)
加密过程:(密钥使用RELATIONS)

package SHIYAN2;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Scanner;

public class Syan2 {
	private static char[][] GenerateTable(int count){
		char n='A';
		char[][] TABLE=new char[26][26];
		for(int i=0;i<26;i++) {!](https://img-
			for(int j=0;j<26;j++) {
				TABLE[i][j]=(char)(65+(j+i)%26);
			}
		}
		return TABLE;	
	}
	private static String txt2String(String fil){
	       String result = "";
		      try{
		           BufferedReader br = new BufferedReader(new FileReader(fil));//构造一个BufferedReader类来读取文件
		            String s = null;
		            while((s = br.readLine())!=null){//使用readLine方法,一次读一行
		                result = result + "\n" +s;
		           }
		             br.close();    
		         }catch(Exception e){
		             e.printStackTrace();
		         }
		         return result;
		     }
		     public static String Encode(String filePath, String key) {
		String f=txt2String(filePath);
		int m=f.length()/key.length();
		for(int i=0;i<m;i++) {
			key+=key;
		}
		int cou=0;
		String text ="";
		char[][] t=GenerateTable(1);
		
		for(int i=1;i<f.length();i++) {
			for(int j=0;j<key.length();j++) {
				int n=(int)f.charAt(i);
				if((int)f.charAt(i)==32) {
					//System.out.print(" ");
					text+=" ";
					break;	
				}
				else {
					int n1=(int)f.charAt(i)-65;
					int d1=(int)key.charAt(cou)-65;
					//System.out.print(t[d1][n1]);
					text+=t[d1][n1];
				}
				cou+=1;
				break;
			}
		}

		return text;
	}
	
	public static void Decode(String text,String key) {
	
		
		    int cont = 0;
		    int len = key.length();  //len为加密关键字的长度
		    for(int i=0; i<text.length(); i++)
		    {
		        if((int)text.charAt(i)<'A' ||(int)text.charAt(i)>'Z')
		        {
		            System.out.print(text.charAt(i));
		            cont++;
		        }
		        else
		        {
		            int j = (i-cont) % len;
		            int n = key.charAt(j)-'A';
		            System.out.print((char)((text.charAt(i)-'A'+26-n)%26+'A'));
		        }
		    }
		}

	public static void main(String[] args) throws IOException {
		System.out.println("please enter the path of the file:");
		Scanner st=new Scanner(System.in);
		String file=st.nextLine();
		System.out.println("please enter the path of the KEY:");
		String K=st.nextLine();
		char[][] t=GenerateTable(1);
		String f=txt2String(file);//D:\MO\\encode.txt   RELATIONS
		System.out.println("输出的密文为:");
		String text=Encode(file,K);
		System.out.print(text);
		Encode(file,K);
		System.out.print("\n");
		System.out.println("要处理的密文为:"+"\n"+text);
		System.out.print("上一条密文解密后为:"+"\n");
		Decode(text,K);
}
}

实验结果输出:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值