20145305 《Java程序设计》实验一

实验名称

实现凯撒密码,并进行测试。

实验内容

它是一种代换密码。据说凯撒是率先使用加密函的古代将领之一,因此这种加密方法被称为恺撒密码。
凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。例如,当偏移量是3的时候,所有的字母A将被替换成D,B变成E,以此类推X将变成A,Y变成B,Z变成C。由此可见,位数就是凯撒密码加密和解密的密钥。

实验步骤

由于字母表中共26个字符,因此移位前先将移动的位数(key)和26取模。由于Java中字符和整型可自动转换,因此将字符加上一个正整数即代表在字母表中右移多少位。
如果移动的位数是负值,则代表在字母表中左移多少位。尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或左移仍可能发生超界。
如字母x右移3位应是字母a,但将字母x增加3后超出26个字母的范围。
因此移位后使用两个if语句判断一下,如果向左超界(c<'a')则增加26;向右超界(c>'z')则减去26。

流程图

实验代码

package cryptology;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;

public class Kaisa {

    StringBuffer eStr = new StringBuffer("");   // 加密字符串
    StringBuffer dStr = new StringBuffer("");   // 解密字符串

    public static void main(String[] args) {

        System.out.print("请输入密钥:");
        Scanner s = new Scanner(System.in);
        int key = s.nextInt() % 26; // %26的意义是获取密钥的偏移值
        Kaisa ks = new Kaisa();
        ks.E(key);  // 加密
        ks.D(key);  // 解密
    }

    /**
     * 加密 公式
     */
    void E(int k) {
        try {
            System.out.println("请输入一段明文:");
            char b[];
            BufferedReader br2 = new BufferedReader(new InputStreamReader(System.in));
            String str2 = br2.readLine();
            b = str2.toCharArray();
            char ch = ' ';
            for (int i = 0; i < str2.length(); i++) {
                if (b[i] >= 'a' && b[i] <= 'z') {
                    ch = (char) ((b[i] - 'a' + k) % 26 + 'a');
                }
                if(b[i] >= 'A' && b[i] <= 'Z'){
                    ch = (char) ((b[i] - 'A' + k) % 26 + 'A');
                }
                eStr.append(ch);    // 拼接字符串
            }
            System.out.println("密文为:"+eStr+"   密匙为:" + k);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     * 解密 公式
     */
    void D(int k) {
        try {
            char b[];
            b = eStr.toString().toCharArray();
            char ch =' ';
            for (int i = 0; i < eStr.length(); i++) {
                if (b[i] >= 'a' && b[i] <= 'z') {
                    ch = (char) ((b[i] - 'a' + 26 - k) % 26 + 'a');
                }
                if(b[i] >= 'A' && b[i] <= 'Z'){
                    ch = (char) ((b[i] - 'A' + 26 - k) % 26 + 'A');
                }
                dStr.append(ch);    // 拼接字符串
            }
            System.out.println("明文:"+dStr);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

运行结果截图

思考感悟

通过本次实验在算法上学会了处理对输入字符串的超界问题,判别和分析

posted on 2016-04-10 16:31  20145305解佳玲  阅读(149)  评论(2编辑  收藏  举报