密码学实验_1_Hill加密算法(python 实现)

文章目录

效果

代码

import numpy as np

dic_alpah2index = {}
# 字母 <=> 数字的映射
def intial_alpha_index():
    index_dic = list(range(26))
    np.random.shuffle(index_dic)
    dic0 = {}
    dic1 = {}
    for i in range(26):
        dic0[chr(97+i)] = index_dic[i]
        dic1[index_dic[i]] = chr(97+i)
    
    return [dic0, dic1]

# 创建映射矩阵
def intial_key_matrix(seed=1234,key_matrix_size=(3,3)):
    key_matrix = np.array([[6,24,1],[13,16,10],[20,17,15]])
    key_matrix_inv = np.array([[8,5,10],[21,8,21],[21,12,8]])
    return [key_matrix, key_matrix_inv]

# 加密
def encrypt(m, key_matrix, alpha_index, padding):
    arr_m = trans_str2arr(m, key_matrix.shape[0], alpha_index[0], padding)
    arr_c = (key_matrix @ arr_m) % 26
    return trans_arr2str(arr_c, alpha_index[1])

# 解密
def decrypt(c, key_matrix, alpha_index, padding):
    return encrypt(c, key_matrix, alpha_index, padding)

# 字符串转np.array
def trans_str2arr(s, height, alpha2index, padding):
    lt_s = list(''.join(filter(str.isalpha, s.lower())))
    lt_s.extend([padding]*(0 if len(lt_s)%height==0 else height-len(lt_s)%height))
    func = lambda x:alpha2index[x]
    index_lt = list(map(func,lt_s))
    return np.array(index_lt).reshape(height, int(len(index_lt)/height))

# np.array.float转字符串
def trans_arr2str(arr, index2alpha):
    arr.astype(np.int32)
    arr = arr.reshape(1, arr.shape[0]*arr.shape[1])
    func = lambda x:index2alpha[x]
    return ''.join(list(map(func,arr[0])))

if __name__ == '__main__':
    # 用作填充的字符
    padding = 'x'
    
    # 字母数字映射表
    dic0 = intial_alpha_index()
    
    # 密钥矩阵
    key_matrix = intial_key_matrix()
    
    # 明文
    m = 'you\'re just like an angel'
    
    # 加密
    c = encrypt(m, key_matrix[0], dic0, padding)
    
    # 解密
    m_ = decrypt(c, key_matrix[1], dic0, padding)
    print(f'原始明文:{m}')
    print(f'加密密文:{c}')
    print(f'解密明文:{m_}')
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值