(3)Vigenere密码算法的Java实现
来源:互联网 发布:连接视频的软件 编辑:程序博客网 时间:2024/04/29 07:58
Vigenère密码是多表代换密码中的一种,其思想是:明文的每个字母使用不同k的凯撒加密。
我们可以构造一个维吉尼亚密码表的矩阵,最左边为密钥字母,最上面为明文,加密过程很简单:给定密钥字母x和明文字母y,密文字母为位于x行和y列的字母。
其实,如果假设能被加密的字符有N个,如果把这N个字符建成一个环, 那么加密过程就是模N的过程,即,C(i)=(K(i)+P(i))modN,其中K、C、P分别代表的是密钥空间、密文空间、消息(明文)空间。
根据维吉尼亚密码算法,编写相应Java程序:
public class Vigenere { /**大写字母表**/ static String alpha="ABCDEFGHIJKLMNOPQRSTUVWXYZ"; /** * 处理密钥 * @param str 字符串 * @param K 密钥 * @return 与str长度相等的密钥字符串 */ public static String dealK(String str,String K){ K=K.toUpperCase();// 将密钥转换成大写 K=K.replaceAll("[^A-Z]", "");//去除所有非字母的字符 StringBuilder sb=new StringBuilder(K); String key=""; if(sb.length()!=str.length()){ //如果密钥长度与str不同,则需要生成密钥字符串 if(sb.length()<str.length()){ //如果密钥长度比str短,则以不断重复密钥的方式生成密钥字符串 while(sb.length()<str.length()){ sb.append(K); } } //此时,密钥字符串的长度大于或等于str长度 //将密钥字符串截取为与str等长的字符串 key=sb.substring(0, str.length()); } return key; } /** * 根据vigenere密码算法对明文进行加密 * @param P 明文 * @param K 密钥 * @return 密文 */ public static String encrypt(String P,String K){ P=P.toUpperCase();// 将明文转换成大写 P=P.replaceAll("[^A-Z]", "");//去除所有非字母的字符 K=dealK(P,K); int len=K.length(); StringBuilder sb=new StringBuilder(); for(int i=0;i<len;i++){ int row=alpha.indexOf(K.charAt(i));//行号 int col=alpha.indexOf(P.charAt(i));//列号 int index=(row+col)%26; sb.append(alpha.charAt(index)); } return sb.toString(); } /** * 根据vigenere密码算法对密文进行解密 * @param C 密文 * @param K 密钥 * @return 明文 */ public static String decrypt(String C,String K){ C=C.toUpperCase();// 将密文转换成大写 C=C.replaceAll("[^A-Z]", "");//去除所有非字母的字符 K=dealK(C,K); int len=K.length(); StringBuilder sb=new StringBuilder(); for(int i=0;i<len;i++){ int row=alpha.indexOf(K.charAt(i));//行号 int col=alpha.indexOf(C.charAt(i));//列号 int index; if(row>col){ index=col+26-row; }else{ index=col-row; } sb.append(alpha.charAt(index)); } return sb.toString(); } public static void main(String args[]){ String P="explanation"; String K="leg"; String C=encrypt(P,K); System.out.println("密文:"+C); System.out.println("明文:"+decrypt(C,K)); }}
运行程序,结果如下:
密文:PBVWETLXOZR
明文:EXPLANATION
0 0
- (3)Vigenere密码算法的Java实现
- Vigenere密码 Python实现
- 用Java实现仿射密码,vigenere和Hill密码,内含用欧几里得算法实现一个数对于26的逆
- 古典密码学(Vigenere)之Java实现
- noip2012 vigenere密码 (模拟)
- Vigenere密码
- Vigenere密码
- 多码加密 vigenere算法 python 实现
- 多码加密 vigenere算法 python 实现
- Vigenere密码 Hill密码
- 聊胜于无 Java之Caesar与Vigenere实现
- 聊胜于无 Java之Caesar与Vigenere实现
- 破解 维吉尼亚(vigenere) 密码
- 密码程序之vigenere
- Vigenere 密码破译
- P1778 vigenere密码
- 【Noip2012】Vigenere密码
- NOIP 2012 Vigenere 密码
- Core Animation - 寄宿图<二>
- BitmapFactory.Options
- CodeForces 625B War of the Corporations
- MYSQL 连接数据库命令收藏
- 通过storyboard自定义绘制View
- (3)Vigenere密码算法的Java实现
- Android 程序框架设计
- 杭电1003Max Sum
- 线段数求和模板
- Java编程入门
- 让32位Eclipse和64位Eclipse同时在64的Windows7上运行
- Hadoop启动时SSH免密码登录
- windows 操作系统镜像下载
- 2015年大二上-数据结构-查找-2-(1)-HashTable