vigenere.java

来自「Java实现传统算法加密解密」· Java 代码 · 共 120 行

JAVA
120
字号
import java.util.*;
import java.io.*;

/**
 * 
 * @author Neng
 * 
 */
public class Vigenere {

	/**
	 * input file containing plaintext
	 */
	private File inFile;

	/**
	 * ArrayList of plaintext, key and cipher
	 */
	ArrayList ap, ak, ac;

	char[] key;

	public Vigenere() {
		ap = new ArrayList();
		ak = new ArrayList();
		ac = new ArrayList();

	}

	public void encrypt(File in, String keyStr) throws IOException {
		inFile = in;
		System.out.println("Key is "+keyStr);
		key = keyStr.toUpperCase().toCharArray();

		ap.clear();
		ak.clear();
		ac.clear();

		FileReader fr = new FileReader(inFile);
		FileWriter fw = new FileWriter(inFile.getParent()
				+ "/Vigenere_cipher.txt");
		StringBuffer sb = new StringBuffer();

		// read plaintext from input file and change to uppercase
		int temp;
		while ((temp = fr.read()) != -1) {
			if ((temp >= 65 && temp <= 90) || (temp >= 97 && temp <= 122))
				sb.append((char) temp);
		}
		fr.close();
		String plainStr = sb.toString().toUpperCase();
		
		//plaintext array
		for (int i = 0; i < plainStr.length(); i++) {
			ap.add(plainStr.charAt(i));
		}
		//generate key array
		for (int i = 0; i < ap.size(); i++) {
			ak.add(i, key[i % key.length]);

		}
		//encryption
		for (int i = 0; i < ak.size(); i++) {
			int c;
			c = (((Character) ap.get(i)).charValue()
					+ ((Character) ak.get(i)).charValue() - 2 * 65) % 26 + 65;
			ac.add(i, (char) c);
		}

		for (int i = 0; i < ac.size(); i++) {
			fw.write(((Character) ac.get(i)).charValue());
		}
		fw.close();
		System.out.println("Vigenere encryption ok");
	}

	public void decrypt() throws IOException {
		ap.clear();
		ak.clear();
		ac.clear();

		FileReader fr = new FileReader(inFile.getParent()
				+ "/Vigenere_cipher.txt");
		FileWriter fw = new FileWriter(inFile.getParent()
				+ "/Vigenere_decrypt.txt");
		StringBuffer sb = new StringBuffer();

		int temp;
		while ((temp = fr.read()) != -1) {
			if ((temp >= 65 && temp <= 90) || (temp >= 97 && temp <= 122))
				sb.append((char) temp);
		}
		fr.close();

		String plainStr = sb.toString().toUpperCase();

		for (int i = 0; i < plainStr.length(); i++) {
			ap.add(plainStr.charAt(i));
		}
		for (int i = 0; i < ap.size(); i++) {
			ak.add(i, key[i % key.length]);

		}
		for (int i = 0; i < ak.size(); i++) {
			int c;
			c = (((Character) ap.get(i)).charValue()
					- ((Character) ak.get(i)).charValue() + 26) % 26 + 97;
			ac.add(i, (char) c);
		}

		for (int i = 0; i < ac.size(); i++) {
			fw.write(((Character) ac.get(i)).charValue());
		}
		fw.close();
		System.out.println("Vigenere decryption ok");

	}

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?