古典密码算法------替代密码算法

替代密码算法的原理是使用替代法进行加密,就是将明文中的字符用其它字符替代后形成密文。例如:明文字母abcd ,用DEFG做对应替换后形成密文。

替代密码包括多种类型,如单表替代密码、多明码替代密码、多字母替代密码、多表替代密码等。下面我们介绍一种典型的单表替代密码,恺撒(caesar)密码,又叫循环移位密码。它的加密方法,就是将明文中的每个字母用此字符在字母表中后面第k个字母替代。它的加密过程可以表示为下面的函数:

E(m)=(m+k) mod n

其中:m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。

例如,对于明文字母H,其在字母表中的位置数为8,设k=4,则按照上式计算出来的密文为L

E(8) = (m+k) mod n = (8+4) mod 26 = 12 = L

 
 
  1. package cn.hdu.edu.encrypt;  
  2.  
  3.  
  4. /*  
  5.  * 古典密码算法之  替代算法  
  6.  *   
  7.  */ 
  8. public class Replace {  
  9.  
  10.     //当加密或者解密成功时返回CRYPT_OK,失败时返回CRYPT_ERROR  
  11.     private final static int CRYPT_OK =     1;    
  12.     private final static int CRYPT_ERROR = 0;  
  13.     //设定一共有26个可用字母  字母a的编码是97  
  14.     private final static int totalLetter = 26;  
  15.     private final static int key = 3;  
  16.  
  17.     /*  
  18.      * @param initCode 没有加密前的字符串  
  19.      * @CRYPT_OK 加密成功  
  20.      * @CRYPT_ERROR 加密失败  
  21.      */ 
  22.     public static int encrypt(String initCode)throws Exception{  
  23.     //用来输出加密后的字符      
  24.     StringBuilder sb = new StringBuilder();  
  25.     for(int i = 0; i < initCode.length(); i++ ){  
  26.             int initCodeVal = initCode.charAt(i ) - 96;  
  27.             int targetCodeVal = (initCodeVal + key ) % totalLetter;  
  28.             if(targetCodeVal == 0) targetCodeVal = 26;  
  29.             char targetCode =  (char)(targetCodeVal +96);         
  30.             sb.append(targetCode );  
  31.     }  
  32.     //以下就是加密后的字符  
  33.     String targetCode = sb.toString();  
  34.     System.out.println(targetCode);  
  35.         return CRYPT_OK;  
  36.     }  
  37.       
  38.     /*  
  39.      * @param targetCode 加密前的字符串  
  40.      * @CRYPT_OK 解密成功  
  41.      * @CRYPT_ERROR 解密失败  
  42.      */ 
  43.     public static int decrypt(String targetCode)throws Exception{  
  44.     //用来输出解密后的字符      
  45.     StringBuilder sb = new StringBuilder();  
  46.     for(int i = 0; i < targetCode.length(); i++ ){  
  47.             int targetCodeVal = targetCode.charAt(i ) - 96;  
  48.               
  49.             //如果已经来到了字母表的开头   给他还回去  
  50.             if(targetCodeVal <= key)     targetCodeVal += 26;  
  51.                   
  52.             int initCodeVal = targetCodeVal - key;  
  53.             char initCode =  (char)(initCodeVal + 96);  
  54.             sb.append(initCode );  
  55.     }  
  56.     //以下就是解密后的字符  
  57.     String initCode = sb.toString();  
  58.     System.out.println(initCode);  
  59.         return CRYPT_OK;  
  60.     }  
  61.       
  62.       
  63.       
  64.       
  65. }  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值