1. 用1~26的二进制值对大写英文字母A~Z进行编码,编码如下表所示:

A

00001

B

00010

C

00011

D

00100

E

00101

F

00110

G

00111

H

01000

I

01001

J

01010

K

01011

L

01100

M

01101

N

01110

O

01111

P

10000

Q

10001

R

10010

S

10011

T

10100

U

10101

V

10110

W

10111

X

11000

Y

11001

Z

11010

    

小明使用该编码对由大写字母组成的明文字符串进行加密,加密算法如下:

l依次将明文中每个字符转换为其对应的二进制编码;

l依次将密钥中每个字符转换为其对应的二进制编码;

l依次取出密钥的每个二进制位与原文的二进制位进行异或运算(若密钥长度不够,则循环重复使用),得到的结果即为密文编码;

l二进制位异或运算原则:11=0,00=0,10=1,01=1

例如,明文:HELLO,密钥:ZHE,则按上述方式进行加密:

明文字符

H

E

L

L

O

密钥字符

Z

H

E

Z

H

明文编码

01000

00101

01100

01100

01111

密钥编码

11010

01000

00101

11010

01000

密文编码

10010

01101

01001

10110

00111

(1) 若原文为“HUI”,密钥为“TZ”,则密文编码为
(2) 实现上述功能的部分 Python程序如下,请在划线处填入合适的代码。

def ctob(c):            # 将一个字符转换为其对应的5位二进制编码

    n =

    ans = ""

    for i in range(5):

        r =

        n = n // 2

        ans = str(r) + ans

    return ans

def xor(s1, s2):        # 将二进制数s1和s2进行异或运算

    ans = ""

    for i in range(len(s1)):

        if :

            ans += "0"

        else:

            ans += "1"

    return ans

s = input("请输入明文(大写字母):")

key = input("请输入密钥(大写字母):")

ans = ""

for i in range(len(s)):

    s1 = ctob(s[i])

    k =

    s2 = ctob(key[k])

    b = xor(s1, s2)

    ans = ans + b

print("密文编码为:", ans)

【考点】
过程与自定义函数; 加密与解密算法; 常用标准函数;
【答案】

您现在未登录,无法查看试题答案与解析。 登录
综合题 困难
能力提升
换一批
1. 某明文字符串仅由大、小写英文字母组成,为实现加密,小明依次对该明文中的每个字符进行如下操作:

①将明文中每个字符转换成其对应的十进制ASCII码值;

②明文的密钥由0-7这8个数字循环产生,如图-1所示;

图-1

③加密过程中,先将每个明文字符的十进制ASCII码值转换成8位二进制数,再将每个字符对应的密钥转换为4位二进制数,最后,将由明文字符的十进制ASCII码值转换成的8位二进制数中的左边4位二进制数和右边4位二进制数,分别和由密钥数字转换成的4位二进制数逐位进行异或运算:1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0。

例如:明文字符串“Programming”中字母“a”用二进制表示是01100001,其对应的密钥是数字5,用二进制表示是0101,加密后结果是00110100,如图-2所示。

图-2

④将每个字符的加密结果按行输出,如图-3所示。请回答下列问题:

(1) 输入字符串“China”,则字符“a”加密后的结果为
(2) 实现上述功能的Python代码段如下,划线处代码为

s=input("输入待加密的原文:  ")

k=0 ; s1="" ; s2=""

print("加密结果为:  ")

for i in range(0,len(s)):

    ch= ord(s[i])

    m=k

    for j in range(0,4):

        t1=str((ch%2+m%2)%2)

        t2=          

        s1=t1+s1 ; s2=t2+s2

        ch=ch//2 ; m=m//2

    print(s2+s1)

    s1="" ; s2=""

   

图-3

(3) 加框处的代码有错误,请修改:
综合题 普通
2. 某字符串加密程序,其功能是:输入一个仅由小写英文字母组成的字符串,输出加密后的密文,加密规则如下所述:

①将明文字符串分成3个字符一组,对每组字符进行②③处理,剩余不足3个的字符不做处理。

②随机产生由26个不重复的小写英文字母组成的密文串,将明文中的每组字符分别替换为密文串中对应的字符,若密文串如表1所示,则明文“abcdefghijkl”替换为“jpgntkwmaery”。

小写字母

a

b

c

d

e

f

g

h

i

j

k

l

m

n

o

p

q

r

s

t

u

v

w

x

y

z

密文串

j

p

g

n

t

k

w

m

a

e

r

y

l

d

c

q

f

i

x

u

h

z

b

o

v

s

表 1

③输入一串数字密钥(由1~9数字组成),密钥中每个数字依次为每组字符向右旋转次数,若密钥长度不足,则重复使用密钥,数字与对应旋转次数见表2。例如,数字密钥为“45”,则将第1组字符向右旋转1次,如“jpg”>“gjp”,将第2组字符向右旋转2次,如“ntk”>“knt”>“tkn”,第3组字符向右旋转1次,第4组字符向右旋转2次,依次类推。

数字

1

2

3

4

5

6

7

8

9

旋转次数

1

2

3

1

2

3

1

2

3

表 2

④将每组处理后的字符串顺序连接, 每组之间用“*”作为间隔符号, 再将分组剩余的字符倒序 连接, 得到密文。

程序运行结果如下:

(1) 若明文为“abc”,随机产生的密文串如图所示,数字密钥为“13”,则密文为
(2) 实现上述功能的Python程序如下,请在划线处填入合适的代码。
def jmdic():      #随机生成由26 个不重复的小写英文字母组成的密文串
#返回密文字符串,代码略
def rotate(array,k):  #旋转
    for i in range(k):
        temp=array[len(array)-1]
        for j in range( ):
            array[j+1]=array[j]
            array[0]=temp
ming=input("请输入明文:")
mkey=input("请输入一串数字密钥: ")
n=len(ming);m=len(mkey)
a=[]
dic=jmdic()
print("26 个小写字母对应的密文串:",dic)
for i in range(n//3):     #对每组字符进行处理
    a.append([])  #append():在列表末尾添加元素
    for j in range(3):
        a[i].append( dic[] )
    keynum=
    k=(keynum-1)%3+1
    rotate(a[i],k)
ans=""
for i in range(n//3): #将每组字符进行连接
    for j in range(3):
       
    ans+="*"*(i+1)
ans=ming[i*3+3:]+ans
print("密文为: ",ans)
(3) 加框处代码有错,请更正。
综合题 困难
3. 小明编写了一个将用户名通过加密生成密码的程序。用户名由小写字母和数字组成,加密的规则是:将用户名分成4位1组,按照密钥k分别做前移,其中字母在a到z之间循环前移,数字在0到9之间循环前移,密钥k的值为1到4之间的不重复随机整数(密钥k可以循环使用)。例如用户名为“abc3dey”,密钥k=[4,3,2,1],则生成的密码为“wya2zbw”。

名称

含义

random.randint(a,b)

随机产生一个[a,b]范围内的实数

random.choice(seq)

从序列seq中随机挑选一个元素

random.shuffle(seq)

将序列seq的所有元素随机排序

(1) 根据题意,若输入用户名为“jqd25k”,密钥k=[1,4,2,3],则生成的密码是
(2) 以下程序实现输入用户名,输出生成的密码,请在划线处填入合适的代码。

import random

k=[1,2,3,4]

random.shuffle(k)

s=list(input("请输入用户名:"))

for i in range(len(s)):

   

    if "0"<=s[i]<="9":

        s[i]=str((int(s[i])-k[t])%10)

    elif  "a"<=s[i]<="z":

        s[i]=chr()

        password="".join(s)   # join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串

print("你的密码为:",password)

(3) 为了提高密码的安全等级,小明对上述代码进行了改进,若生成的密码只有一种类型的字符组成,则从特殊字符“!@#$%&”中随机选取一个字符作为密码的最后一位,例如生成的密码为“abcd”,则最终的密码可能为“abcd@”。python程序如下,请在划线处填入合适的代码。

code="!@#$%&"

#isalpha():用于判断字符串是否全部为字母

#isdigit():用于判断字符串是否全部为数字

if password.isalpha( ) or password.isdigit():

password=

print("你的密码为:",password)

综合题 普通