第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”。 具体程序如下,但是有两处加框的代码错误,请改正: Dim code As String, key As String Dim i As Integer, res_code As String Dim l_code As Integer, l_key as Integer Private Sub Command1_Click( )’加密程序 code = Text1.Text key = Text2.Text l_code =Len(code) l_key =Len(key) res_code = “”
For i = 1 Tol_key ’(1) c =Asc(Mid(code, i, 1))
k =Val(Mid(key,i Mod l_key,1) )’(2) res_code = res_code +Chr(k + c) Next i
Text3.Text = res_code End Sub
高考加油,高考加油,高考加油
高考复习参考资料
Private Sub Command2_Click( ) ’解密程序略 End Sub
答案 (1) l_code (2)Val(Mid(key,(i-1) Mod l_key+1,1) )
解析 程序的功能是通过给原文中每一个字符的ASCII值加上一个数字得到密文,而这个数字需要循环地截取密钥来获取,本题的关键是如何做到循环截取密钥。在程序中,l_code表示原文长度,l_key表示密钥长度,res_code用于存储生成的密文。接下来开始循环截取原文的每一个字符,每次截取后进行转换,所以循环的范围是1到l_code。在循环体中,c的值表示截取下来的原文字符的ASCII码,k用于存储转换后的密文字符ASCII码,同时当i的值循环至大于l_key的时候,能够自动回到密钥字符串key的第一个位置重新截取,这里利用了一个Mid函数实现,每次截取的位置为(i-1) Mod l_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)请在划线处填入合适代码。 Private Sub Command1_Click() Dim i As Integer, j As Integer
Dim m As Integer, k As Integer, c As String Dim x As Integer, y As Integer
Dim d(1 To 8) As Integer ’数组d存储字符ASCII码二进制从左到右的各位数码
Dim mw As String ’mw 存储暗码 mw =“”
For i = 1 To Len(Text1.Text) c = Mid(Text1.Text,i,1) For j = 1 To 8 d(j) = 0 Next j m = Asc(c) ① Do While m > 0 d(k) = m Mod 2 m = m \\ 2 k =k-1 Loop
x = d(1) :y = d(5) For j = 1 To 3 d(j) =d(j+1) ② Next j
d(4) = x:d(8) = y
高考加油,高考加油,高考加油
高考复习参考资料
mw = mw + btoh(d) Next i
Text2.Text = mw End Sub
’将数组元素中的二进制数转换成对应的十六进制数 Function btoh(d() As Integer) As String
Dim s As Integer, i As Integer, str1 As String, ch As String str1 = “0123456789ABCDEF”: s = 0: ch =“” For i = 1 To 8 s = s * 2 + d(i) If i = 4 Then
ch = Mid(str1,s+1,1) s = 0 End If Next i ③ End Function
答案 (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程序如下。请在划线处填入合适代码。 Function Code2Char(c As Integer) As String Dim s As String
s=“ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”
Code2Char= ① End Function
Private Sub Command1_Click() ’加密过程
Dim n As Integer, s As String, i As Integer, ss As String
Dim a1 As Integer,a2 As Integer,a3 As Integer ’存储加密前字符的ASCII码
Dim b1 As Integer,b2 As Integer’分别存储分割、转换后的前两个十进制数 Dim b3 As Integer,b4 As Integer’分别存储分割、转换后的后两个十进制数 s = Text1.Text : n= Len(s) : ss =“” For i = 1 To n ② a1 = Asc(Mid(s, i, 1))
高考加油,高考加油,高考加油
高考复习参考资料
a2 = Asc(Mid(s, i+1,1)) a3 = Asc(Mid(s, i+2,1)) b1 = a1 \\ 4
b2 = (a1 Mod 4) * 16 + (a2 \\ 16) b3 = ③ b4 = a3 Mod 64
ss = ss + Code2Char(b1) + Code2Char(b2) + Code2Char(b3) + Code2Char(b4) Next i
Text2.Text = ss End Sub
答案 (1) 63 (2)①Mid(s,c+1,1) ②Step 3 ③ (a2 Mod 16) * 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)相同。加密(验证码)字符对应表如下:
值 (十进制) 加密 (验证码) 字符
小明设计了一个生成8位日期(YYYYMMDD格式)授权码的VB程序。程序功能如下:在文本框Text1中输入一个8位有效日期,单击“生成授权码”按钮Command1,在标签Label2中显示出该日期的授权码。运行效果如图所示。实现上述功能的VB程序段如下:
K n G j L t W b O a P H Z q Y c 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
(1)请在划线处填入合适代码: Dim f(0 To 15) As Integer Const Code = “KnGjLtWbOaPHZqYc” Private Sub Command1_Click() Dim rq As String, sq As String
Dim c As Integer, i As Integer, d As Integer For i = 0 To 15 f(i) = 0 Next i
rq = Text1.Text sq=“”:d = 0 If Len(rq) <> 8 Then
高考加油,高考加油,高考加油
高考复习参考资料
Label2.Caption =“请输入 8 位日期!” Else
For i = 1 To 8
c = Val(Mid(rq, i, 1)) d = d + c
sq = ① +sq Next i
If d >= 16 Then
yz = GetChar(d Mod 16 + 1) + GetChar(d\\16 + 1) Else
yz = GetChar(d Mod 16 + 1) + “X” End If
Label2.Caption = sq + yz End If End Sub
’获取不重复的加密字符
Function GetChar(x As Integer) As String Dim flag As Boolean flag = False
Do While flag = False f(x) = f(x) + 1 If f(x) = 1 Then ② f(x) = f(x) + 1 flag = True Else
x = (x + 1) Mod 10 End If Loop
高考加油,高考加油,高考加油
高考复习参考资料
End Function
(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(x As Integer)函数用来获取不重复的加密字符,程序用数组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)Mod 16。(2)输入日期“20170818”对应加密字符串为“aL0jbnKG”,数字和为27,GetChar(27 Mod 16+1)为“Z”,GetChar(d\\16+1)为“t”。
5.下面是一种加密解密的方法。当输入一串进制数字,用空格分离时,每个进制数字的数值与字母A…Z成一一对应关系。小明只要将这串数字的数值求出,然后将数字值转换成相应的字母即破解密码得到明文。若输入的进制数值超出1~26范围,则当成非法数值。表中数值100、153属于非法数值,用字符“*”表示,在解密过程中非法字符不予处理。
密文 对应数值 明文 1100100 100 * 11 3 C 1000 8 H
1001 1110 1 9 I 14 N 1 A 10011001 153 * 高考加油,高考加油,高考加油
高考复习参考资料
(1)根据题意,若密文为16进制的“68 17 9 E 1F ”,则其明文为 。
(2)实现上述功能的VB程序如下,请在划线处填上合适的代码。 Private Sub Command1_Click() ’密文解密过程 Dim s As String, yw As String
Dim n As Integer,i As Integer,k As Integer,value As Integer Dim flag As Boolean s =Text1.Text yw =“” flag = True
k = Val(Text4.Text) ’k为密文的进制 n = Len(s) value = 0 For i = 1 To n t = Mid(s, i, 1) If flag Then
If (t <> “”)Then
If t >=“0” And t <= “9” Then value = ①
Else If t >=“A” And t <= “F” Then value = value*k+Asc(t)-Asc(“A”) + 10 End If Else
高考加油,高考加油,高考加油
高考复习参考资料
flag = False If value <=26 Then yw = ② Else
yw = yw + “*” End If value = 0 End If Else
If t >=“0” And t <=“9” Then value = Asc(t) - Asc(“0”) flag = True
Else If t >= “A” And t <= “F” Then value = Asc(t) - Asc(“A”)+ 10 flag = True End If End If Next i If flag Then
If value < = 26 Then
yw = yw + Chr(Asc(“A”) + value - 1) Else
yw = yw + “*” End If End If
Text2.Text = yw End Sub
Private Sub Command2_Click()’密文加密过程
Dim s As String, yw As String, t As String, key As String
高考加油,高考加油,高考加油
高考复习参考资料
Dim i As Integer, n As Integer, k As Integer, m As Integer key = “0123456789ABCDEF” s = Text2.Text n = Len(s) yw = “”
k = Val(Text4.Text) For i = 1 To n t = Mid(s, i, 1) m = ③
If m >= 1 And m <= 26 Then t =“” Do While m > 0
t = Mid(key,(m Mod k + 1) , 1) + t ④ Loop
mw = mw + t + “ ” End If Next i
Text3.Text = mw End Sub 答案 (1)*WIN*
(2)①value*k+Asc(t)-Asc(“0”)③Asc(t)-Asc(“A”)+1 ④m=m\\k 解析 (1)
密文 68 17 9 E 14 N 1F 31 *
②yw+Chr(Asc(“A”)+value-1)
对应数值 104 23 9 明文 * W I (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”。
高考加油,高考加油,高考加油
因篇幅问题不能全部显示,请点此查看更多更全内容