古典密码算法(凯撒、维吉尼亚)

A. 1-1.移位密码算法

【实验目的】

1) 学习移位密码的原理

2) 学习移密码的实现

【实验原理】

  1. 算法原理

a) 移位密码就是对26个字母进行移位操作,可以移动任意位数,这样就实现了对明文的加密,移位操作简单易行,因此,加密解密比较简单。

b) 移位密码的基本思想:移位密码算法 c=m+k(mod 26),k可以使0<k<26的任意整数。加密算法:x=x+k(mod26),解密算法x=x-k(mod 26)。当K=3,时,为凯撒密码。

  1. 算法参数

移位密码算法主要有c、m、k 三个参数。c 为密文,m 是明文,k 为密钥。

  1. 算法流程

算法流程如下。如图所示

输入

第一行输入表明是加密还是解密,0是加密,1是解密;

第二行是加密或解密密钥,是0<k<26之间的一个整数;

第三行是明文或密文。

输出

输出是明文或密文。

输入样例1

0
6
wearesztuers
1
6
CKGXKYFZAKXY

输出样例1

CKGXKYFZAKXY
wearesztuers

AC源代码

import java.util.Scanner;/*** @author xzx* @date 2022/10/18*/
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int op, key;String text;while (scanner.hasNext()) {op = scanner.nextInt();key = scanner.nextInt();text = scanner.next();System.out.println(CodeByKey(text, key, op == 0 ? 1 : 0));}}/*** @param text* @param step* @param direction 0:左移 1:右移* @return*/private static String CodeByKey(String text, int step, int direction) {StringBuilder stringBuilder = new StringBuilder();if (direction == 0) {step = -1 * step;}char startLocation = 'a';int mod = 26;for (int i = 0; i < text.length(); i++) {boolean isUpper = false;char preChar = text.charAt(i);if (Character.isUpperCase(preChar)) {isUpper = true;preChar = Character.toLowerCase(preChar);}int preLocation = preChar - startLocation;int offset = (preLocation + step) % mod;if (offset < 0) {offset += mod;}char cipherChar = (char) (startLocation + offset);if (!isUpper) {//小写转大写cipherChar = Character.toUpperCase(cipherChar);}stringBuilder.append(cipherChar);}return stringBuilder.toString();}
}

B. 1-2.维吉尼亚算法

【实验目的】

1) 学习维吉尼亚算法的原理

2) 学习维吉尼亚算法的实现

【实验原理】

  1. 算法原理

a) Vigenere密码是由法国密码学家Blaise de Vigenere于1858年提出的一种代换密码,它是多表代换密码的典型代表。

b) 定义:设m为某一固定的正整数,P、C和K分别为明文空间、密文空间和密钥空间,并且P=K=C=(Z26)m,对一个密钥k=(k1,k2,…,km),定义维吉尼亚密码的加解密算法如下:

Vigenere密码加密算法: ek(x1,x2,…,xm)=(x1+k1,x2+k2,…,xm+km)

Vigenere密码解密算法: dk(y1,y2,…,ym)=(y1-k1,y2-k2,…,ym-km)。

其中k=(k1,k2,…,km)是一个长为m的密钥字,密钥空间的大小为26m,所以对一个相对小的m,穷举密钥也需要很长的时间。如m=7,则密钥空间大小超过8×109,所以手工搜索非常困难。当明文的长度超过m时,可将明文串按长度m分局,然后对每一组使用密钥k加密。

  1. 算法参数

Vigenere密码算法主要有c、m、k三个个参数。c为密文,m是明文,k为密钥。

输入

第一行输入明文

第二行输入密钥

输出

第一行输出密文

第二行输出密文解密后得到的明文

输入样例1

xipuyangguang
best

输出样例1

ymhnzefzhysgh
xipuyangguang

AC源代码

import java.util.Scanner;/*** @author* @date 2022/10/18*/
public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String plainText = scanner.nextLine();String key = scanner.nextLine();String cipherText = decode(plainText, key);System.out.println(cipherText);plainText = encode(cipherText, key);System.out.println(plainText);}/*** 加密** @param plainText 明文* @param key       密钥* @return*/private static String decode(String plainText, String key) {return CodeByKey(plainText, key, 1);}/*** 解密** @param cipherText 密文* @param key        密钥* @return*/private static String encode(String cipherText, String key) {return CodeByKey(cipherText, key, 0);}/*** @param text* @param key* @param direction 0:左移 1:右移* @return*/private static String CodeByKey(String text, String key, int direction) {StringBuilder stringBuilder = new StringBuilder();char startLocation = 'a';int index = 0, mod = 26;key = key.toLowerCase();for (int i = 0; i < text.length(); i++, index++) {boolean isUpper = false;char preChar = text.charAt(i);if (Character.isUpperCase(preChar)) {isUpper = true;preChar = Character.toLowerCase(preChar);}index %= key.length();int preLocation = preChar - startLocation;int step = key.charAt(index) - startLocation;if (direction == 0) {step = -1 * step;}int offset = (preLocation + step) % mod;if (offset < 0) {offset += mod;}char cipherChar = (char) (startLocation + offset);if (isUpper) {cipherChar = Character.toUpperCase(cipherChar);}stringBuilder.append(cipherChar);}return stringBuilder.toString();}
}

古典密码算法(移位密码算法、维吉尼亚算法)相关推荐

  1. php实现维吉尼亚算法,python实现维吉尼亚算法

    本文实例为大家分享了python实现维吉尼亚算法的具体代码,供大家参考,具体内容如下 1 Virginia加密算法.解密算法 Vigenenre密码是最著名的多表代换密码,是法国著名密码学家Vigen ...

  2. 维吉尼亚算法python编程实现

    1 Virginia加密算法.解密算法 Vigenenre密码是最著名的多表代换密码,是法国著名密码学家Vigenenre发明的.Vigenenre密码使用一个词组作为密钥,密钥中每一个字母用来确定一 ...

  3. 密码学——维吉尼亚密码

    文章目录 前言 一.维吉尼亚密码简介 二.维吉尼亚算法 1.加密算法 2.解密算法 3.主函数 总结 前言 本内容为博主学习维吉尼亚密码的笔记,如有错误,烦请指正. 一.维吉尼亚密码简介 维吉尼亚密码 ...

  4. 密码学 | 维吉尼亚密码(Vigener)

    1 单字母替换(前备知识) 在大量英文文献以及普通英文文章中,研究者发现这种文章中单词出现的频率符合一定的规律.如上表所示,例如a出现的频率在8.2%左右,e出现的频率最高,在12.4%左右.y.z频 ...

  5. 维吉尼亚密码解密轮子

    维吉尼亚密码的解码源码 维吉尼亚密码 先介绍一下什么是维吉尼亚密码 好了不解释了,大概率你们是来抄作业的QAQ,还是直接上代码吧 源代码 def get_key(key, chr_list):#得到密 ...

  6. 维吉尼亚密码的破解算法及python代码实现

    目录 1. 密文描述 1.1 密文1 1.2 密文2 2. 破解原理 2.1 重合指数法确定密钥长度 2.2 互重合指数确定子串间相对偏移 2.3 密钥字的确定 2.4 密文破解 3. 破解代码 参考 ...

  7. 信息安全——维吉尼亚密码算法(C++实现)

    信息安全导论课程学习的实验一,维吉尼亚密码算法C++的实现. 维吉尼亚密码算法是一种代换密码算法,直观上来说,密钥一般短于明文长度,因此加密时需要将明文根据密钥长度进行分组,每一组明文根据密钥对应(0 ...

  8. C++vigenere cipher维吉尼亚密码算法(附完整源码)

    vigenere cipher维吉尼亚密码的算法 vigenere cipher维吉尼亚密码的完整源码(定义,实现,main函数测试) vigenere cipher维吉尼亚密码的完整源码(定义,实现 ...

  9. Java实现凯撒密码、维吉尼亚密码、双换位密码、RC4算法加密

    文章目录 前言 一.凯撒密码 二.维吉尼亚密码 三.双换位密码 四.RC4算法加密 前言 本博文为信息安全与支付课程的课程作业. 一.凯撒密码 文件有:Caesar.java.输入文件input1.t ...

最新文章

  1. MySql练习题参考答案
  2. SQLSERVER model数据库
  3. 《Python硬件编程实战》——2.8 在Mac中安装Python
  4. JQuery.validate中文API
  5. python基础知识点整理-Python知识点整理(day1)
  6. 小区的足球场地实地拍摄
  7. webstorm和intellij idea下如何自动编译sass和scss文件
  8. 「MacOS」如何在终端中通过“ls”命令显示所有隐藏文件
  9. jaxb注解使用_使用JAXB的简介
  10. oa软件测试用例,OA标准系统测试用例.doc
  11. Java的tomcat的配置_java-Tomcat配置
  12. 欧姆龙c200he基本语言,欧姆龙C200HE-CPU42-ZE支持软件操作手册PLC手册 - 广州凌控
  13. WIN7 32 联想针式打印机 联想DP600+ 文字不全
  14. Cad二次开发版本集合2000-2022
  15. ERP原理及应用教程-第五章
  16. 对正在准备2022年哈尔滨工程大学计算机类考研复试的考生的一些建议
  17. android 获取sn序列号
  18. React Reflux
  19. 系统架构-基础篇-(高性能基础建设说明与选型条件)
  20. 高考状元杀死同学 自称跟马加爵的经历很像

热门文章

  1. android auto note 8,可持续发展BMW将发布无线安卓互联系统,CarPlay终于不再一家独大!...
  2. 《第一行代码》12.2学习中遇到的一些问题and心得
  3. 看完《第一行代码》再看什么书可以进一步提高?
  4. 如何给pdf添加页码?
  5. phpinfo输出的PHP版本和php -v版本不一致 宝塔切换无效
  6. USB转TTL给ESP8266-12F芯片下载程序
  7. 3dMax建模笔记(一):介绍3dMax和创建第一个模型Hello world
  8. 百年孤独人物脉略简介
  9. R中时间序列分析-趋势分析Trend
  10. JSON与对象、list数组的相互转化