GVic云槿
发布于 2024-10-07 / 156 阅读
2

基于凯撒密码的复杂加密算法V1.0

我们已推出了最新版本Release V2.0,开发文档:http://m.blog.gvicyunjin.cn:8080/archives/ph2

前言

尊敬的各位评委:

您好!首先,非常感谢您能在百忙之中抽出时间来审阅我们的开发文档。由于我们的研究性项目涉及到代码相关内容,以纸质文本形式呈现存在诸多不便之处,所以我们精心撰写了这篇文档。此文档涵盖了项目的各个方面,包括原本纸质册子所承载的内容。所以您完全可以无需再参考纸质册子,直接阅读本篇文章即可全面了解我们的研究性项目。

我们深知自己在项目研究过程中还有许多不足之处,真诚地希望能得到各位评委的宝贵意见和建议。我们也将以谦虚的态度认真听取各位的反馈,不断改进和完善我们的项目。再次感谢各位评委的关注与支持!愿这篇文档能为你们提供清晰、全面的项目信息,让你们更好地了解我们的研究成果和努力方向!

为了评委们能更直观的体验到我们的项目,我们部署了网页版供各位试用,项目地址(点击跳转)高级文本加密与解密

image-nyeu.png

安卓版下载地址(点击跳转):http://m.resource.gvicyunjin.cn:10082/#/?code=ZKEE8

图片1.png

1.收集资料

1.1凯撒加密的原理

  • 定义与起源

    • 凯撒密码是已知最早、最简单且最广为人知的替换加密技术,以罗马共和时期凯撒的名字命名。当年凯撒曾用此方法与其将军们进行联系。

    • 它是一种将明文中的每个字母都在字母表上按照一个固定数目进行偏移后替换成密文的加密方式。

  • 加密方法

    • 通常假设只考虑小写英文字母,将 az 依次对应数值 025。如果设定偏移量(密钥)为 k,那么加密过程的数学公式为 encrypt(word) = (word + k) mod 26。例如,当偏移量 k = 3 时,字母 a 会被替换成 db 会变成 e 等。对于大写字母或其他字符集的处理方式类似,先将其转换为对应的数值后进行偏移计算,再转换回字符。

  • 解密方法

    • 加密和解密互为逆过程,解密的数学公式为 decrypt(word) = (word - k) mod 26。即知道了偏移量 k,就可以对密文进行反向操作得到明文。

  • 安全性分析

    • 凯撒密码非常容易被破解。即使使用唯密文攻击,也可以通过穷举法轻易破解,因为对于使用 26 个字母的英语,其偏移量最多就是 25(偏移量 26 等同于偏移量 0,即明文;偏移量超过 26,等同于偏移量 1 - 25)3

    • 还可以通过频率分析来破解,当密文长度足够大时,分析密文中每个字母出现的频率,并与正常情况下该语言字母表中所有字母的出现频率做比较,从而估计出正确的偏移量3

1.2目前的加密算法

  • 对称加密算法2

    • AES:高级加密标准,是密码学中的一种对称分组密码体制,密钥长度最少支持为 128 位。其优点是加密速度快,但密钥的传递和保存是一个问题,因为参与加密和解密的双方使用的密钥是一样的,这样密钥就很容易泄露。

    • DES:数据加密标准,是 1972 年美国 IBM 公司研制的对称密码体制加密算法。明文按 64 位进行分组,密钥长 64 位,密钥事实上是 56 位参与 DES 运算。该算法对密钥进行保密,公开加密和解密算法,只有知道相同密钥的人才能解读获取的密文数据。

    • 3DES:又称 TripleDES,是 DES 加密算法的一种模式,它使用 2 条不同的 56 位的密钥对数据进行三次加密,比最初的 DES 更为安全。

  • 非对称加密算法

    • RSA:基于一个十分简单的数论事实,即将两个大素数相乘十分容易,但是想要对其乘积进行因式分解极其困难,因此可以将乘积公开作为加密密钥。RSA 加密算法既可以用来做数据加密,也可以用来数字签名。其优点是加密和解密的密钥不一致,公钥是可以公开的,只需保证私钥不被泄露即可,这样密钥的传递变的简单很多,从而降低了被破解的几率,但缺点是加密速度慢。

    • ECC:椭圆曲线加密算法是基于椭圆曲线上离散对数计算问题的加密算法。其数学理论非常深奥和复杂,在工程应用中比较难于实现,但单位安全强度相对较高,在私钥的加密解密速度上比 RSA 更快,存储空间占用更小。

  • 单向散列加密算法

    • MD5:消息摘要算法 5,是一种常用的单向散列加密算法,用的是哈希函数,一般应用于对信息产生信息摘要,防止信息被篡改。无论要加密的字符串有多长,它都会输出长度为 128bits 的一个密文串,通常 16 进制时为 32 个字符2

    • SHA-1:安全哈希算法 1,与 MD5 一样是目前较流行的摘要算法,但比 MD5 的安全性更高。对长度小于 2^64 位的消息,SHA-1 会产生一个 160 位的消息摘要2

    • SHA-256:是 SHA-2 算法中的一种,SSL 行业已将其作为数字签名的散列算法。SHA-2 属于 SHA-1 的升级,SHA-1 是 160 位的哈希值,而 SHA-2 是组合值,有不同的位数,其中最受欢迎的是 256 位(即 SHA-256 算法)2

2.发现问题

2.1 信息时代的背景与加密需求

在当今这个信息时代,我们的生活高度依赖数字化的信息交流和存储。从日常的社交聊天到重要的商业文件传输,从个人隐私数据的保存到企业敏感信息的管理,信息的安全至关重要。随着互联网的普及和技术的飞速发展,信息传播的速度和范围达到了前所未有的程度,但与此同时,信息安全面临的威胁也日益严峻。黑客攻击、数据泄露等事件频繁发生,给个人和社会带来了巨大的损失。因此,有效的加密算法成为保护信息安全的关键手段。

2.2 基于凯撒密码的复杂加密算法在实际应用中的问题

2.2.1.安全性问题

(1)密码破解风险

  • 在日常生活中,我们经常需要保护各种隐私信息,如个人的银行账户密码、社交账号密码等。然而,传统的凯撒密码及其简单变体在面对现代破解技术时显得力不从心。以常见的网络通信为例,当我们使用基于凯撒密码的加密方式来传输一些敏感信息时,攻击者有可能通过分析网络流量中的加密数据模式,尝试不同的字符位移量来破解密码。即使我们采用了两次不同字符集的加密,若攻击者对加密原理有一定了解,并且有足够的时间和计算资源,仍然有可能通过穷举法等方式找到加密的规律,从而获取到原始信息。

  • 例如,在一些社交平台上,用户之间的私密聊天信息如果采用安全性较低的加密方式,就可能被不法分子窃取。他们可以通过分析大量的加密聊天记录,寻找其中的规律,进而破解出聊天内容,侵犯用户的隐私。

(2)字符集选择的困境

  • 在实际应用中,选择合适的字符集对于加密算法的安全性至关重要。一方面,常见的字符集可能更容易被攻击者熟悉和利用。比如,在一些简单的文件加密场景中,如果我们仅仅使用普通的英文字符集进行加密,攻击者可能基于对英文语言和字符频率的了解,通过分析密文中字符的出现频率等特征,推测出加密方式和可能的密钥。另一方面,一些特殊字符集虽然可以增加加密的复杂性,但在不同的设备和软件环境中可能存在兼容性问题。例如,当我们使用一些包含特殊符号或非标准字符的字符集对文档进行加密后,在其他设备上打开该文档时,可能会因为系统不支持这些特殊字符而无法正确显示或解密,导致信息丢失或无法使用。

2.2.2. 效率问题

(1)加密和解密速度

  • 在信息快速传播的时代,效率是一个重要考量因素。以企业的大规模数据处理为例,当需要对大量的文件进行加密存储或传输时,加密和解密的速度直接影响到工作效率。基于凯撒密码改进的算法,在进行两次字符集的加密和解密过程中,需要进行多次字符的查找、替换和转换操作,这会耗费大量的时间。例如,在一个企业的数据库备份过程中,如果采用这种加密算法对大量的数据进行加密,可能会导致备份时间过长,影响业务的正常运行。而且在需要实时获取和使用加密数据的场景中,如在线视频加密传输,缓慢的解密速度会导致视频卡顿,影响用户体验。

(2)资源占用

  • 现代设备的资源虽然不断提升,但在同时运行多个程序和处理大量任务时,资源的合理利用仍然至关重要。我们的加密算法在运行过程中会占用一定的系统资源,尤其是内存资源。当处理大规模的文本数据或长时间运行加密程序时,可能会导致设备内存占用过高,从而影响其他程序的正常运行。例如,在一台内存有限的移动设备上,如果同时运行多个应用程序并且进行大量的加密操作,可能会使设备运行缓慢,甚至出现死机等情况,影响用户对设备的正常使用。

3.确定研究目标

(一)提高加密算法的安全性

  1. 增强抗破解能力

    • 深入研究凯撒密码的加密原理,分析其容易被破解的薄弱环节。通过改进算法,引入更复杂的加密机制,使攻击者难以通过常规的破解方法(如频率分析、穷举法等)获取原始文本信息。具体目标是在现有的基于两次不同字符集加密的基础上,进一步优化加密流程和密钥管理,确保即使面对具有一定技术能力的攻击者,也能有效保护信息的安全。

    • 例如,设计一种动态的密钥生成策略,使得每次加密时使用的密钥都具有随机性和不可预测性,从而增加密码破解的难度。同时,研究如何对加密后的密文进行进一步的混淆处理,使其在数据特征上更难以被分析和识别。

  2. 优化字符集选择策略

    • 探索不同字符集对加密安全性的影响,建立一个字符集评估模型。通过对各种字符集的特性进行分析,包括字符的多样性、分布规律、与常见语言的相关性等,筛选出最适合用于加密的字符集组合。目标是找到既能提高加密安全性,又能在不同环境下具有良好兼容性的字符集方案。

    • 比如,研究一些特殊领域或少数民族语言的字符集,将其与常见的字符集进行组合使用,以增加加密的复杂性。同时,考虑字符集在不同操作系统、软件平台和编码标准下的兼容性,确保加密后的文本能够在各种场景下正确传输和解密。

(二)提升算法效率

  1. 提高加密和解密速度

    • 对现有的加密和解密程序进行性能分析,找出影响速度的关键因素。通过优化算法结构、改进字符查找和替换算法等方式,减少加密和解密过程中的时间消耗。目标是在不降低加密安全性的前提下,显著提高对大规模文本数据的加密和解密速度,以满足实际应用中对高效数据处理的需求。

    • 例如,采用更高效的数据结构(如哈希表)来存储和查找字符集对应的加密映射关系,减少字符查找的时间复杂度。同时,研究并行计算技术在加密算法中的应用,利用多核处理器的优势,并行处理加密和解密任务,提高整体运行效率。

  2. 降低资源占用

    • 分析加密算法在运行过程中对系统资源(如内存、CPU 等)的占用情况,寻找优化资源利用的方法。通过优化代码逻辑、减少不必要的内存分配和数据存储等方式,降低加密和解密操作对系统资源的需求。目标是使加密程序在运行时能够更加高效地利用系统资源,减少对其他程序运行的影响,尤其在资源有限的设备上(如移动设备、嵌入式系统等)也能稳定运行。

    • 比如,对加密过程中产生的中间数据进行及时清理和优化存储,避免内存泄漏和内存占用过高的问题。同时,对算法中的计算密集型部分进行优化,减少 CPU 的运算负担,提高系统的整体性能。

4.编写代码

4.1离线版:

4.1.1.源代码:

import time

def generate_shifts(key, reverse=False):
    # 生成一个偏移序列,基于密钥的ASCII值和其位置
    shifts = [ord(char) + index for index, char in enumerate(key)]
    if reverse:
        shifts.reverse()  # 如果指定倒序,则倒序偏移序列
    return shifts

def encrypt_decrypt_once(text, key, charset, reverse=False, encrypt=True):
    charset_len = len(charset)
    shifts = generate_shifts(key, reverse)
    result = []

    for i, char in enumerate(text):
        if char in charset:
            shift = shifts[i % len(shifts)]
            if not encrypt:
                shift = -shift  # 反向偏移解密
            idx = charset.index(char)
            new_idx = (idx + shift) % charset_len
            result.append(charset[new_idx])
        else:
            result.append(char)  # 保留非字符集字符

    return ''.join(result)

def complex_encrypt(text, key):
    # 第一次加密字符集
    charset1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_+=<>?/"
    # 第二次加密字符集
    charset2 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()<>?{}[]"

    # 第一次加密
    first_encryption = encrypt_decrypt_once(text, key, charset1, reverse=False, encrypt=True)
    # 第二次加密(使用相同密钥,但倒序偏移)
    second_encryption = encrypt_decrypt_once(first_encryption, key, charset2, reverse=True, encrypt=True)

    return second_encryption

def complex_decrypt(encrypted_text, key):
    # 第一次加密字符集
    charset1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_+=<>?/"
    # 第二次加密字符集
    charset2 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()<>?{}[]"

    # 先解密第二次加密(倒序偏移解密)
    first_decryption = encrypt_decrypt_once(encrypted_text, key, charset2, reverse=True, encrypt=False)
    # 再解密第一次加密
    original_text = encrypt_decrypt_once(first_decryption, key, charset1, reverse=False, encrypt=False)

    return original_text

def main():
    action = input("请选择操作:加密(E)还是解密(D)? ").upper()
    if action not in ['E', 'D']:
        print("无效的选择!")
        return
    
    text = input("请输入文本:")
    key = input("请输入密钥:")
    
    if action == 'E':
        encrypted_text = complex_encrypt(text, key)
        print(f"加密结果:{encrypted_text}")
        time.sleep(2)
    else:
        decrypted_text = complex_decrypt(text, key)
        print(f"解密结果:{decrypted_text}")
        time.sleep(2)
while True:
    if __name__ == "__main__":
        main()

4.1.2.代码解释:

一、整体结构

主要包含以下几个函数和一个主循环:

  1. generate_shifts函数:根据给定的密钥生成偏移序列,偏移量基于密钥中字符的 ASCII 值和其在密钥中的位置。如果指定了倒序参数,则可以生成倒序的偏移序列。

  2. encrypt_decrypt_once函数:对给定的文本进行一次加密或解密操作。它接受文本、密钥、字符集、是否倒序以及是否加密等参数。如果字符在给定的字符集中,则根据偏移序列进行加密或解密,否则保留原字符不变。

  3. complex_encrypt函数:进行复杂加密操作,先使用第一个字符集进行一次加密,然后再使用第二个字符集进行第二次加密,且第二次加密使用倒序的偏移序列。

  4. complex_decrypt函数:进行复杂解密操作,先使用第二个字符集进行倒序偏移解密,然后再使用第一个字符集进行解密。

  5. main函数:获取用户输入的操作(加密或解密)、文本和密钥,然后根据用户选择调用相应的加密或解密函数,并输出结果。最后使用time.sleep(2)暂停两秒钟。

  6. 主循环部分:使用while True循环,确保程序可以多次运行,当脚本作为主程序运行时(if __name__ == "__main__":),调用main函数。

二、具体函数分析

  1. generate_shifts函数:

    • 作用:生成用于加密和解密的偏移序列。

    • 参数

      • key:加密或解密使用的密钥,是一个字符串。

      • reverse:一个布尔值,决定是否生成倒序的偏移序列。默认值为False

    • 工作原理:遍历密钥中的每个字符,对于每个字符,将其 ASCII 值与该字符在密钥中的位置相加,得到一个偏移量,将所有的偏移量组成一个列表作为偏移序列返回。如果reverseTrue,则将生成的偏移序列反转。

  2. encrypt_decrypt_once函数:

    • 作用:对给定的文本进行一次加密或解密操作。

    • 参数

      • text:要进行加密或解密的文本,是一个字符串。

      • key:加密或解密使用的密钥,是一个字符串。

      • charset:用于加密和解密的字符集,是一个字符串。

      • reverse:一个布尔值,决定是否使用倒序的偏移序列。默认值为False

      • encrypt:一个布尔值,决定是进行加密还是解密操作。默认值为True,表示加密操作。

    • 工作原理

      • 首先计算字符集的长度charset_len

      • 调用generate_shifts函数生成偏移序列shifts,根据reverse参数决定是否生成倒序的偏移序列。

      • 初始化一个空列表result,用于存储加密或解密后的结果。

      • 遍历输入文本中的每个字符,如果字符在给定的字符集中,则进行加密或解密操作:

        • 根据当前字符在文本中的位置和偏移序列的长度,计算出对应的偏移量shift

        • 如果是解密操作(encryptFalse),则将偏移量取反。

        • 找到当前字符在字符集中的索引idx

        • 计算新的索引new_idx,即当前索引加上偏移量后对字符集长度取余的结果。

        • 将新索引对应的字符添加到result列表中。

      • 如果字符不在给定的字符集中,则直接将该字符添加到result列表中。

      • 最后将result列表中的字符连接成一个字符串并返回。

  3. complex_encrypt函数:

    • 作用:进行复杂加密操作。

    • 参数

      • text:要进行加密的文本,是一个字符串。

      • key:加密使用的密钥,是一个字符串。

    • 工作原理

      • 定义了两个字符集charset1charset2

      • 首先使用charset1和给定的密钥对输入文本进行第一次加密,调用encrypt_decrypt_once函数,将加密结果存储在first_encryption中。

      • 然后使用charset2和相同的密钥对第一次加密的结果进行第二次加密,这次将reverse参数设置为True,表示使用倒序的偏移序列,将加密结果存储在second_encryption中。

      • 最后返回第二次加密的结果。

  4. complex_decrypt函数:

    • 作用:进行复杂解密操作。

    • 参数

      • encrypted_text:要进行解密的加密文本,是一个字符串。

      • key:解密使用的密钥,是一个字符串。

    • 工作原理

      • 定义了与加密时相同的两个字符集charset1charset2

      • 首先使用charset2和给定的密钥对输入的加密文本进行倒序偏移解密,调用encrypt_decrypt_once函数,将解密结果存储在first_decryption中。

      • 然后使用charset1和相同的密钥对第一次解密的结果进行第二次解密,将解密结果存储在original_text中。

      • 最后返回第二次解密的结果,即原始文本。

  5. main函数:

    • 作用:获取用户输入并调用相应的加密或解密函数,输出结果。

    • 工作原理

      • 首先获取用户输入的操作选择,将其转换为大写字母后存储在action变量中。如果用户输入不是'E'(加密)或'D'(解密),则输出错误信息并返回。

      • 接着获取用户输入的文本和密钥。

      • 如果用户选择加密操作(action == 'E'),则调用complex_encrypt函数对输入文本进行加密,并输出加密结果,然后暂停两秒钟。

      • 如果用户选择解密操作(action == 'D'),则调用complex_decrypt函数对输入文本进行解密,并输出解密结果,然后暂停两秒钟。

三、主循环部分

使用while True循环,确保程序可以多次运行。当脚本作为主程序运行时(if __name__ == "__main__":),调用main函数。这样可以不断地让用户输入操作、文本和密钥,进行加密或解密操作。

4.1.3.原理解释:

加密过程

  1. 生成偏移量

    • 密钥中的每个字符都对应一个偏移量,这个偏移量是字符的ASCII值加上它在密钥中的索引位置。例如,密钥 "abc" 将生成偏移量 [97, 99, 101]'a' 的 ASCII 值为 97,加上它的位置 0;'b' 的 ASCII 值为 98,加上它的位置 1,等等)。

    • 每个字符的偏移量将重复使用,循环应用于输入文本。

  2. 第一次加密

    • 使用第一个字符集 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_+=<>?/" 进行字符替换和位移。

    • 每个字符在字符集中找到它的位置,并根据偏移量进行移动,生成新的加密字符。

  3. 第二次加密

    • 对第一次加密结果使用第二个字符集 "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()<>?{}[]" 进行第二轮加密。

    • 第二轮加密时,使用相同的密钥,但偏移量序列被反转,再次对字符进行替换和位移。

  4. 返回加密结果

    • 加密完成后,生成的加密文本是两次字符替换和位移后的结果。

解密过程

  1. 反向解密

    • 解密的过程与加密相反。首先使用第二个字符集进行解密,倒序偏移量来还原文本。

    • 每个字符根据偏移量倒序移动,找到它在字符集中的原始位置。

  2. 第一次解密完成后,再次解密

    • 然后使用第一个字符集再次解密,同样根据原始偏移量来恢复字符。

  3. 返回原始文本

    • 两轮解密完成后,最终恢复出原始文本。

工作流程总结

  • 加密流程

    1. 用户输入待加密的文本和密钥。

    2. 调用 complex_encrypt,生成偏移量,并进行两轮字符集加密。

    3. 返回加密后的文本。

  • 解密流程

    1. 用户输入待解密的文本和密钥。

    2. 调用 complex_decrypt,通过两轮解密恢复原始文本。

    3. 返回解密后的文本。

4.2.在线版

4.2.1.源代码

源代码:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>高级文本加密与解密</title>
  <style>
    /* 基本样式 */
    body {
      font-family: 'Roboto', Arial, sans-serif;
      background: linear-gradient(135deg, #1f1c2c, #928dab);
      color: white;
      margin: 0;
      padding: 0;
      display: flex;
      justify-content: center;
      align-items: center;
      min-height: 100vh;
      overflow: hidden;
    }

    .container {
      width: 90%;
      max-width: 600px;
      background: rgba(0, 0, 0, 0.7);
      border-radius: 15px;
      padding: 20px;
      box-shadow: 0 4px 30px rgba(0, 0, 0, 0.5);
      backdrop-filter: blur(10px);
    }

    h1 {
      text-align: center;
      font-size: 2rem;
      margin-bottom: 20px;
      text-transform: uppercase;
      color: #f0f0f0;
      text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.7);
    }

    textarea, input[type="text"] {
      width: 100%;
      padding: 15px;
      margin: 10px 0;
      border: none;
      border-radius: 8px;
      font-size: 1rem;
      color: #333;
      background: #f1f1f1;
    }

    button {
      width: 48%;
      padding: 15px;
      font-size: 1rem;
      margin: 10px 1%;
      border: none;
      border-radius: 8px;
      background: linear-gradient(135deg, #ff416c, #ff4b2b);
      color: white;
      cursor: pointer;
      transition: transform 0.3s ease, background 0.3s ease;
    }

    button:hover {
      transform: translateY(-3px);
      background: linear-gradient(135deg, #ff4b2b, #ff416c);
    }

    button:active {
      transform: translateY(1px);
    }

    .output {
      margin-top: 20px;
      padding: 15px;
      background: rgba(255, 255, 255, 0.1);
      border-radius: 8px;
      text-align: center;
      font-size: 1rem;
      word-wrap: break-word;
      white-space: pre-wrap;
      box-shadow: inset 0 2px 5px rgba(0, 0, 0, 0.2);
    }

    /* 响应式设计 */
    @media (max-width: 480px) {
      h1 {
        font-size: 1.5rem;
      }

      button {
        font-size: 0.9rem;
        padding: 12px;
      }

      textarea, input[type="text"] {
        font-size: 0.9rem;
        padding: 10px;
      }
    }
  </style>
</head>
<body>
  <div class="container">
    <h1>文本加密与解密</h1>
    <textarea id="inputText" placeholder="输入文本..."></textarea>
    <input type="text" id="key" placeholder="输入密钥...">
    <div>
      <button onclick="encrypt()">加密</button>
      <button onclick="decrypt()">解密</button>
    </div>
    <div class="output" id="outputText">加密或解密结果将显示在这里</div>
  </div>

  <script>
    function generateShifts(key, reverse = false) {
      const shifts = Array.from(key).map((char, index) => char.charCodeAt(0) + index);
      return reverse ? shifts.reverse() : shifts;
    }

    function encryptDecryptOnce(text, key, charset, reverse = false, encrypt = true) {
      const charsetLen = charset.length;
      const shifts = generateShifts(key, reverse);
      let result = '';

      for (let i = 0; i < text.length; i++) {
        const char = text[i];
        const charIndex = charset.indexOf(char);

        if (charIndex !== -1) {
          let shift = shifts[i % shifts.length];
          if (!encrypt) shift = -shift;
          const newIndex = (charIndex + shift + charsetLen) % charsetLen;
          result += charset[newIndex];
        } else {
          result += char;
        }
      }

      return result;
    }

    function complexEncrypt(text, key) {
      const charset1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_+=<>?/";
      const charset2 = charset1.split('').reverse().join('');
      const firstEncryption = encryptDecryptOnce(text, key, charset1, false, true);
      return encryptDecryptOnce(firstEncryption, key, charset2, true, true);
    }

    function complexDecrypt(encryptedText, key) {
      const charset1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_+=<>?/";
      const charset2 = charset1.split('').reverse().join('');
      const firstDecryption = encryptDecryptOnce(encryptedText, key, charset2, true, false);
      return encryptDecryptOnce(firstDecryption, key, charset1, false, false);
    }

    function encrypt() {
      const text = document.getElementById("inputText").value;
      const key = document.getElementById("key").value;
      if (!text || !key) {
        alert("请确保输入文本和密钥!");
        return;
      }
      const encryptedText = complexEncrypt(text, key);
      document.getElementById("outputText").textContent = `加密结果:${encryptedText}`;
    }

    function decrypt() {
      const text = document.getElementById("inputText").value;
      const key = document.getElementById("key").value;
      if (!text || !key) {
        alert("请确保输入文本和密钥!");
        return;
      }
      const decryptedText = complexDecrypt(text, key);
      document.getElementById("outputText").textContent = `解密结果:${decryptedText}`;
    }
  </script>
</body>
</html>

4.2.1代码解释


HTML 结构解释

  • <div class="container">:一个容器,用于包裹整个加密和解密的界面内容。

  • <h1>:标题,显示“文本加密与解密”。

  • <textarea>:用于用户输入需要加密或解密的文本。

  • <input type="text">:用户输入密钥的地方。

  • <button>:加密和解密操作按钮,点击时触发相应的JavaScript函数。

  • <div class="output">:显示加密或解密后的结果。


CSS 样式解释

  • 背景样式:使用渐变背景和玻璃模糊效果(backdrop-filter: blur(10px))来增强视觉层次感。

  • 按钮交互:按钮有悬停和点击时的动画效果(transformbackground 渐变变化)。

  • 响应式设计:通过@media查询优化手机端样式,调整字体大小和间距,使小屏幕上界面更适配。


JavaScript 功能解释

  • generateShifts

    • 根据密钥生成一个偏移量序列,用于字符位置的移动。

    • 支持反转顺序(加密和解密过程有所不同)。

  • encryptDecryptOnce

    • 单次加密/解密操作。

    • 根据字符集计算字符的新位置,通过偏移实现加密或解密。

  • complexEncryptcomplexDecrypt

    • 两层加密和解密。

    • 第一步使用正序字符集,第二步使用倒序字符集。

  • encryptdecrypt

    • 获取用户输入的文本和密钥。

    • 调用相应的加密或解密函数,显示结果到输出区域。


关键特性

  1. 双重加密机制

    • 两次加密过程,每次使用不同的字符集(一个是字符集本身,一个是反转的字符集)。

  2. 动态交互

    • 结果区域根据用户操作实时更新,输出加密或解密的文本。

  3. 跨设备兼容性

    • 自动适配手机和桌面设备,确保良好的用户体验。


5.运行效果

5.1.离线版

5.1.1加密

运行程序,程序询问用户是要加密还是解密

image-udjg.png

输入‘E’,选择加密操作,程序请求用户输入文本,我们假设要加密:Hello World

image-zrzu.png

回车确认后,程序请求用户输入秘钥,我们用'好好学习'为秘钥

image-dbdy.png

回车后得到加密的文本:l}>X( !a-e*

image-wvqu.png

5.1.2.解密

运行程序,程序询问用户是要加密还是解密。输入‘D’,选择解密操作

image.png

输入要解密的密文:l}>X( !a-e*

image-wvqu.png

输入同样的秘钥:好好学习

image-qgxn.png

回车确认,得到最初的文本:Hallo World

image-bgdj.png

5.2在线版

为了评委们能更直观的体验到我们的项目,我们部署了网页版供各位试用,界面如下:

image-nyeu.png

项目地址(点击跳转)高级文本加密与解密

5.3.在线版

图片1.png

下载地址(点击跳转):http://m.resource.gvicyunjin.cn:10082/#/?code=ZKEE8

6.未来规划

目前,我们的程序已成功实现基于凯撒密码的复杂加密算法,能够进行高效的加密与解密操作,运行速度较为理想。在未来,我们有以下规划:

1.首先,考虑使用 C++ 语言重新编写程序,并将其编译为系统底层文件,如此一来,无需过多依赖特定环境即可运行,极大地提高了程序的可移植性。

2.其次,我们将提供更多的接口,以便其他项目能够轻松引入我们的加密算法,实现更广泛的应用。

3.最后,我们计划开发适用于更多系统环境的版本,包括但不限于 Linux、安卓等。后续我们还会使用 C++、C、Java、JS、php、go 等多种语言编写程序,让我们的加密算法能够在更多的语言环境和系统中得到应用。

7.感谢

非常感谢你们抽出宝贵的时间来审阅我们的开发文档。在这个项目的研究过程中,我们团队投入了大量的心血与努力,深入探究、积极创新,充分展现出勇于探索的精神。

我们的程序虽然已取得了一定的成果,但它仅仅是一个起点。我们希望它能起到抛砖引玉的作用,激发更多关于加密算法领域的创新与发展。在未来,我们将继续保持这种探索精神,不断改进和完善这个程序,致力于为信息安全领域做出更大的贡献。

再次感谢各位评委的关注与支持!


开发团队:

组长:郭子路

成员:龚毅夫,张智宸

指导老师:薛仙

博客由郭子路提供

powered by Halo