草庐IT

Python实现希尔加密/解密

AWWWTAAA999 2023-04-20 原文

希尔加密的原理就不多讲了,直接上代码。

定义一个函数:def fun(s, mod1, mod2, key)

s:要加密/解密的字符串

mod1:加密或解密

mod2:A=0或A=1,目前网络上的希尔加密都不是统一的,两种模式得出的结果是不一样的。

key:密钥,转换为矩阵后必须为方阵且可逆

要有传入的参数,key的长度为平方数,否则return

#边界条件    
    if not s:
        return "请输入密文"
    if not key:
        return "请输入密钥"
    l = int(len(key) ** 0.5)
    if l ** 2 != len(key):
        return "请输入有效密钥"
#统一转成小写字母,便于将字符串转成矩阵
s = s.lower()
key = key.lower()
#确定矩阵的长和宽
if len(s) % l == 0:
    s_w = len(s) // l
else:
    s_w = len(s) // l + 1
s_h = l
#初始化矩阵列表
ss = [[0 for _ in range(s_w)] for _ in range(s_h)]
keys = [[0 for _ in range(l)] for _ in range(l)]

对于上述的处理:不论加密还是解密,都是密钥x密文,或密钥的逆x密文,所以密文的高为密钥的边长,宽为:刚好构成一个矩阵,宽为总长度//l,不够则宽为总长度//l + 1。

下面对A=0和A=1分别处理s和key

#注意,矩阵是按列插入字母,如abcd,放到矩阵里是
#ac
#bd
#这里理解就行,不一定像我这样写    
    if mod_2 == "0":
        for i in range(len(s)):
            x = i // l
            y = i % l
            ss[y][x] += (ord(s[i]) - 97)
        for i in range(len(key)):
            x = i // l
            y = i % l
            keys[y][x] += (ord(key[i]) - 97)
    elif mod_2 == "1":
        for i in range(len(s)):
            x = i // l
            y = i % l
            ss[y][x] += (ord(s[i]) - 96)
        for i in range(len(key)):
            x = i // l
            y = i % l
            keys[y][x] += (ord(key[i]) - 96)
    else:
        pass

用numpy处理刚刚的列表,让他们可以进行乘法运算。

ss = np.array(ss)
keys = np.array(keys)

对于密钥不可逆,直接return,如果为解密,则让他逆

    if mod_1 == "d":
        try:
            keys = np.linalg.inv(keys)
        except Exception:
            return "密钥不可逆QAQ"

结果为

res = np.matmul(keys, ss)

最后将结果转为字符串

注意:

将矩阵的结果先模26,否则可能得不出正确结果

​
    for i in range(s_w):
        for j in range(l):
            if mod_2 == "0":
                it += chr((int(res[j][i]) % 26) + 97)
            else:
                it += chr((int(res[j][i])-1 % 26) + 97)

​

下面是完整代码

​
# 希尔加密/解密
def hill_ed(s, mod_1, mod_2, key):
    if not s:
        return "请输入密文"
    if not key:
        return "请输入密钥"
    l = int(len(key) ** 0.5)
    if l ** 2 != len(key):
        return "请输入有效密钥"
    s = s.lower()
    key = key.lower()
    if len(s) % l == 0:
        s_w = len(s) // l
    else:
        s_w = len(s) // l + 1
    s_h = l
    ss = [[0 for _ in range(s_w)] for _ in range(s_h)]
    keys = [[0 for _ in range(l)] for _ in range(l)]
    if mod_2 == "0":
        for i in range(len(s)):
            x = i // l
            y = i % l
            ss[y][x] += (ord(s[i]) - 97)
        for i in range(len(key)):
            x = i // l
            y = i % l
            keys[y][x] += (ord(key[i]) - 97)
    elif mod_2 == "1":
        for i in range(len(s)):
            x = i // l
            y = i % l
            ss[y][x] += (ord(s[i]) - 96)
        for i in range(len(key)):
            x = i // l
            y = i % l
            keys[y][x] += (ord(key[i]) - 96)
    else:
        pass
    ss = np.array(ss)
    keys = np.array(keys)
    if mod_1 == "d":
        try:
            keys = np.linalg.inv(keys)
        except Exception:
            return "密钥不可逆QAQ"
    res = np.matmul(keys, ss)
    it = ""
    for i in range(s_w):
        for j in range(l):
            if mod_2 == "0":
                it += chr((int(res[j][i]) % 26) + 97)
            else:
                it += chr((int(res[j][i])-1 % 26) + 97)
    return it

​

该工具已收录于https://www.awwwtaaa.net,点击右上角工具即可进入。

有关Python实现希尔加密/解密的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  4. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  5. 区块链之加解密算法&数字证书 - 2

    目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非

  6. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  7. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  8. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  9. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  10. ruby - Ruby 中的单 block AES 解密 - 2

    我需要尝试一些AES片段。我有一些密文c和一个keyk。密文已使用AES-CBC加密,并在前面加上IV。不存在填充,纯文本的长度是16的倍数。所以我这样做:aes=OpenSSL::Cipher::Cipher.new("AES-128-CCB")aes.decryptaes.key=kaes.iv=c[0..15]aes.update(c[16..63])+aes.final它工作得很好。现在我需要手动执行CBC模式,所以我需要单个block的“普通”AES解密。我正在尝试这个:aes=OpenSSL::Cipher::Cipher.new("AES-128-ECB")aes.dec

随机推荐