试设计实现仿射密码和单表代换密码:给出密钥 生成( 随机选择小于26的数、选择和26互素的密钥 ;以及生成0-25上的一个随机置换)、加解密的代码;

生成0-25的随机置换,实现单表代换的加解密

import random
#单表代换加密
def encode(plaintext,key):
    print(plaintext,key)
    for p in plaintext:
        temp=key[ ord(p.upper())-ord("A")]
        print(chr(ord("A")+temp),end="")
#单表代换解密
def decode(cipher,key):
    print(cipher,key)
    for c in cipher:
        cnum= ord(c.upper())-ord("A")
        for i in range(0,26):
            if(key[i]==cnum):
                break
        print((chr(i+ord("A"))),end="")   
#key=random.sample(range(0,26),26)
key= [3, 15, 24, 20, 23, 25, 1, 4, 21, 2, 5, 17, 22, 14, 11, 6, 8, 10, 18, 19, 9, 0, 7, 13, 12, 16]
encode("abcdef",key)
print()
decode("DPYUXZ",key)

测试输出

abcdef [3, 15, 24, 20, 23, 25, 1, 4, 21, 2, 5, 17, 22, 14, 11, 6, 8, 10, 18, 19, 9, 0, 7, 13, 12, 16]
DPYUXZ
DPYUXZ [3, 15, 24, 20, 23, 25, 1, 4, 21, 2, 5, 17, 22, 14, 11, 6, 8, 10, 18, 19, 9, 0, 7, 13, 12, 16]
ABCDEF

随机生成密钥key(a,b),其中gcd(a,26)=1,实现仿射密码的加解密

#key=(a,b)
import random
#欧几里得判断两数最大公因数是不是1
def gcd(a,b):
    if(a<b):
        return gcd(b,a)
    while(a%b!=0):
        temp=b
        b=a%b
        a=temp
    return b
#遍历求逆
def qiuNi(a):
    for i in range(1,26):
         if((a*i-1)%26==0):
            return i
#仿射加密       
def encode(plaintext,a,b):
    print(plaintext,a,b)
    for p in plaintext:
        if(p==" "):
            print(" ",end="")
        pnum=ord(p.upper())-ord("A")
        temp=(pnum*a+b)%26
        print(chr(temp+ord("A")),end="")
#仿射解密
def decode(cipher,a,b):
    print(cipher,a,b)
    a_Ni=qiuNi(a)
    for c in cipher:
        if(c==" "):
            print(" ",end="")
        cnum=ord(c.upper())-ord("A")
        temp=(cnum-b)*a_Ni%26
        print(chr(temp+ord("A")),end="")
        
a=random.randint(1,25)
b=random.randint(1,25)
#plaintext=input()
while  gcd(a,26)!=1:
         a=random.randint(1,25)
#encode(plaintext,a,b) 
encode("hot",9,3)
print()
decode("ozs",9,3)

测试输出

hot 9 3
OZS
ozs 9 3
HOT
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
仿射密码是一种基于学运算的加密方法,它将明文中的每个字符映射为密文中的另一个字符。其中,密钥由两个整a和b构成,满足a和26互质。 密钥生成过程: 1. 选择a和b两个整,满足a和26互质; 2. 生成密钥K=(a,b)。 加密过程: 1. 将明文转化为字序列m1,m2,...,mn,其中mi代表明文中第i个字符对应的字(例如a=0,b=1,c=2); 2. 对于每个mi,计算ci=(a*mi+b)%26,得到密文字序列c1,c2,...,cn; 3. 将密文字序列转化为字符序列c1',c2',...,cn',其中ci'代表密文字ci对应的字符。 解密过程: 1. 将密文转化为字序列c1,c2,...,cn,其中ci代表密文中第i个字符对应的字; 2. 计算a的逆元a'(满足a*a'=1(mod 26)),并计算b'=(-a'*b)(mod 26); 3. 对于每个ci,计算mi=(a'*(ci-b'))%26,得到明文字序列m1,m2,...,mn; 4. 将明文字序列转化为字符序列m1',m2',...,mn',其中mi'代表明文字mi对应的字符。 对于“network”的加密和解密过程: 假设密钥K=(3,7),则加密过程如下: 1. 将“network”转化为字序列14,4,17,10,22,14,2; 2. 对于每个mi,计算ci=(3*mi+7)%26,得到密文字序列5,19,5,3,13,5,23; 3. 将密文字序列转化为字符序列“f t f d n f x”。 解密过程如下: 1. 将密文“f t f d n f x”转化为字序列5,19,5,3,13,5,23; 2. 计算a的逆元a'=9,并计算b'=16; 3. 对于每个ci,计算mi=(9*(ci-16))%26,得到明文字序列14,4,17,10,22,14,2; 4. 将明文字序列转化为字符序列“network”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值