《Python加解密小实验:探索数据加密与解密的世界》

铺垫(1)-源码

import hashlib
source = "你好"
# print(hashlib.md5(source.encode()).hexdigest())

# 文件加解密
with open('../文件引用/index.png', 'rb') as file:
    data = file.read()
# print(hashlib.md5(data).hexdigest())

# SHA也是摘要算法
# print(hashlib.sha256(source.encode()).hexdigest())

铺垫(1)-源码解析

这段代码主要演示了如何使用Python的hashlib库来计算字符串和文件的哈希值

代码解析

  1. 导入库:

import hashlib

这行代码导入了Python的hashlib库,该库提供了多种哈希算法,如MD5, SHA1, SHA256等。 2. 字符串哈希:

source = "你好"
# print(hashlib.md5(source.encode()).hexdigest())

这里定义了一个字符串source,其值为"你好"。接下来的注释代码展示了如何计算该字符串的MD5哈希值。

* `source.encode()`: 将字符串转换为字节串,因为`hashlib`的哈希函数需要字节串作为输入。
* `hashlib.md5(...)`: 创建一个MD5哈希对象。
* `.hexdigest()`: 计算哈希值并返回其十六进制表示。
  1. 文件哈希:

with open('../文件引用/index.png', 'rb') as file:
    data = file.read()
# print(hashlib.md5(data).hexdigest())

这部分代码打开了一个名为index.png的文件,并读取了其内容到变量data中。接下来的注释代码展示了如何计算该文件内容的MD5哈希值。

* `'rb'`: 以二进制模式打开文件,确保文件内容被正确读取。
  1. SHA256哈希:

# SHA也是摘要算法
# print(hashlib.sha256(source.encode()).hexdigest())

这部分代码展示了如何使用SHA256算法计算字符串"你好"的哈希值。与MD5类似,但SHA256提供了更高的安全性。

注意事项

  • 哈希算法是单向的,这意味着你不能从哈希值中恢复原始数据。

  • 不同的哈希算法有不同的输出长度和安全性。例如,MD5的输出长度为128位,而SHA256的输出长度为256位。

  • 哈希算法通常用于验证数据的完整性,而不是加密数据。因为哈希算法是单向的,所以它们不适合用于需要解密数据的场景。

总结

这段代码主要演示了如何使用Python的hashlib库来计算字符串和文件的哈希值。哈希算法是单向的,主要用于验证数据的完整性。

铺垫(2)-源码

source = 'DSFASsafdasf42343'  # dsfasSAFDASF53454
result = ''
for i in source:
    if ord(i) in range(65, 91):
        temp = chr(ord(i) + 32)
    elif ord(i) in range(97, 123):
        temp = chr(ord(i) - 32)
    elif ord(i) in range(48, 58):
        temp = chr(ord(i) + 1)
        # temp = chr(ord()-1)  # 解密算法
    result += temp
# print(result)

铺垫(2)-源码解析

这段代码的主要目的是对一个字符串source进行简单的加密处理

  1. 初始化:

    • source 是一个给定的字符串,其值为 'DSFASsafdasf42343'。

    • result 是一个空字符串,用于存储加密后的结果。

  2. 遍历字符串: 使用for循环遍历source中的每一个字符i

  3. 条件判断与加密:

    • 如果字符i的ASCII值在65到90之间(即大写字母A-Z),则将其转换为对应的小写字母。这是通过获取字符i的ASCII值,加32(因为小写字母比对应的大写字母的ASCII值大32),然后再转换回字符来实现的。

    • 如果字符i的ASCII值在97到122之间(即小写字母a-z),则将其转换为对应的大写字母。这是通过获取字符i的ASCII值,减32,然后再转换回字符来实现的。

    • 如果字符i的ASCII值在48到57之间(即数字0-9),则将其转换为下一个数字。例如,'9'会变成':'(这不是一个数字,而是一个冒号字符,因为ASCII值57+1=58,对应的字符是':')。这里有一个注释掉的行# temp = chr(ord()-1) # 解密算法,这行代码如果取消注释,会将数字减1而不是加1,从而实现解密。

  4. 拼接结果: 将转换后的字符temp添加到result字符串中。

  5. 输出: 最后,打印加密后的字符串result。但需要注意的是,代码中最后一行print(result)被注释掉了,所以如果直接运行这段代码,不会有任何输出。要看到结果,需要取消这一行的注释。

注意:这段代码并不是一个真正的加密算法,因为它很容易被破解。例如,大写字母总是转换为小写字母,小写字母总是转换为大写字母,数字总是增加1(或减少1)。这种转换模式是固定的,所以很容易通过观察和分析来破解。

如果想要一个真正的加密算法,建议使用像AES、RSA这样的成熟加密算法,这些算法提供了更高的安全性。

铺垫(3)-源码

import string

upper_list = string.ascii_uppercase
lower_list = string.ascii_lowercase

# 凯撒加密右移5位
upper_dest = ''
for i in upper_list:
    index = (upper_list.index(i) + 5) % len(upper_list)
    print(upper_list[index], end=' ')
    upper_dest += upper_list[index]
print()
# 凯撒加密右移5位
for i in upper_dest:
    index = upper_dest.index(i) - 5
    print(upper_dest[index], end=' ')

铺垫(3)-源码解析

这段代码实现了凯撒加密(Caesar cipher)的一种形式,具体是对英文字母进行右移5位的加密,然后又进行了相应的解密

代码解析

  1. 导入模块:

import string

导入了Python的string模块,该模块包含了一些常用的字符串常量,如所有的ASCII字母。 2. 定义字母列表:

upper_list = string.ascii_uppercase
lower_list = string.ascii_lowercase

upper_list包含了所有的大写英文字母,而lower_list包含了所有的小写英文字母。 3. 凯撒加密右移5位:

upper_dest = ''
for i in upper_list:
    index = (upper_list.index(i) + 5) % len(upper_list)
    print(upper_list[index], end=' ')
    upper_dest += upper_list[index]
print()

这部分代码实现了对大写字母的凯撒加密右移5位:

* 初始化一个空字符串`upper_dest`来存储加密后的结果。
* 遍历`upper_list`中的每一个字符`i`。
* 使用`upper_list.index(i)`找到字符`i`在`upper_list`中的索引位置,然后加5得到新的索引位置。使用模运算`% len(upper_list)`确保索引不会超出列表的范围。
* 使用新的索引位置从`upper_list`中获取加密后的字符,并打印它(后面跟一个空格)。
* 将加密后的字符添加到`upper_dest`字符串中。
* 最后打印一个换行符。
  1. 凯撒解密左移5位: 注意:虽然代码注释说是“凯撒加密右移5位”,但这段代码实际上是进行了解密操作,即左移5位。

for i in upper_dest:
    index = upper_dest.index(i) - 5
    print(upper_dest[index], end=' ')

这部分代码实现了对加密后的字符串upper_dest的解密(左移5位):

* 遍历`upper_dest`中的每一个字符`i`。
* 使用`upper_dest.index(i)`找到字符`i`在`upper_dest`中的索引位置,然后减5得到原始字符在`upper_dest`中的索引位置(因为之前加了5位进行加密)。
* 使用这个索引位置从`upper_dest`中获取原始字符,并打印它(后面跟一个空格)。

注意

  1. 这段代码只处理了大写字母。如果要处理小写字母,你需要对lower_list执行类似的操作。

  2. 凯撒加密是一种简单的替换加密方法,它很容易被破解。因此,在实际应用中,不建议使用凯撒加密来保护敏感信息。

  3. 在解密部分,代码假设加密是通过右移5位实现的。如果加密是通过其他方式实现的,解密部分可能不会正常工作。

铺垫(4)-源码

list = []
for i in upper:
    list.append(i)
# print(list)
list2 = ['F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
         'A', 'B', 'C', 'D', 'E']
# 凯撒加密,右位移5
for i in list:
    index = (list.index(i) + 5) % len(list)
    # print(list[index], end=' ')
# 凯撒解密,左位移5,python特有下标取负数,不需要取余
for i in list2:
    index = list.index(i) - 5
    print(list[index], end=' ')

铺垫(4)-源码解析

这段代码实现了凯撒加密(Caesar cipher)的加密和解密过程

代码解析

  1. 初始化列表:

    • list = []: 创建一个空列表list

    • for i in upper: list.append(i): 这段代码似乎是从一个名为upper的字符串或列表中获取所有字符,并将它们添加到list中。但请注意,upper在这段代码中没有定义,可能是在代码的其他部分定义的。

    • list2: 这是一个包含所有大写字母的列表,但它跳过了'F'到'J'之间的字母,并从'K'开始。这似乎是一个错误,因为通常凯撒加密会处理所有的字母。不过,这段代码可能是为了演示某种特定的移位情况。

  2. 凯撒加密:

    • for i in list: index = (list.index(i) + 5) % len(list): 这段代码遍历list中的每个字符,并计算其在列表中的新位置,新位置是当前位置加5并对列表长度取模。这是凯撒加密的核心思想,即将字母表中的每个字母移动固定的位置数。

    • 注:print(list[index], end=' '): 这行代码被注释掉了,如果取消注释,它会打印加密后的字符。

  3. 凯撒解密:

    • for i in list2: index = list.index(i) - 5: 这段代码遍历list2中的每个字符,并计算其在list中的原始位置,原始位置是当前位置减5。这是凯撒解密的核心思想,即将字母表中的每个字母移动回其原始位置。

    • print(list[index], end=' '): 这行代码打印解密后的字符。

注意事项

  1. upper未定义: 代码中的upper变量没有在这段代码中定义。它可能是在代码的其他部分定义的,或者这是一个遗漏。

  2. list2的错误: list2似乎是一个错误的字母表,因为它跳过了'F'到'J'之间的字母。这可能会导致解密过程出现问题。

  3. 效率问题: 使用list.index(i)来查找字符的位置可能不是最高效的方法,特别是当列表很大时。一个更好的方法是使用字典来存储字符和其位置的映射。

  4. 代码注释: 代码中有一些有用的注释,但也有一些被注释掉的代码。为了更清晰地理解代码,建议删除不必要的注释,并确保所有重要的代码都是可见的。

修改后的代码示例

下面是一个修改后的代码示例,修复了上述提到的一些问题:

# 定义大写字母列表
upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

# 初始化加密列表和解密列表
encrypted_list = []
decrypted_list = []

# 凯撒加密,右位移5
for char in upper:
    index = (upper.index(char) + 5) % len(upper)
    encrypted_char = upper[index]
    encrypted_list.append(encrypted_char)

# 打印加密后的列表
print("Encrypted:", ''.join(encrypted_list))

# 凯撒解密,左位移5
for char in encrypted_list:
    index = (upper.index(char) - 5) % len(upper)
    decrypted_char = upper[index]
    decrypted_list.append(decrypted_char)

# 打印解密后的列表
print("Decrypted:", ''.join(decrypted_list))

这个修改后的代码更清晰、更完整,并且修复了原始代码中的一些问题。

完整实现-源码

import string

upper_list = string.ascii_uppercase
lower_list = string.ascii_lowercase


def encrypt_zhang(source):
    # 对大小写字母右移6位
    dest = ''
    for i in source:
        # 如果是大写的情况
        if i in upper_list:
            index = (upper_list.index(i) + 6) % len(upper_list)
            dest += upper_list[index]
        elif i in lower_list:
            index = (lower_list.index(i) + 6) % len(lower_list)
            dest += lower_list[index]
    return dest


# 对字母大小写转换(加解密同源)
def convert_li(source):
    dest = ''
    for i in source:
        if ord(i) in range(65, 91):
            dest += chr(ord(i) + 32)
        elif ord(i) in range(97, 123):
            dest += chr(ord(i) - 32)
    return dest


# 对encrypt_zhang解密,大小写左移6位
def decrypt_zhang(source):
    dest = ''
    for i in source:
        if i in upper_list:
            index = upper_list.index(i) - 6
            dest += upper_list[index]
        elif i in lower_list:
            index = lower_list.index(i) - 6
            dest += lower_list[index]
    return dest


if __name__ == '__main__':
    result1 = encrypt_zhang('ZHANGsan')
    print(result1)
    result2 = convert_li(result1)
    print(result2)
    result3 = decrypt_zhang(result2)
    print(result3)
    result4 = convert_li(result3)
    print(result4)

完整实现-源码解析

这段代码定义了两个加密/解密函数encrypt_zhangdecrypt_zhang,以及一个大小写转换函数convert_li

  1. 导入模块:

import string

导入了Python的string模块,该模块包含了一些常用的字符串常量和函数。 2. 定义字母列表:

upper_list = string.ascii_uppercase
lower_list = string.ascii_lowercase

upper_list包含了所有的大写英文字母,而lower_list包含了所有的小写英文字母。 3. encrypt_zhang函数: 这个函数实现了对输入字符串source中的每个字母进行右移6位的加密操作。

* 如果字母是大写的,则在`upper_list`中找到其位置,然后加6并取模得到新的位置,从而获取加密后的字母。
* 如果字母是小写的,则在`lower_list`中做类似的操作。
* 其他非字母字符不会被加密。
  1. convert_li函数: 这个函数实现了大小写转换的功能。

    • 如果字母是大写的(ASCII值在65-90之间),则将其转换为小写。

    • 如果字母是小写的(ASCII值在97-122之间),则将其转换为大写。

    • 其他非字母字符不会被转换。

  2. decrypt_zhang函数: 这个函数是encrypt_zhang的逆操作,实现了对输入字符串source中的每个字母进行左移6位的解密操作。其逻辑与encrypt_zhang相似,只是方向相反。

  3. 主程序:

    • 首先,使用encrypt_zhang函数加密字符串'ZHANGsan',并打印结果。

    • 然后,使用convert_li函数将加密后的字符串的大小写进行转换,并打印结果。

    • 接着,使用decrypt_zhang函数对上一步得到的字符串进行解密,并打印结果。

    • 最后,再次使用convert_li函数将解密后的字符串的大小写进行转换,并打印结果。

注意:虽然这段代码在逻辑上是正确的,但在实际应用中,这种简单的移位加密方法(如凯撒密码)并不安全,容易被破解。对于需要高安全性的场景,应使用更复杂的加密算法。

另外,这段代码中的encrypt_zhangdecrypt_zhang函数只处理了英文字母,对于其他字符(如数字、标点符号等)则不做处理。如果需要处理这些字符,可以在函数中添加相应的逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值