信息安全-古典密码Python实现

一、代换密码

代换密码算法的原理是使用代换法进行加密,就是将明文中的字符用其他字符替代后形成密文。例如,明文字母a、b、c、d,用D、E、F、G做对应替换后形成密文。

1、加法密码(移位密码)

最早的替代密码是由Julius Caesar 发明的Caesar (恺撒)密码,又叫循环移位密码。它的加密过程可以表示为下面的函数:                   

其中,m为明文字母在字母表中的位置数;n为字母表中的字母个数;k为密钥;E(m)为密文字母在字母表中对应的位置数。

2、乘法密码

乘法逆元的定义为:对aZm,存在bZm,使得a×b ≡1 (mod m),则称ba的乘法逆元,其中Zm表示小于 m 的所有非负整数集合。

a存在模m的乘法逆元的充要条件是gcd(a, m)=1。

通常通过扩展欧几里得算法乘法逆元。

扩展欧几里得算法的具体描述如下:

Extended EUCLID(d,m)

(1) (X1,X2,X3)←(1,0,m);(Y1,Y2,Y3)←(1,0,d)。

(2) 若 Y3=0,返回 X3=gcd(d,m);无逆元。

(3) 若 Y3=1,返回 Y3=gcd(d,m);Y2=d-1mod m

(4)Q = [X3 / Y3] 向下取整

(5) (T1,T2,T3)←(X1-QY1, X2 -QY2, X3-QY3)。

(6) (X1,X2,X3)←(Y1,Y2,Y3)。

(7) (Y1,Y2,Y3)←(T1,T2,T3)。

(8) 返回(2)。

乘法密码是通过对字母等间隔抽取以获得密文,其加解密可分别表示如下:

其中,m、c、k 是满足0 < m, k < 25,且 gcd(k,26)=1 的整数。

3、仿射密码

仿射密码的加密是一个线性变换,移位密码和乘法密码的结合,其加解密分别为:

其中:k1、k2 是密钥,是满足 0 < k1, k2<25 和 gcd(k1,26)=1 的整数。

具体实现代码:

加法如下

import tkinter as tk
all_char = "abcdefghijklmnopqrstuvwxyz"
# 加法加密与解密
def jiafa_jiami(char, key):
    result = ""
    for ch in char:
        result += all_char[(ord(ch) - ord('a') + key) % 26]
    return result

def jiafa_jiemi(char, key):
    result = ""
    for ch in char:
        result += all_char[(ord(ch) - ord('a') - key) % 26]
    return result

乘法如下

# 乘法加密解密
def mut_jiami(char, key):
    result = ""
    for ch in char:
        result += all_char[(ord(ch) - ord("a")) * key % 26]
    return result

def mut_jiemi(char, key):
    result = ""
    for ch in char:
        result += all_char[(ord(ch) - ord("a")) * exgcd(key, 26)[0] % 26]  # 取逆元的x值
    return result

仿射如下

# 仿射加密解密
def exgcd(a, b):  # 乘法逆元实现 a:key b:26字母
    if b == 0:
        x = 1
        y = 0
        return x, y
    x1, y1 = exgcd(b, a % b)
    x = y1
    y = x1 - (a // b) * y1
    return x, y

def fang_jiami(char, key1, key2):
    result = ""
    for ch in char:
        result += all_char[((ord(ch) - ord("a")) * key1 + key2) % 26]
    return result

def fang_jiemi(char, key1, key2):
    result = ""
    k1 = exgcd(key1, 26)[0]
    k2 = key2
    for ch in char:
        result += all_char[((ord(ch) - ord("a") - k2) * k1) % 26]
    return result

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值