7-3 解密

目录

7-3 解密

输入格式:

输出格式:

输入样例:

输出样例:

AC代码


7-3 解密

加密技术是把消息(明文)转换为一种伪装形式( 密文)进行秘密通信的方法。将明文转化为密文称为加密;将密文转换为明文称为解密。 某一种简单的加密方法要求发送方和接收方都共同认可一个加密关键字k,它是一个正整数。

该加密方法使用四个数组:plaintext和ciphertext是字符数组,plaincode和ciphercode是整数数组。所有数组的长度为n,其中n是要加密的消息的长度,数组下标从 0 到n-1。消息仅包含小写字母、句点和下划线。

要加密的消息存储在数组plaintext中。给定一个关键字 k,把plaintext的字母转换成数字存放到数组plaincode中,转换规则是:'_'=0,'a'=1,'b'=2,...,'z'= 26,'.'=27。接着,将存放在plaincode的数字按下列公式转换成加密的代码存放在ciphercode中,i从0到n-1:

ciphercode[i] = ( plaincode [ k* i mod n ] - i ) %28。

你的任务是实现消息的解密,即给定关键字k,将密文恢复至原来的明文。例如,关键字是5,密文是'cs.',程序必须输出明文'cat'。

输入格式:

多组测试数据。每组测试数据占一行,前面是关键字k,用空格分隔,后面是密文,密文长度为1~70。k是正整数,不超过300。 k=0时结束输入。

输出格式:

对每一组测试数据,在一行上输出解密的明文。

输入样例:

5 cs.
101 thqqxw.lui.qswer
3 b_ylxmhzjsys.virpbkr
0

输出样例:

cat
this_is_a_secret
beware._dogs_barking

AC代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int k;
	while(cin >> k)
	{
		if(!k)
		{
			break;
		}
		string s;
		cin >> s;
		
		int n=s.size();
		int p[100];
        //将字符串编号
		for(int i=0;i<n;i++)
		{
			if(s[i]=='_')
				p[i]=0;
			else if(s[i]=='.')
				p[i]=27;
			else
				p[i]=(s[i]-96);
				
			//cout << p[i] << endl;
		}
		
		int c[100];
        //规律:(k*i)%n:是解码对应的坐标, (p[i]+i)%28:解码
		for(int i=0;i<n;i++)
		{
			c[(k*i)%n]=(p[i]+i)%28;
		}

		for(int i=0;i<n;i++)
		{
			if(c[i]==0)
				cout << "_" ;
			else if(c[i]==27)
				cout << ".";
			else
				cout << char(c[i]+96);
		}
			cout << endl;
	}
 } 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值