首页 > 技术文章 > JAVA第一次实验 ——凯撒密码的实现

20135230pjy 2015-04-14 20:59 原文

JAVA实验一   编写程序实现凯撒密码

201352330 潘俊洋

一.实验说明    

凯撒密码作为一种最为古老的对称加密体制,在古罗马的时候都已经很流行,他的基本思想是:通过把字母移动一定的位数来实现加密和解密。

例如,如果字母的位数是3,明文字母B就变成了密文的E,依次类推,X将变成A,Y变成B,Z变成C,

由此可见,位数就是凯撒密码加密和解密的密钥。所以在程序中密钥key=3。

二.实验分析

1.由于字母表中共26个字符,因此移位前先将移动的位数(key)和26取模。由于Java中字符和整型可自动转换,因此将字符加上一个正整数即代表在字母表中右移多少位。

如果移动的位数是负值,则代表在字母表中左移多少位。尽管在移动之前已经将移动的位数和26取了模,但通过这种方式实现右移或左移仍可能发生超界。

如字母x右移3位应是字母a,但将字母x增加3后超出26个字母的范围。

因此移位后使用两个if语句判断一下,如果向左超界(c<'a')则增加26;向右超界(c>'z')则减去26。

程序中用户输入需要用到Scanner

例: Scanner input = new Scanner(System.in) 

     import java.util.ScannerScanner

     Scanner input = new Scanner(); 

Scanner对象 是可以 读取控制台的输入  这是一般的对象创建方法. 加了一个对象System.in参数,表示传递的是键盘的输入

三.流程图

(本人并不擅长做流程图   qvq)

四.实验代码

import java.util.Scanner;

 

public class Test 

{

void mj()

{

 Scanner in = new Scanner(System.in);

         System.out.print("请选择操作(1.加密 2.解密):");

         int n=in.nextInt();

         if(n == 1)

 {

             System.out.print("请输入待加密的字符串:");

             String str = in.next();

             String jm="";

             int key = 3;//凯撒密码加密,向后移位3

             for(int i = 0;i < str.length();i++)

 {

                 char c = str.charAt(i);

                 if(c >= 'a'&&c <= 'z')

 {

                  if(c>='x'&&c<='z')

 {

                  c-=26;

                  c+=key;

                      }

                  else

 {

                  c+=key;

                      }

                 }

                 else if(c >= 'A'&&c <= 'Z')

 {

                  if(c>='X'&&c<='Z')

 {

                  c-=26;

                  c+=key;

                      }

                  else

 {

                  c+=key;

                      }

                 }

                

                 jm += c;

             }

             System.out.print("加密后的字符串是:"+jm);

             System.out.print("\n输入任意建继续,0结束程序:");

             n=in.nextInt();

             if(n==0)

 {

              System.out.print("  谢谢使用本程序,欢迎再次使用!");

             }

             else

 {

                this.mj();

                 }

         }

         else if(n == 2)

 {

             System.out.print("请输入待解密的字符串:");

             String str = in.next();

             String jm="";

             int key = -3;//凯撒密码解密,向前移位3

             for(int i = 0;i < str.length();i++)

 {

                 char c = str.charAt(i);

                 if(c >= 'a'&&c <= 'z')

 {

                  if(c>='a'&&c<='c')

 {

                  c+=26;

                  c+=key;

                      }

                  else

 {

                  c+=key;

                  }

                 }

                 else if(c >= 'A'&&c <= 'Z')

 {

                  if(c>='A'&&c<='C')

 {

                  c+=26;

                  c+=key;

                  }

                  else

 {

                  c+=key;

                  }

                 }

                

                 jm += c;

             }

           System.out.println("解密后的字符串:"+jm);

           System.out.print("\n输入任意建继续,0结束程序:");

           n=in.nextInt();

           if(n==0)

   {

            System.out.print("  谢谢使用本程序,欢迎再次使用!");

               }

               else

   {

            this.mj();

               }

           }

           else

   {

           System.out.print("请输入12,其他字符无效!\n输入任意建继续,0结束程序:");

           n=in.nextInt();

           if(n==0)

   {

            System.out.print("  谢谢使用本程序,欢迎再次使用!");

           }

           else

   {

            this.mj();

           }

       }

}

 

    public static void main(String[] args) 

    {

       Test mj=new Test();

         System.out.println("******欢迎使用凯撒密码******");

        mj.mj();

     

    }

}

 

五.运行测试

 

六.实验感受

JAVA上实现了凯撒密码程序的设计和运行,结合密码学和JAVA的知识,同时提高和巩固了密码学和JAVA的学习内容。同时,也加强了对Scanner对象的理解(是可以 读取控制台的输入)和应用,因为刚开始接触所以并不熟悉。本次实验在算法上的难点就是对输入字符串的超界问题进行判断区分。

通过此次实验,对JAVA的兴趣越来越浓厚,希望今后能够更加熟练掌握这项计算机语言。

推荐阅读