加密

问题四:加密
输入文件:cipher.in 标准输出


鲍勃和艾丽丝准备使用一中崭新的加密系统。他们的加密和解密基于保密密钥,奇怪的是该系统并非是公钥密码加密系统。.他们使用的密钥来源于1996216日的费城(美国宾西法尼亚州东南部港市)会议。他们挑选一组大小不相同的n个整数a1,a2,…,an(0<ai<=n)序列作为他们的密钥。加密规则为:原文消息根据密钥进行设置,原文中的字符与密钥中的数进行对应安排。即原文中的第i位置上的字符将被放到第aiai为密钥的第i个数)位置中。加密了的消息如果需要继续加密,就继续采用同样的方案进行。一般一次加密需要进行k次处理,使用该方案进行k次就完成加密。
消息的长度不大于n。如果消息的长度小于n,我们就可以在消息的后面填加空字符使他的长度为n。如果消息的长度大于n,我们就将按照每n个字符分批处理。
请你帮助鲍勃和艾丽丝编写一个程序,你的程序将从文件中读取有n个值的密钥序列和一行包含k值和消息的数据,要求对消息进行k次加密,然后得出加密后的信息。
Input输入文件由几个用例构成,每个用例的第一行为一个正的整数n(0<n<=200),下一行为一个n个数的密钥序列。接下来就是包含k值和一个由ascii码的消息行,k值与消息由一个空格分开。每行由行结束符表示该行结束,行结束符不属于消息。每个用例使用0表示表示该用例结束,最后使用一个0表示用例结束。
Output依照输入顺序将经过加密的消息输出。每个密文应该有n个字符,每个用例的输出之间使用一个空行。
Sample Input10
4 5 3 7 2 8 1 6 10 9
1 Hello Bob
1995 CERC
0
0
Sample Output BolHeol b
C RCE 

import  java.io. *
import  java.util. *
class  key 
public int position; 
public char data; 
public key(int position,char data) 

  
this.position=position; 
  
this.data=data; 
}
 
}
 
class  Test4 

public static void main(String[] args) throws Exception 

  BufferedReader bf
=new BufferedReader(new FileReader("cipher.in")); 
  String str; 
  
int n=Integer.parseInt(bf.readLine()); 
  
int a[]=new int[n]; 
  StringTokenizer tag
=new StringTokenizer(bf.readLine()); 
  
int i=0
  
while(tag.hasMoreTokens())//存序列数 
  
   a[i]
=Integer.parseInt(tag.nextToken()); 
   i
++
  }
 
  
int k; 
  
while(!(str=bf.readLine()).equals("0")) 
  

   
int p=str.indexOf(' '); 
   k
=Integer.parseInt(str.substring(0,p)); 
   StringBuffer buf
=new StringBuffer(str.substring(p+1,str.length()));   
   key KEY[]; 
   
if(buf.length()<=n) 
   KEY
=new key[n]; 
else if(buf.length()%n==0
    KEY
=new key[buf.length()]; 
   
else KEY=new key[((buf.length()/n)+1)*n]; 
   
int len=buf.length();
   buf.setLength(KEY.length); 
   
for(int j=0;j<k;j++
   

    
for(i=0;i<KEY.length;i++
    

     
if(i>=len&&j==0
     

      KEY[i]
=new key(a[i%n],' ');    
     }
 
     
else 
     KEY[i]
=new key(a[i],buf.charAt(i)); 
    }
 
    
for(i=0;i<KEY.length;i++
    buf.setCharAt(KEY[i].position
-1,KEY[i].data);   
   }
 
   System.out.println(buf);  
  }
 
}
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值