HDU密码学-Caesar密码(Java实现)

本文介绍了Caesar密码的原理和历史,这是一种古典密码学中的替换密码。通过Java程序展示了如何在IntelliJ IDEA中实现Caesar密码的加密和解密过程,包括用户输入选择、密钥设置及字符转换。实验提供了一个示例,明文'attacknow'加密后变为'sllsucfgo',并使用解密密钥8还原回原始信息。
摘要由CSDN通过智能技术生成

一、实验名称: Caesar密码实验

二、实验要求:

1、了解古典密码的几种分类。
2、掌握Caesar密码的加减密原理。
3、运用IntelliJ IDEA实现Caesar密码程序。

三、实验内容:

1、密码学是一门古老的学科,起源于在古代军事作战中如何隐密地传递信息的问题。从古希腊时期一直到1949年,都属于古典密码的发展时期。古典密码主要分为两种:替换密码和置换密码。替换密码指的是根据替换表将明文逐字母换成其他的字母来产生密文;置换密码指的是将明文中的字母重新排列来产生密文。
2、在古罗马时期,执政官凯撒(Caesar)在军事作战中使用了一种密码用于与其将军们通信,后人称其为“Caesar密码”。它的描述相当简单,设
明文 M=m(1)m(2)…m(n),m(i) 均为英文字母,
密钥 k(也就是偏移量)是0~26的整数,
密文 C=c(1)c(2)…c(n),c(i)均为英文字母。
1)加密
先将明文中每个对应到0~25的整数,得到;
再根据密钥k将作偏移,得到
在这里插入图片描述
记为
在这里插入图片描述
d’i仍然是0~25的整数;
最后对应回英文字母,得到密文。
2)解密
类似于加密,只需要把密钥换成是26-k,就能将密文解密成明文。
3)示例
明文为attacknow,密钥为18,加密时将每个字母用相隔18个位置后的字母替换,得到密文为sllsucfgo;再取密钥为26-18=8,用于解密密文sllsucfgo,得到明文attacknow。
3、使用IntelliJ IDEA编写Java程序,实现Caesar密码程序。
主要步骤:
1)输入要求“加密、解密”
2)输入密钥
3)输出“明文、密文”
提示点:
1 ) 可能会用到String, char[], int之间的相互转化
2 ) ‘a’~ ‘z’ 的ASCII码值分别是97~122
测试示例:明文attacknow,加密密钥为18,密文sllsucfgo,解密密钥为8。
“加密/解密”事件程序代码如下:

package Caesar;

import java.util.Scanner;

import static java.lang.System.exit;

public class Caesa {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请选择解密或加密");
        System.out.println("1.加密");
        System.out.println("2.解密");
        int n = sc.nextByte();
        if (n == 1 || n == 2) {
            if (n == 1) {
                System.out.println("请输入k");
                int k;
                k = sc.nextInt();
                System.out.println("请输入需要加密的小写字母字符串");
                String str1 = sc.next();
                char[] ch1 = str1.toCharArray();
                char[] ch2 = new char[ch1.length];
                for (int i = 0; i < ch1.length; i++) {
                    ch2[i] = (char) (((int) ch1[i] - 97 + k) % 26 + 97);
                }
                System.out.println("密文为:");
                for (char j : ch2) {
                    System.out.print(j);
                }
            } else {
                System.out.println("请输入k");
                int k;
                k = sc.nextInt();
                System.out.println("请输入需要解密的小写字母字符串");
                String str2 = sc.next();
                char[] ch3 = str2.toCharArray();
                char[] ch4 = new char[ch3.length];
                for (int i = 0; i < ch3.length; i++) {
                    ch4[i] = (char) (((int) ch3[i] - 97 - k + 26) % 26 + 97);
                }
                for (char j : ch4) {
                    System.out.print(j);
                }
            }
        } else {
            exit(1);
        }
    }
}

测试结果截屏如下:
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值