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

有一种密文解密方法,其规则是从左到右,先在密文中取出第一个字符,接着隔一位取出一个字符,接下去隔两位取出一个字符,再接下去隔三位符取出一个字符,……,按此规则依次类推,直到密文结束为止。最后将取出的字符依次倒序连接在一起,即为原文。编写解密程序,其功能如下:在文本框Text1中输入密文,单击“解密”命令按钮Command1后,在文本框Text2中输出原文。程序运行界面如图所示,实现上述功能的VB代码如下。

请回答下列问题:

  1. (1) 在文本框Text1中输入密文“ABCDEFGHIJKLMN”,单击“解密”后输出原文为
  2. (2) 在划线处填入合适的代码。

    Private Sub Command1_Click()

       Dim s As String, ch As String, mw As String

       Dim i As Integer, j As Integer

       s = Text1.Text

       i = 1  

       j = 1

       mw = “” 

       Do While i <= Len(s)

           ch =      ①       

           j = j + 1

           mw =      ②     

           i = i + j

       Loop

       Text2.Text =    ③     

    End Sub

     ② ③ 

随着信息技术的发展,公众号:技术那玩意安全性越来越受到人们的重视,为了提升信息的安全性,发送信息时需要对信息进行加密处理,某信息的加密算法如下所示:

①将发送信息中的每一个字符的八位二进制取反

②第1、2、4、8位上插入4个二进制数,若取反后的八位二进制数中1的个数是偶数,插入的4个二进制是1、0、1、0,否则是0、1、0、1

③将12位二进制分为3段(4位一段),每一段的最后一个数字移动到最前面,并将移动后的4位二进制数抓换为十六进制数,转换后的3位十六进制数即是加密后的字符字符"A"的加密过程如下表所示:

原文“A”转换成8位二进制数取反

1 0 1 1 1 1 1 0

插入4位二进制数1、0、1、0

1 0 1 1 0 1 1 0 1 1 1 0

4位1段,最后一个数字移动到最前面

1101 0011 0111

转换为十六进制数,即密文

D37

按照上述规则,小明设计了一个加密的VB程序,程序功能如下:在Text1中输入待加密的字符,单击“加密”按钮,将加密后的字符显示在Text2中,程序运行界面如下图所示,请回答如下问题:

  1. (1) 在Text1中输入“b”,则Text2中显示的内容是  (已知ASC("a")=97)
  2. (2) 请在横线处填入合适的代码。

    Private Sub Command1_Click()

      Dim i As Integer, j As Integer, k As Integer Dim m As Integer, n As Integer, t As Integer Dim count As Integer

      Dim a(1 To 12) As Integer

      Dim mingw As String, miw As String

      mingw = Text1.Text

      For i = 1 To Len(mingw)

        n = Asc(Mid(mingw, i, 1))

        j = 8

        Do While

          a(j) = (n + 1) Mod 2 count = count + a(j)

          n = n \ 2

          j = j - 1 Loop

          For k = 1 To 4

            m = 8 + k - 1

            Do While m >= 2 ^ (k - 1)

              a(m + 1) = a(m)

              m = m –1

            Loop

             

          Next k

          For t = 1 To 3

            miw =

          Next t

          Text2.Text = miw

      Next i

    End Sub

    Function rev_btoh(b(i) As Integer, start As Integer, ending As Integer) As String
      Dim i, sum As Integer

      Const code = "0123456789ABCDEF"

      sum = b(ending)

      For i = start To ending - 1

        sum = sum * 2 + b(i)

      Next i

      rev_btoh = Mid(code, sum + 1, 1)

    End Function

    小明和小红喜欢传纸条,为防同学偷看,约定使用Diffie-Hellman算法来加密,该算法的简化模型如下:二人先约定两个正整数g和n,然后小明私下随机生成一个数x,并计算U=gx Mod n;小红也私下生成一个数y,并计算V=gy Mod n。随后二人交换计算出的U,V。接着小明独自计算出自己的密码mkey=Vx Mod n,小红也独自计算出自己的密码hkey=Uy Mod n,且mkey=hkey。
    事实上,依上述算法,即便同学们知道g,n,U,V的值,也无法计算出二人的密码,必须再取得x或y才可以,而x,y仅他俩各自保留,外人无从知晓。
    已知消息加密的步骤(该步骤可逆)为:①将消息字符串倒序→②将各个字符转换为ASCII码数值→③对各个数值用密码进行异或操作(已知异或运算可逆,即a Xor k=b, b Xor k=a)→④用逗号间隔各异或运算后的结果。
    小红依加密的步骤可逆,编制了一个如下的VB程序,该程序用于解密小明的密文,程序运行界面如图所示。回答下列问题:

Private Sub decrypt_ Click()

    Dim g,n,U,y,hkey As Integer

    Dim mw, xx As string

    Dim a(1 To 100) As Integer

    Dim i, L As Integer, c As String

    '经与小明的协商,小红已获得g,n,U,y的值

    g=2:n=7           '约定两个数g和n的值分别为2和7

    U=2:y=5           '小红随机生成的数y的值为5

    mw = Text1.Text    '小明的密文,由数字和逗号组成

    hkey =     ①    

    L=1

    For i = 1 To Len(mw)

        c = Mid(mw, i, 1)

        If  Then

            a(L)=a(L)*10+Val(c)

        Else

            L=     ②    

        End If

    Next i

    For i=1 To L

        a(i) = a(i) Xor hkey

            ③   

    Next i

    Text2.Text = xx

End Sub

  1. (1) 加框处代码有错,请改正。
  2. (2) 在程序划线处填入合适代码,使程序完整。

     ② ③ 

替代密码是明文中的每个字符根据密钥替代成密文中的另一个字符,替代后的各个字母保持原来的位置。

例:使用凯撒密码对明文”yza”进行加密的过程:“yza”→ 121 122 97  →··· →  98 99 100 →“bcd”

要求:如果明文是大写字母则需要转小写。如果明文是其它字符则不作任何处理。例如:明文为“ABc,z”密钥为3,则结果密文为“def,c”

  1. (1) 如果明文为“EAa:H”密钥为3,则结果密文为
  2. (2) 程序实现如下,请在划线处补充代码。

    def change(code,key):

       #change函数功能:实现要进行加密的字符code由大写字母转小写字母

        #判断转换后的字符code是否为小写字母,若是则进行加密

         

        m=ord(code)

        

        

    return chr(m)

    code=input(“请输入要加密的明文”)

    key=int(input(“请输入密钥”))

    code_new=“”

    for i in code:

        code_new+=change(i,key)

    print(code_new)

某信息仅包含大写字母,字符数不超过n*n(n*n 为密钥矩阵规模,n<10),加密过程如下:

根据上述加密算法编写解密程序。程序在启动时读取密钥矩阵存入数组a 中,在文本框Text1

中输入密文,点击“解密”按钮,在文本框Text2 中显示明文。运行界面如图c 所示。

  1. (1) 在文本框text1 中输入的密文是“8,1,23,2,17,3,33,4,”,则原文是(密钥矩阵按图a 中的密钥矩阵)
  2. (2) 实现上述算法的VB 程序如下,请在划线处填入合适的代码。

    Const n = 3

    Dim a(1 To n * n) As Integer

    Private Sub Command1_Click()

        Dim mw(1 To 2*n*n) As Integer

        '存储密文数据,奇数位存储加密值,偶数位存储该数据在原文中的位置

        Dim yw(1 To n*n) As Integer         '存储解密数据

        Dim k As Integer

        '生成规模为n*n 的密钥矩阵存入数组a中,代码略

        For i = 1 To Len(Text1.Text)

            c = Mid(Text1.Text, i, 1)

            If c <> "," Then

                t = t * 10 + Val(c)

            Else

               

                mw(k) = Val(t): t = 0

            End If

        Next i

        For i = 1 To k\2      '对密文解密,结果存数组yw

            yw(mw(2 * i)) =

        Next i

        s = ""

        For i = 1 To k\2

            s = s + Chr((yw(i)) + 64)

        Next i

        Text2.Text = s

    End Sub

    Function getmm(x As Integer, n As Integer)

        col = (x - 1) Mod n + 1

        row = (x - 1) \ n + 1

        getmm = a((col - 1) * n + row)

        If row Mod 2 = 0 Then getmm =

    End Function

小明编写了一个字符串加密程序,功能如下:输入明文,显示加密后的密文,加密算法如下:

1)若是大写字母,则进行字母替换:英文26个字母按键盘QWERT的顺序排列,从第一行到第三行连接起来再与字母表顺序进行替换,如Q用A来替换,Y用F替换,如下所示:

2)将经过字母替换后的明文每个字符的8位二进制ASCII码(不足8位的左端补0,补足8位)分成两段(左4位一段,右4位为另一段),如字符“A”的二进制ASCII值为01000001,分段后为0100,0001;

3)将高位段(左边4位)转化为十六进制数(如0100转化为4);

4)对低位段(右边4位)执行0→1,1→0后转化为十六进制数(如0001→1110→14→E);

5)依次连接两位十六进制数,得到该字符的密文,如“Q”的密文为“4E”;

6)将每个字符的密文按照明文的顺序依次连接。

程序运行结果如下图所示:

实现上述功能的Python程序如下,请回答下列问题:

  1. (1) 按照加密算法,字符“E”的密文是
  2. (2) 请在划线处填入合适代码。

    def dtb(num):     #十进制转8位二进制,高低4位分别处理

        i=0;result=""

        while i<8:

            if i<4:

                y=1-num % 2

            else:

                y=num % 2

            num=num//2

            result=str(y)+result

            i+=1

        return result

    mw=input("请输入待加密的字符:")

    jm=""

    mm={"Q":"A","W":"B","E":"C","R":"D","T":"E","Y":"F","U":"G","I":"H","O":"I","P":"J","A":"K","S":"L","D":"M","F":"N","G":"O","H":"P","J":"Q","K":"R","L":"S","Z":"T","X":"U","C":"V","V":"W","B":"X","N":"Y","M":"Z"}

    for i in range(len(mw)):

        if "A"<=mw[i]<="Z":

           

        else:

            jm+=mw[i]

    jm1=""

    for i in range(len(jm)):

        

    zf="0123456789ABCDEF";result1="";sum=0

    for i in :

        sum=int(jm1[i])*8+int(jm1[i+1])*4+int(jm1[i+2])*2+int(jm1[i+3])

        result1+=zf[sum]

        sum=0

    print("密文为:",result1)

某密文是由明文加密得到,其加密规则是:①对连续重复的大写字母,仅保留1个;②在去重后的密文中,从首字符开始间隔5个字符取1个,依次连接取出的字符,即为密文。

编写解密程序,功能如下:程序执行时,输入明文后,第一行输出去重后明文,第二行输出密文。

程序运行界面如图所示。

实现上述功能的程序如下,回答下列问题。

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

s2=s1[0]

for i in range(    ①     ):

    c=s1[i]

    if c>="A" and c<="Z":

        if     ②     :

            s2=s2+c

        else:

            s2=s2+c

            mw=""

            i=5

while i<len(s2):

    mw=mw+s2[i]

         ③    

    print("去重后的明文为:",s2)

print("密文为:",mw)

  1. (1) 若明文为“PPP2YX@a&DD2ZZXX#”,则密文为
  2. (2) 在程序①②③划线处填入合适的代码。

     ② ③ 

某加密算法如下:

⑴将明码中每个ASCII字符的8位二进制内码分成两段,如字符“C”的8位二进制内码为01000011,分段后为0100,0011。

⑵将左边4位左移1位,将原第1位数码移到第4位,并转化为十六进制。如0100,移动后为1000,转化为十六进制为8。

⑶将右边4位按步骤(2)算法进行处理。

⑷从左到右连接两位十六进制数,得到该字符的密文。如字符“C”的密文为86。

按此加密算法,字符“A"的密文是(    )

A . 82 B . 41 C . 29 D . 76