java实现多表代替密码(维吉尼亚密码)
维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。
设d为一固定的正整数,d个位移代换表π=(π1,π2,…,πd),由密钥序列K=(k1,k2,…,kd)给定,第 i+td个明文字母由表πi决定。即密钥ki决定
加密算法如下:
ek(xi+td)=(xi+td+ki)mod(q)e_k(x_{i+td})=(x_{i+td}+k_i)mod(q)ek(xi+td)=(xi+td+ki)mod(q)
解密算法如下:
ek(yi+td)=(yi+td+ki)mod(q)e_k(y_{i+td})=(y_{i+td}+k_i)mod(q)ek(yi+td)=(yi+td+ki)mod(q)
例:当q=26时,x=polyalphabetic cipher ,K=RADIO
明文 | polyalphabeticcipher |
---|---|
密钥 | RADIORADIORADIORADIO |
密文 | GOOGOCPKIPVTLKQZPKMF |
java代码如下:
package com.ibianma;/*** 维多利亚多表代替密码*/
public class MultipleTableMima {/*** 加密* @param plaintext 明文* @param secretKey 密钥* @return 密文*/public String encryption(String plaintext,String secretKey){String ciphertext = "";char[][] chars = new char[2][plaintext.length()];for (int i = 0; i <plaintext.length() ; i++) {chars[0][i]=plaintext.charAt(i);chars[1][i]=secretKey.toUpperCase().charAt(i%(secretKey.length()));}char[] charArray = plaintext.toCharArray();for (int i = 0; i <charArray.length ; i++) {int j = charArray[i];if (j>=97&&j<=97+26){int k = chars[1][i];char te = (char) (((j - 97) + (k - 65)) % 26+65);ciphertext = ciphertext+te;}if (j>=65&&j<=65+26){int k = chars[1][i];char te = (char) (((j - 65) + (k - 65)) % 26+97);ciphertext = ciphertext+te;}}return ciphertext;}/*** 解密算法* @param ciphertext 密文* @param secretKey 密钥* @return 明文*/public String decrypt(String ciphertext,String secretKey){String plaintext="";char[][] chars = new char[2][ciphertext.length()];for (int i = 0; i <ciphertext.length() ; i++) {chars[0][i]=ciphertext.charAt(i);chars[1][i]=secretKey.toUpperCase().charAt(i%(secretKey.length()));}char[] charArray = ciphertext.toCharArray();for (int i = 0; i <charArray.length ; i++) {int j = charArray[i];if (j>=97&&j<=97+26){int k = chars[1][i];char te = (char) (((j - 97) + 26-(k - 65)) % 26+65);plaintext = plaintext+te;}if (j>=65&&j<=65+26){int k = chars[1][i];char te = (char) (((j - 65) + 26-(k - 65)) % 26+97);plaintext = plaintext+te;}}return plaintext;}
}
测试代码如下:
package com.ibianma;import java.util.Scanner;public class CodingTest {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入密匙:");String s = scanner.next();MultipleTableMima mima = new MultipleTableMima();System.out.print("请输入明文:");String mingWen = scanner.next();String sl = mima.encryption(mingWen, s);System.out.println("加密后的密文是:"+sl);String s2 = mima.decrypt(sl,s);System.out.println("解密后的明文是:"+s2);}
}
测试结果如下:
请输入密匙:dfvGVV
请输入明文:dscfbgGHJBVF
加密后的密文是:GXXLWBjmehqa
解密后的明文是:dscfbgGHJBVF
java实现多表代替密码(维吉尼亚密码)相关推荐
- 多表代换和维吉尼亚密码
一.多表代换 多表代换密码跟单表代换密码的区别,主要是,多表代换的代换表有多个.对于加密,交替使用不同的代换表.注意,加密和解密要同步,也就是,加密和解密所用的代换表顺序要一致,不然,解密会出错. 多 ...
- 古典密码(单表密码,维吉尼亚密码,普莱费尔密码,一次一密)
古典密码 1.单表密码(仿射加密) 仿射加密变化是:y=ax+b 算法: 仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母. A B C ...
- Java实现凯撒密码、维吉尼亚密码、双换位密码、RC4算法加密
文章目录 前言 一.凯撒密码 二.维吉尼亚密码 三.双换位密码 四.RC4算法加密 前言 本博文为信息安全与支付课程的课程作业. 一.凯撒密码 文件有:Caesar.java.输入文件input1.t ...
- 维吉尼亚密码-攻防世界(shanghai)
⭐维吉尼亚密码 维吉尼亚密码 是使用一系列 凯撒密码 组成密码字母表的加密算法,属于多表密码的一种简单形式. 加密原理 维吉尼亚密码的前身,是我们熟悉的凯撒密码. 凯撒密码的加密方式是依靠一张字母表中 ...
- Android实现信息安全中维吉尼亚密码技术
人们在单一恺撒密码的基础上扩展出多表密码,称为"维吉尼亚"密码.是法国密码学家维吉尼亚在1586年提出的一种多表替代密码,维吉尼亚密码引入了"密钥"的概念,即根 ...
- 维吉尼亚密码及其破解
凯撒密码 凯撒密码是一种简单的加密方法,即将文本中的每一个字符都位移相同的位置. 如选定位移3位: 原文:a b c 密文:d e f 由于出现了字母频度分析,凯撒密码变得很容易破解. "如 ...
- 如何计算维吉尼亚密码?Java实现维吉尼亚密码的加密解密算法
文章目录 如何计算维吉尼亚密码? Java实现加密算法 Java实现解密算法 参考博客 如何计算维吉尼亚密码? 计算维吉尼亚密码有2种方式,一种是根据密码表查找,另一种是手动计算方法. 1.密码表查找 ...
- MTALAB实现多表代替密码(维吉尼亚密码)
维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式. 设d为一固定的正整数,d个位移代换表π=(π1,π2,-,πd),由密钥序列K=(k1,k2 ...
- 维吉尼亚密码Java实现
维吉尼亚密码是一种古典密码,属于代换密码,而且是多表代换密码. 密文对应的字母数字=明文对应的字母数字+密钥对应的字母数字 例如: 明文abcde,密钥abcd,对应的密文就是bdfhf,第五个明文e ...
- 【密码学原理与实践】(四)维吉尼亚密码 符java代码实现
维吉尼亚密码(Vigenere Cipher) 转载请著明出处 无论是移位密码还是代换密码,一旦秘钥被选定,则每个字母对应的数字都被加密变换成对应的唯一数字.我们称这种为单表代换密码,而本篇讲的是一种 ...
最新文章
- win 7 系统过期处理办法
- java获取当前方法
- 关于印发《会计电算化管理办法》等规章的通知
- 关于Oracle中varchar2和dbms_output.put_line的长度限制问题小结
- 【进程的同步和互斥,看懂这张图就够了!】
- 【目标检测_CentripetalNet】CentripetalNet: Pursuing High-quality Keypoint Pairs for Object Detection_2020
- Flask 第三方组件之 login
- 行!看到抖音上Python程序员晒得工资条,我沉默了......
- python导入同一文件夹下的类_python自定义模块
- PowerDesigner oracle 反向工程到cdm文件
- opengl 实时波形显示_OpenGL1------OpenGL概述
- python中类的参数怎么传_如何将整个类作为参数传递给另一个类的方法
- Vivado Launching SDK Importing Hardware Specification error的解决方法
- 中国无线耳机行业市场供需与战略研究报告
- Python解析器安装后测试打开微软商店
- 2021年系统集成项目管理工程师证书领取
- Python3 将汉语转换为汉语拼音
- 批量下载NCBI各种数据的方法集合
- unity3d Daikon GUI 图片查看器 Demo 说明
- FZOJβ #113 后缀平衡树
热门文章
- 本地快速搭建FTP服务器
- CC2530_ZigBee+华为云IOT:设计一套属于自己的冷链采集系统
- 清明上河图30亿像素_清明上河图高清下载|
- linux下如何实现pgadmin备份,linux下pgAdmin4安装
- 原型工具MockingBot 墨刀
- ORACLE建表sql
- fdfs文件服务环境搭建详细教程
- unity3d游戏开发第2版 pdf_从零开始学基于ARKit的Unity3d游戏开发系列1
- linux和windows php pdf转图片,扩展安装imagick和ImageMagick
- linux 内网文件传输工具_局域网内文件传输工具 | nitroshare