加密与解密算法 知识点题库

某加密算法对大写字母加密,其加密规则如下:密文的ASCII码值=明文的ASCII码值+密钥,加密后生成的密文仍为大写字母。其密钥是在3*3矩阵中获得,获得密钥的方式为:如字母“A”的ASCII码值为65,将65反复除3,其转换过程如图1所示,得到商为2,密钥在矩阵中所在行;得到余数2,密钥在矩阵中所在列;商或余数为0,密钥在矩阵中最后一行或最后一列。其程序运行界面如图2所示。

  1. (1) 下列对象中没有Caption属性的是(单选,填字母:A .Command1 /B .Form1 /C .Text1和Text2)。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适的代码。

    Dim a(1 To 9) As Integer

    Private Sub Command1_Click()

    Dim column As Integer, row As Integer, t As Integer, tmp As Integer

    Dim s As String, ch As String, result As String

    s = Text1.Text: result = ""

    For i = 1 To Len(s)

      ch = Mid(s, i, 1): t =.

      column = (t - 1) Mod 3 + 1

      Do While t >= 3

        t = t \ 3

      Loop

        row =

        tmp = (Asc(ch) +  - 65) Mod 26 + 65

        result = result + Chr(tmp)

    Next i

    Text2.Text = result

    End Sub

    Private Sub Form_Load()      '用来生成3*3矩阵

    For i = 1 To 9

      a(i) = Int(Rnd * 9) + 1

      s = s + Str(a(i))

      If i Mod 3 = 0 Then

        List1.AddItem s

        s = ""

      End If

    Next i

    End Sub

  3. (3) 程序中加框处代码有错,请改正。
  4. (4) 根据程序的功能并结合图2,字母C加密后的密文为
凯撒密码作为一种最古老的对称加密体制,在古罗马的时候已经很流行,它是加法密码的典型代表。 
以下是凯撒密码的改进版,请将下划线处内容补充完整。

import os  #开始

def NewCaesar(m,n,t):

  z='';i=0

  while i<:

    tmp=

    if tmp in m:

      if ord(t[i])<=90:

        z+=n[m.find(tmp)]

      else:

        z+=n[m.find(tmp)].lower()

    else:

      z+=t[i]

    i+=1

  return z

m='ABCDEFGHIJKLMNOPQRSTUVWXYZ'

n='QWERTYUIOPASDFGHJKLZXCVBNM'

a=input('请输入<明文>a=')

b=NewCaesar(m,n,a)

print('对应的密文为:',b)

c=NewCaesar(n,m,b)

print('解密后明文为:',c)

if :

  print('加密解密成功!')

else:

  print('加密解密失败!')

input("运行完毕,请按回车键退出...")

os._exit(0)

#结束

加法密码又被称为。在加法密码算法中,明文中的所有字母都在字母表上向后或向前按照一个固定数目进行被替换成密文。
李雷收到了朋友发给他的一封奇怪的邮件,里面有段内容是由一些数字和符号组成的,信上说了这段内容是加密后的内容,并给出了具体的加密方法(假定原文的英文字母都是大写的),具体方法如下:

①“A”变为一个1到100内的随机数*27+1,“B”变成一个1到100以内的随机数*27+2,…,“Z”变为一个1到100以内的随机数*27+26;

②每个字母变为数字后会加一个“一”用来分割数字;

③其他空格和标点字符都按原来的表示。

李雷用VB编写了一个解密程序,功能如下:将邮件中密文的内容复制到文本框Text1中,点击“解密”按钮Command1后,程序会解密密文并将解密后的内容显示在文本框Text2中,程序运行界面如图所示。

  1. (1) 根据描述,若密文为“1905-1442-”,则表示的是
  2. (2) 实现上述功能的VB程序如下,请在画线处填入合适的代码。

    Private Sub Command1_Click( )

      Dims As String, yw As String, t As String

      Dim Value As Integer

      s=Text1.Text

      Value=0

      yw=""

      For i=1 To Len(s)

        t=     ①   

        If t>="0" And t<="9" Then

            Value=Value *10+Val(t)

        Else If t="-" Then

            yw=yw+Chr(Asc("A")+Value Mod 27-1)

               ②   

        Else

            yw=yw+t

        End If

      Next i

      Text2. Text=yw

    End Sub

    以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②

某日期加密授权码的生成方法如下:

①授权码由9位字符组成,前8位为日期的密文,最后1位为验证码;

②取日期各位的字符,若该字符第一次出现,则直接取其对应的加密字符,否则取下一个不重复的加密字符;

③求出所有日期字符数值的和,将和除16取余加1得到一位验证码字符,取得的验证码重复时,处理规则与②相同。

加密字符对应表如下:

值(十进制)

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. (1) 若输入的日期为"19970601",则其授权码是
  2. (2) 请在画线处填入合适的代码。

    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

        rq = Textl.Text:sq=""

        For i= 1 To 8

            c=Val(Mid(rq,i,1))

            d=d+c

            sq=   ①   

        Next i

        yz =GetChar(d Mod 16+1)

        Text2.Text = sq + yz

    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 16

          End If

      Loop

    End Function

    以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②

在数据加密过程中,为了防止加密方法外泄,往往使用密钥,只有掌握了密钥才能正确加密、解密。某信息加密VB程序,对输入的明文(由英文字母或数字组成的字符串)进行加密,输出加密后得到的密文。该程序使用的密钥是一个2位十进制数。数据加密方法对明文中的每个字符进行如下处理:

①将该字符的ASCII码加密钥后,转换成对应的8位二进制;

②将对应的8位二进制数进行按位取反(1变0,0变1);

③将最后产生的8位二进制数转换成对应的十六进制数;

④将得到的十六进制数码交换顺序后连接,即为该明文的密文。

例如,明文大写字母“A",输入的密钥数值为25,得到的密文为5A,信息加密过程如图所示。

小李编写了加密算法的VB程序,在文本框Text1中输入明文,单击“加密”按钮Command1。程序对明文数据依次进行加密处理,加密后生成的密文将显示在文本框Text2中。程序运行界面如图所示。

  1. (1) 如果输入的明文为大写字母“F",密钥为16,则生成的密文是
  2. (2) 实现上述功能的VB程序如下,请在画线处填入合适的代码。

    Function btoh(m As String)As String     ‘将4位二进制数转换成对应的十六进制数

      Dim s As Integer, i As Integer

      Dim st As String

      st="0123456789ABCDEF"

      s=0

      For i=1 To 4

          s=s*2 +Val(Mid(m,i,1))

      Next i

         ①   

    End Function

    Private Sub Command1_Click( )

      Dim ans,ch,s,ret,s1,s2 As String

      Dim a,b,c As Integer

      s= Text1.Text

      c= Val(Text2.Text)

      For i = 1 To Len(s)

          ch=Mid(s,i,1)   ‘取出第i个字符存入变量ch

          a=Asc(ch)

          b=a+c

          ret = " "

          For m=1 To 8             ‘完成加密步骤①和步骤②

              n=(b+1)Mod 2

              ret =str(n)+ ret

                 ②   

          Next m

          s1 = btoh(Mid(ret,1,4))    ‘完成加密步骤③和步骤④

          s2 = btoh(Mid(ret,5,4))

          ans=ans +s2+s1

      Next i

      Text3.Text=ans

    End Sub

    以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②

展开字符串,如果在输入的字符串中,含有类似于"c-g"或者“3-7"的字符串,就把它当作一种简写,字符串展开输出时有如下规则:

①如果“一”号右边的字符按照ASCII码的顺序大于左边字符,输出时,用连续递增的字母或数字串替代其中的“一”号,例如"c-g"输出为"cdefg","3-7"输出为"34567"

②如果“一”号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,保留中间的“一”号,例如"a-a"输出时为"a-a","4-1"输出为"4-1"

③如果“一”号右边的字符恰好是左边字符的后续字符,则删除中间的“一”号,例如:"d-e"就输出为"de","3-4"应输出为“3-4"。

某同学按照上述算法,编写了VB程序,功能如下:在文本框Text1中输入简写字符串,单击“展开”按钮Command1后,程序进行字符串展开处理并显示在文本框Text2中。程序运行界面如图所示。

  1. (1) 如果输入的简写字符串为"abs—w—Y1234—5S—4Z",则展开后的字符串为
  2. (2) 实现上述功能的VB程序如下,请在画线处填入合适的代码。

    Private Sub Command1_Click( )

      Dim st1,st2 As String,i,n As Integer

      St1=Text1.Text

      n=Len(s1)

      st2=""

      For i=1 To n

        If pos(st1, i)<> "—" Then

          st2=st2+ pos(st1, i)

        Else

            If pos(st1, i) <pos(st1, 1) Then

              For j=Asc(pos(st1, i-1))+1To Asc(pos(st1, i+ 1))-1

                    ①   

              Next j

            Else

              st2 = st2+"—"

            End If

          End If

      Next i

      Text2. Text = s2

    End Sub

    Function pos(s As String, x As Integer) As String

           ②   

    End Function

    以上程序段运行时,为了实现上述功能,画线处应填入的代码分别为:①;②

在恺撒密码中,每个字母被其后的第(   )个字母替换。
A . 5 B . 4 C . 3 D . 2
凯撒密码是古罗马凯撒大帝用来对军事情报进行加解密的算法,字符串“HUAWEI”经过加密后是“KXDZHL”,那么字符串“KUNMING”采用凯撒加密算法后应该为
某密码的破译步骤如下:

⑴找出文章(以“.”结束)中所有用英文表示的数字(均为小写,数字范围1≤n≤20),单词与数字对应如下:

单词

one

two

three

four

five

six

seven

eight

nine

ten

……

twenty

数字

1

2

3

4

5

6

7

8

9

10

……

20

⑵将这些数字平方后除以100取余,得到两位数如00,04,21,96。

⑶把这些两位数按升序排成一行,组成一个最小的新数,如果新数开头为0,就去除。

⑷步骤(3)找出的最小数即为密码。

小明按照上述方法,设计了一个解密的VB程序,功能如下:单击“解密”按钮Command1,程序依次将文本框Text,1中以空格分隔的每个英文单词取出,若单词属于数字单词,则按解密步骤进行处理,最后在文本框Text2中输出解密结果。

程序运行效果如图所示,请回答下列问题:

  1. (1) 若文章内容为“tom bought two apples and five oranges, which cost ten dollars altogether.”,则破译后的密码应为
  2. (2) 请在划线处填入合适的代码。

    Dim a(1 To 20) As String

    Private Sub Form_Load()

        a(1) = "one": a(2) = "two" 

        '……将所有数字单词按顺序存入数组a中,代码略

    End Sub

    Private Sub Command1_Click()

        Dim s As String, tmp As String

        Dim c as Integer,i As Integer, j As Integer, k As Integer, t As String, ch As As String,code As Long

        Dim b(1 To 100) As String   'b数组存放数字单词处理后得到的两位数

        s = Text1.Text

        c = 0: i = 1: flag = True:t = ""

        Do While i <= Len(s)

            ch = Mid(s, i, 1)

            If ch >= "a" And ch <= "z" Then

                t = t + ch

                flag = False

            ElseIf flag = False Then

                For j = 1 To 20

                    If t = a(j) Then

                        c = c + 1

                        b(c) =

                    End If

                Next j

                t = ""

                flag = True

            End If

            i = i + 1

        Loop

        '将b数组中的两位数按数值大小进行升序排序,代码略

        For i = 1 To c

            t = Val(b(i))

            

        Next i

        Text2.Text = Str(code)

    End Sub

    Function decode(num As Integer) As String

        Dim mo As Integer

        mo = num * num Mod 100

        If mo = 0 Then

            decode = "00"

        ElseIf   Then

            decode = "0" + Trim(Str(mo))

        Else

            decode = Trim(Str(mo))       'Trim为去除字符串两端空格的函数

        End If

    End Function

某种字符加密方法描述如下:

①将明文字符串s中的每个字母字符根据它所在该字符串的位置,往后移动相应的位置,并转化为对应的小写或大写字母(例如:大写字母A往后移动5位变成F,转化成小写字母得到f;小写字母y往后移动8位得到g,转化成大写字母得到G),非字母字符不处理,得到新串ss。

②将①得到的新串ss平均切割成两部分,若ss的长度n为奇数,则第一部分长度为n//2+1,第二部分长度为n//2。再将后面一段字母依次逐个插入前一段字符后边,组成一段密文。

例如“Good.Luck!”生成密文过程如下:

①明文字符串s移位和大小写转换过程:

下标位置

1

2

3

4

5

6

7

8

9

10

原始字符

G

o

o

d

.

L

u

c

k

向后移动i位

H

q

r

h

.

R

b

k

t

大小写转换

h

Q

R

H

.

r

B

K

T

②将①得到的密文ss平均切割成两部分。

例如将上述①得到的字符串中6~10位置的字符依次逐个连接在1~5字符后面,生成密文如图a所示:

图a

  1. (1) 若有一个待加密字符为“Python!”,根据上述加密规则,加密后的密文是
  2. (2) 已知采用上述加密方法得到的密文是“iTCDS!”,反推出明文是

    下标位置

    1

    2

    3

    4

    5

    6

    密文字符

    i

    T

    C

    D

    S

    !

    位置交换

    大小写转换

    向前移动i位

某加密算法的加密部分Python程序段如下:

def encrypt(msg,key):

result = ""

size = len(msg)

for i in range(0,size):

    result = result + msg[(i - key) % size]

return result

msg = input("请输入明文:")

key = int(input("请输入密钥:"))

re =                

print(re)

  1. (1) 请在划线处补充代码。
  2. (2) 如果输入的msg为“cdef”,key为3,那么输出的结果为_
  3. (3) 这种加密机制称为(选填字母:A .置换密码;B .换位密码;C .简单异或密码)。
某种字符的加密方式如下:

①将字符的ASCII码用8位二进制表示;

②将转换出来的8位二进制数整体向右移动一位,将最右边移出的一位放到最左边(高位)进行补充;

③每四位进行分组,分别转换成十六进制数;

④转换后的这两个十六进制字符即为加密字符

现有字符“e”(ASCII码为101D),加密后的字符是(  )。

A . B2 B . A3 C . B1 D . E2
下面是一个加密/解密程序。加密的算法是:将原文中每个字符的ASCII码加上该字符在原文中的位置数(设字符在原文中是第n个字符,则其位置数是n被10除的余数,当余数为0时,其位置数为10。例如,原文字符串为“meet me at sunset”,第一个字符“m”,其位置数为1,而“s”为第12个字符,其位置数是被10除的余数2,其余依次类推)作为密文字符的代码,再将密码字符逆序排列(例如ABCD,逆序排列为DCBA)即为密文。解密算法是加密算法的逆运算,运行效果如图所示:

  1. (1) 如图所示,如果原文中字母“g”后面添加字母“h”,按“加密”按钮后,字母“h”对应的密文为:  。
  2. (2) 实现上述功能的VB程序如下,请在划线处填入合适代码:

    Private Sub Command1_Click( )     '加密

        Dim enc As String, dec As String, i As Integer

        Dim s As String, n As Integer

        dec= Text1. Text

        For i=1 To Len(dec)

            s=

            n=i Mod 10

            If n=0 Then n= 10

            enc=Chr(Asc(s)+n) & enc

        Next i

        Text2. Text= enc

    End Sub

    Private Sub Command2_ Click( )      '解密

        Dim enc As String, dec As String, i As Integer

        Dim n As Integer, s As String, p As Integer

        enc= Text2. Text

        n= Len(enc)

        For i=1 To n .

            s= Mid(enc, i, 1)

            p=

            If p=0 Then

            dec= Chr(Asc(s)-p) & dec

        Next i

        Text1. Text= dec

    End sub

某数据解密方法描述如下:对输入的密文(由英文字母或阿拉伯数字组成的字符串)进行解密,解密后输出明文。解密时对密文中的每个字符进行如下处理:

1)将该字符的ASCII码转换成对应的8位二进制;

2)将对应的8位二进制数进行按位取反(1变0,0变1);

3)将产生的8位二进制数循环左移2次;

4)将最后产生的8位二进制数转换成对应的十六进制数。例如,密文小写字母“d”通过上述解密算法解密后生成的明文是“6E”,信息加密过程如图b所示。

实现上述功能的VB程序如下:在文本框Text1中输入密文,单击“解密”按钮Com-mand1,程序对密文数据依次进行解密处理,在文本框Text2中显示解密后生成的明文。

程序运行界面如图c所示。实现上述功能的VB程序如下,请回答下列问题:

  1. (1) 如果输入密文为小写字母“a”,则解密后得到的明文是
  2. (2) 请在划线处填入合适代码。

    Function jiemi(m As String) As String     '将4位二进制数转换成相应的十六进制数

        Dim k As Integer, i As Integer

        Dim str As String

        str=“0123456789 A BCDEF”

        k=0

        For i=1 To 4

            k=k * 2+Val(Mid(m, i, 1))

        Next i

        

    End Function

    Private Sub Command1_Click()

        Dim ans As String, s As String, ch As String, ret As String

        Dim s1 As String, s2 As String

        Dim i As Integer, m As Integer, asc1 As Integer, n As Integer

        s= Text1. Text

        ans=“”

        For i=1 To Len(s)

            ch= Mid(s,i, 1)

            '取出第i个字符存入变量ch

            asc1= Asc(ch)

            ret =“”

            For m=1 To 8

                '完成解密步骤(1)和步骤(2)

                

                ret=n & ret

                asc1=asc1 \ 2

            Next m

            ret= Mid(ret, 3,6) +Mid(ret, 1, 2)

            '完成解密步骤(3)

            s1 = jiemi(Mid(ret, 1, 4))

            

            ans= ans &s1 &.s2    '将第i个解密后的字符添加到变量ans的末尾

        Next i

        Text2. Text= ans

    End Sub

小明设计一种简易的加密方式,规则如下:

A)在输入的字符串中提取英文字母,作为需要加密的明文(明文字符数必须是3的倍数,不足3位的舍去)

B)将明文ASCII码分成3个字节一组,顺次连接后得到24位二进制数;

C)将得到的24位二进制数字按每6位一组分成4组,每组6个位;

D)在C)中得到的6个位前补上2个0,得到8个字节的二进制数;

E)将D)中得到的8个二进制数分别转换为十进制数;

F)将得到的数字用随机产生的大写字母连接起来,以大写字母结尾

按照上述规则,设计了一个加密VB程序,功能如下:单击“加密”按钮Command1,程序依次将文本框Text1中英文字母提取,将3的倍数个的字母转换为4个数字,并输出在文本框Text2中程序运行效果如下图所示。请回答下列问题:

  1. (1) 在Text1中输入A9B20C@D1E,已知产生的随机字符顺序为英文字母表,则在Text2中显示的是
  2. (2) 请在划线处填入合适代码。

    Private Sub Command1_ Click()

        Const maxn= 100

        Dim s As String, i As Integer, n As Integer

        Dim ch As String, k As Integer, jg As String

        Dim a(1 To maxn) As Integer, b(1 To maxn) As Integer

        s= Text1. Text

        n=0

        For i=1 To Len(s)

        ch= Mid(s, i, 1)

            If  Then

                n=n+1

                a(n)= Asc(ch)

            End If

        Next i

        

        For i=0 To k

            b(i * 4+1)=a(i*3+1)\ 4

            b(i*4+2)=

            b(i*4+3)=(a(i*3+2)Mod16)* 4+a((i- 1) *3+3)\ 64

            b(i*4+4)=a(i*3+3)Mod64

        Next i

        Randomize

        jd= ""

        For i=1 To 4 * (k+1)

            jd=jd+Str(b(i)) +

        Next i

        Text2. Text=jd

    End Sub

    Function pd(c As String) As Boolean

        pd= False

        If c>="A" And c<="Z" Or c>="a" And c<="z" Then:

            pd= True

        End If

    End Function

在所有加密算法中加密密钥与解密密钥都必须相同。
对称密码体制与非对称密码体制的最大区别是(         )
A . 算法的安全性不同 B . 加密密钥与加密密钥是否相同 C . 算法的密钥强度不同 D . 算法实现的效率是否相同
小萌对文本数据进行加密处理,加密算法设计如下:

第一步:换位加密。将明文字符串首尾相接围成一圈,从第一个字符开始计数,计数到m时相应的字符出圈,然后从下一个字符重新计数,直到最后圈中的字符全部出圈。出圈的序列就是该换位加密后的密文。例如明文“abY82?”,密钥m=4,按照上述规则得到的密文为“8baY?2”。

第二步:替代加密。将第一步得到的密文中的大小写字母和数字进行加密,密文字符由正常顺序的字母表或数字表右移m个位置替换得到。例如当m=4时,替换情况如第16题图所示。当m=4时,“8baY?2”经过处理后的密文为“2feC?6”。

  1. (1) 明文字符串“5c-W”经过上述加密方法,密钥m=3处理后的密文字符串为
  2. (2) 小萌根据上述加密策略编写Python程序如下,请在划线处填上合适的代码。

    mingwen=input ("请输入明文:")

    m=int (input("请输入密钥:"))

    q=[’’]*1000

    miwen=""

    n=len (mingwen)

    for i in range(n):

       q[i]=mingwen[i]

    head, tail=0, n

    i, s=1, 0

    while i<=n:

        tmp=q[head]; head+=1

        s+=1

        if :

           miwen+=tmp

           i+=1

           s=0

        else:

         

          tail+=1

    ans=""

    for i in miwen:

       if i>="A" and i<="Z"

         x=chr((ord(i)-65+m)%26+65)    #大写字母A的ASCII码为65

         elif i>="a" and i<="z":

         x=chr((ord(i)-97+m)%26+97)    #小写字母a的ASCII码为97

         elif i>="0" and i<="9":

                           #数字字符0的ASCII码为48

         else:

            x=i

         ans+=x

    print (ans)