高考浙江版高考信息技术 模拟演练 27.docx
- 文档编号:8470382
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:12
- 大小:71.56KB
高考浙江版高考信息技术 模拟演练 27.docx
《高考浙江版高考信息技术 模拟演练 27.docx》由会员分享,可在线阅读,更多相关《高考浙江版高考信息技术 模拟演练 27.docx(12页珍藏版)》请在冰豆网上搜索。
高考浙江版高考信息技术模拟演练27
第4节 加密问题
模拟演练
1.在密钥加密方式中,可以通过自己指定的一个密钥将字符串加密,而解密也必须通过密钥。
本题采用的具体实现方法是将字符串的每个字符转换为ASCII码,顺序加上密钥中的对应数字后转换回ASCII字符得到密文(当密钥位数不够时重新从第一位循环)。
以原文:
Hello,密钥:
123为例,“H”转换为ASCII码后加上密钥的第一个数字1,再转换回ASCII字符,得到“I”;“e”转换为ASCII码,加上密钥的第二个数字2,转换回ASCII得到“g”;“l”则加上密钥的第三个数字3得到“o”;随后原文又出现“1”,但是密钥中的数字已经用完了,则密钥从头开始,加上“1”,得到“m”;“o”则得到“q”,最后产生密文“Igomq”。
具体程序如下,但是有两处加框的代码错误,请改正:
DimcodeAsString,keyAsString
DimiAsInteger,res_codeAsString
Diml_codeAsInteger,l_keyasInteger
PrivateSubCommand1_Click()’加密程序
code=Text1.Text
key=Text2.Text
l_code=Len(code)
l_key=Len(key)
res_code=“”
Fori=1Tol_key ’
(1)
c=Asc(Mid(code,i,1))
k=Val(Mid(key,iModl_key,1))’
(2)
res_code=res_code+Chr(k+c)
Nexti
Text3.Text=res_code
EndSub
PrivateSubCommand2_Click()
’解密程序略
EndSub
答案
(1)l_code
(2)Val(Mid(key,(i-1)Modl_key+1,1))
解析 程序的功能是通过给原文中每一个字符的ASCII值加上一个数字得到密文,而这个数字需要循环地截取密钥来获取,本题的关键是如何做到循环截取密钥。
在程序中,l_code表示原文长度,l_key表示密钥长度,res_code用于存储生成的密文。
接下来开始循环截取原文的每一个字符,每次截取后进行转换,所以循环的范围是1到l_code。
在循环体中,c的值表示截取下来的原文字符的ASCII码,k用于存储转换后的密文字符ASCII码,同时当i的值循环至大于l_key的时候,能够自动回到密钥字符串key的第一个位置重新截取,这里利用了一个Mid函数实现,每次截取的位置为(i-1)Modl_key+1,如此便可循环截取,随后利用res_code变量将两数相加再转换回字符便得到对应的密文字符。
2.小明编写了一个字符串加密程序,功能如下:
在文本框Text1中输入明码,单击“加密”按钮Command1后,在文本框Text2中显示加密后的密文,运行界面如下图所示。
加密算法如下:
1)将明码中每个字符的八位二进制ASCII码(不足八位的左端补0,凑足八位)分成两段(左4位一段,右4位为另一段),如字符“C”的二进制ASCII值为01000011,分段后为0100,0011;
2)将高位段(左边4位)左移一位,并将原第一位数码移到第4位(如0100转化为1000),再转化为十六进制数(如1000化为8);
3)对另一段(右4位)执行2)所示算法,如0011→0110→6;
4)顺次连接两位十六进制数,得到该字符的暗码,如“C”的暗码为“86”;
5)将每个字符的暗码按照明码的顺序连接。
实现上述功能的VB程序如下,请回答下列问题:
(1)按照加密算法,字符“J”的密文是 ;
(2)请在划线处填入合适代码。
PrivateSubCommand1_Click()
DimiAsInteger,jAsInteger
DimmAsInteger,kAsInteger,cAsString
DimxAsInteger,yAsInteger
Dimd(1To8)AsInteger ’数组d存储字符ASCII码二进制从左到右的各位数码
DimmwAsString ’mw存储暗码
mw=“”
Fori=1ToLen(Text1.Text)
c=Mid(Text1.Text,i,1)
Forj=1To8
d(j)=0
Nextj
m=Asc(c)
①
DoWhilem>0
d(k)=mMod2
m=m\2
k=k-1
Loop
x=d
(1):
y=d(5)
Forj=1To3
d(j)=d(j+1)
②
Nextj
d(4)=x:
d(8)=y
mw=mw+btoh(d)
Nexti
Text2.Text=mw
EndSub
’将数组元素中的二进制数转换成对应的十六进制数
Functionbtoh(d()AsInteger)AsString
DimsAsInteger,iAsInteger,str1AsString,chAsString
str1=“0123456789ABCDEF”:
s=0:
ch=“”
Fori=1To8
s=s*2+d(i)
Ifi=4Then
ch=Mid(str1,s+1,1)
s=0
EndIf
Nexti
③
EndFunction
答案
(1)85
(2)①k=8②d(j+4)=d(j+5)③btoh=ch+Mid(str1,s+1,1)
解析
(1)字母J的八位二进制ASCII码为01001010,分别对高4位和低4位移位得到1000和0101,对应暗码为“85”。
(2)第①空所在代码段的作用是把十进制数m转换成二进制数存储在数组d中,第②空所在代码段的作用是分别对高4位和低4位进行移位操作,第③空所在代码段的作用是将数组元素中的二进制数转换成对应的十六进制数,在For循环体内部将高4位对应的暗码存储在ch中,循环结束后,再将低4位对应的暗码拼接起来,即btoh=ch+Mid(str1,s+1,1)。
3.某字符串(字节数为3的倍数)编码规则如下:
(1)将该字符串内码分成3个字节一组,顺次连接后得到24位二进制数;
(2)将得到的24位二进制数字按每6位一组分成4组,每组6个位;
(3)在每组数字前补上两个0,得到4个字节的二进制数;
(4)将(3)中得到的四个二进制数分别转换为十进制数;
(5)将每个十进制数转换为1个加密字符,对应的“密码表”按数值由小到大依次为“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn
opqrstuvwxyz0123456789+/”。
小明按照上述方法,设计了一个字符串(仅包含ASCII字符)加密的VB程序,功能如下:
单击“加密”按钮Command1,程序依次将文本框Text1中每3个字符的ASCII码值作为4个字节转换为四个加密字符,连接这些加密字符,最后在文本框Text2中输出加密结果。
程序运行效果如下图所示。
实现上述功能的VB程序如下:
(1)在上述加密算法步骤(4)中,得到的十进制数最大是 。
(2)实现上述功能的VB程序如下。
请在划线处填入合适代码。
FunctionCode2Char(cAsInteger)AsString
DimsAsString
s=“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”
Code2Char= ①
EndFunction
PrivateSubCommand1_Click()’加密过程
DimnAsInteger,sAsString,iAsInteger,ssAsString
Dima1AsInteger,a2AsInteger,a3AsInteger’存储加密前字符的ASCII码
Dimb1AsInteger,b2AsInteger’分别存储分割、转换后的前两个十进制数
Dimb3AsInteger,b4AsInteger’分别存储分割、转换后的后两个十进制数
s=Text1.Text:
n=Len(s):
ss=“”
Fori=1Ton ②
a1=Asc(Mid(s,i,1))
a2=Asc(Mid(s,i+1,1))
a3=Asc(Mid(s,i+2,1))
b1=a1\4
b2=(a1Mod4)*16+(a2\16)
b3= ③
b4=a3Mod64
ss=ss+Code2Char(b1)+Code2Char(b2)+Code2Char(b3)+Code2Char(b4)
Nexti
Text2.Text=ss
EndSub
答案
(1)63
(2)①Mid(s,c+1,1) ②Step3 ③(a2Mod16)*4+(a3\64)
解析
(1)步骤(4)中得到的十进制数对应的二进制数的高2位都是0,则最大值为00111111B,转换成十进制数为63。
(2)十进制数c最小值是0,而密码表字符串s的最小下标是1,故Code2Char=Mid(s,c+1,1)。
明文字符串中每个字符占1个字节,每3个字符为一组,依次存储在变量a1,a2,a3中,故循环变量i每次递增3。
本题的难点在于理解分割二进制数的方法,我们把题目效果图中的第一组明文的转换过程分析如下图:
看懂变量a1,a2,a3和b1,b2,b3,b4的转换关系,再模仿程序中已知的代码,应该能填出第③空。
4.某日期加密授权码生成方法描述如下:
(1)授权码由10位字符组成,前8位为日期的密文,后2位为验证码;
(2)取日期的第1位字符,若该字符第一次出现,则直接取其对应加密字符,否则取下一个不重复的加密字符。
按此操作,依次取出该日期余下各位对应的加密字符;
(3)求出所有日期字符数值的和,将和除16取余加1得到一位验证码字符;若和不小于16,则将和除16取整加1得到另一位验证码字符,否则另一位验证码字符为“X”。
取出验证码重复时,处理规则与
(2)相同。
加密(验证码)字符对应表如下:
值
(十进制)
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
加密
(验证码)
字符
K
n
G
j
L
t
W
b
O
a
P
H
Z
q
Y
c
小明设计了一个生成8位日期(YYYYMMDD格式)授权码的VB程序。
程序功能如下:
在文本框Text1中输入一个8位有效日期,单击“生成授权码”按钮Command1,在标签Label2中显示出该日期的授权码。
运行效果如图所示。
实现上述功能的VB程序段如下:
(1)请在划线处填入合适代码:
Dimf(0To15)AsInteger
ConstCode=“KnGjLtWbOaPHZqYc”
PrivateSubCommand1_Click()
DimrqAsString,sqAsString
DimcAsInteger,iAsInteger,dAsInteger
Fori=0To15
f(i)=0
Nexti
rq=Text1.Text
sq=“”:
d=0
IfLen(rq)<>8Then
Label2.Caption=“请输入8位日期!
”
Else
Fori=1To8
c=Val(Mid(rq,i,1))
d=d+c
sq= ① +sq
Nexti
Ifd>=16Then
yz=GetChar(dMod16+1)+GetChar(d\16+1)
Else
yz=GetChar(dMod16+1)+“X”
EndIf
Label2.Caption=sq+yz
EndIf
EndSub
’获取不重复的加密字符
FunctionGetChar(xAsInteger)AsString
DimflagAsBoolean
flag=False
DoWhileflag=False
f(x)=f(x)+1
Iff(x)=1Then
②
f(x)=f(x)+1
flag=True
Else
x=(x+1)Mod10
EndIf
Loop
EndFunction
(2)若输入的日期是“20170818”,则该授权码的验证码字符是 。
答案
(1)①GetChar(c)②GetChar=Mid(Code,x+1,1)
(2)aL0jbn
KGZt
解析
(1)本题算法思路比较清晰,根据题目说明,结合样例,不难得出代码。
需要注意的是前8位日期对应的加密字符是逆序拼接,后2位验证码是顺序拼接的,对应代码为sq=GetChar(c)+sq和Label2.Caption=sq+yz。
GetChar(xAsInteger)函数用来获取不重复的加密字符,程序用数组f来标记加密字符未被使用过,开始令数组f的所有元素值均为0,运行函数时令f(x)=f(x)+1,再判断f(x)是否等于1,若等于1,则表示该加密字符未被使用过,返回该加密字符(注意x的最小值为0,而加密字符串的下标从1开始,故GetChar=Mid(Code,x+1,1));若f(x)>1,则表示该加密字符已经被使用过了,x要后移一位,为防止x越界,可以对16求余数,即x=(x+1)Mod16。
(2)输入日期“20170818”对应加密字符串为“aL0jbnKG”,数字和为27,GetChar(27Mod16+1)为“Z”,GetChar(d\16+1)为“t”。
5.下面是一种加密解密的方法。
当输入一串进制数字,用空格分离时,每个进制数字的数值与字母A…Z成一一对应关系。
小明只要将这串数字的数值求出,然后将数字值转换成相应的字母即破解密码得到明文。
若输入的进制数值超出1~26范围,则当成非法数值。
表中数值100、153属于非法数值,用字符“*”表示,在解密过程中非法字符不予处理。
密文
1100100
11
1000
1001
1110
1
10011001
对应数值
100
3
8
9
14
1
153
明文
*
C
H
I
N
A
*
(1)根据题意,若密文为16进制的“68 17 9 E 1F”,则其明文为 。
(2)实现上述功能的VB程序如下,请在划线处填上合适的代码。
PrivateSubCommand1_Click()’密文解密过程
DimsAsString,ywAsString
DimnAsInteger,iAsInteger,kAsInteger,valueAsInteger
DimflagAsBoolean
s=Text1.Text
yw=“”
flag=True
k=Val(Text4.Text)’k为密文的进制
n=Len(s)
value=0
Fori=1Ton
t=Mid(s,i,1)
IfflagThen
If(t<>“”)Then
Ift>=“0”Andt<=“9” Then
value= ①
ElseIft>=“A”Andt<=“F”Then
value=value*k+Asc(t)-Asc(“A”)+10
EndIf
Else
flag=False
Ifvalue<=26Then
yw= ②
Else
yw=yw+“*”
EndIf
value=0
EndIf
Else
Ift>=“0”Andt<=“9” Then
value=Asc(t)-Asc(“0”)
flag=True
ElseIft>=“A”Andt<=“F”Then
value=Asc(t)-Asc(“A”)+10
flag=True
EndIf
EndIf
Nexti
IfflagThen
Ifvalue<=26Then
yw=yw+Chr(Asc(“A”)+value-1)
Else
yw=yw+“*”
EndIf
EndIf
Text2.Text=yw
EndSub
PrivateSubCommand2_Click()’密文加密过程
DimsAsString,ywAsString,tAsString,keyAsString
DimiAsInteger,nAsInteger,kAsInteger,mAsInteger
key=“0123456789ABCDEF”
s=Text2.Text
n=Len(s)
yw=“”
k=Val(Text4.Text)
Fori=1Ton
t=Mid(s,i,1)
m= ③
Ifm>=1Andm<=26Then
t=“”
DoWhilem>0
t=Mid(key,(mModk+1),1)+t
④
Loop
mw=mw+t+“”
EndIf
Nexti
Text3.Text=mw
EndSub
答案
(1)*WIN*
(2)①value*k+Asc(t)-Asc(“0”) ②yw+Chr(Asc(“A”)+value-1) ③Asc(t)-Asc(“A”)+1 ④m=m\k
解析
(1)
密文
68
17
9
E
1F
对应数值
104
23
9
14
31
明文
*
W
I
N
*
(2)①该空考查进制的转换。
这种情况考虑了转换的是数字,并且要把一串没空格的数字转成10进制数,所以此空为value*k+Asc(t)-Asc(“0”)。
②该空的作用是将value的值转换为相应的字母,因为最后要输出yw的值,因此该空为yw+Chr(Asc(“A”)+value-1)。
③m用来下文检测提取出来的“t”是不是对应的字母,即将“t”转换为k进制的数字或字母,所以该空填Asc(t)-Asc(“A”)+1。
④该空考查将k进制转换为二进制,所以该空为“m=m\k”。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高考浙江版高考信息技术 模拟演练 27 高考 浙江 信息技术 模拟 演练