铺垫(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
库来计算字符串和文件的哈希值
代码解析
-
导入库:
import hashlib
这行代码导入了Python的hashlib
库,该库提供了多种哈希算法,如MD5, SHA1, SHA256等。 2. 字符串哈希:
source = "你好"
# print(hashlib.md5(source.encode()).hexdigest())
这里定义了一个字符串source
,其值为"你好"。接下来的注释代码展示了如何计算该字符串的MD5哈希值。
* `source.encode()`: 将字符串转换为字节串,因为`hashlib`的哈希函数需要字节串作为输入。
* `hashlib.md5(...)`: 创建一个MD5哈希对象。
* `.hexdigest()`: 计算哈希值并返回其十六进制表示。
-
文件哈希:
with open('../文件引用/index.png', 'rb') as file:
data = file.read()
# print(hashlib.md5(data).hexdigest())
这部分代码打开了一个名为index.png
的文件,并读取了其内容到变量data
中。接下来的注释代码展示了如何计算该文件内容的MD5哈希值。
* `'rb'`: 以二进制模式打开文件,确保文件内容被正确读取。
-
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
进行简单的加密处理
-
初始化:
-
source
是一个给定的字符串,其值为 'DSFASsafdasf42343'。 -
result
是一个空字符串,用于存储加密后的结果。
-
-
遍历字符串: 使用
for
循环遍历source
中的每一个字符i
。 -
条件判断与加密:
-
如果字符
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,从而实现解密。
-
-
拼接结果: 将转换后的字符
temp
添加到result
字符串中。 -
输出: 最后,打印加密后的字符串
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位的加密,然后又进行了相应的解密
代码解析
-
导入模块:
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`字符串中。
* 最后打印一个换行符。
-
凯撒解密左移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`中获取原始字符,并打印它(后面跟一个空格)。
注意
-
这段代码只处理了大写字母。如果要处理小写字母,你需要对
lower_list
执行类似的操作。 -
凯撒加密是一种简单的替换加密方法,它很容易被破解。因此,在实际应用中,不建议使用凯撒加密来保护敏感信息。
-
在解密部分,代码假设加密是通过右移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)的加密和解密过程
代码解析
-
初始化列表:
-
list = []
: 创建一个空列表list
。 -
for i in upper: list.append(i)
: 这段代码似乎是从一个名为upper
的字符串或列表中获取所有字符,并将它们添加到list
中。但请注意,upper
在这段代码中没有定义,可能是在代码的其他部分定义的。 -
list2
: 这是一个包含所有大写字母的列表,但它跳过了'F'到'J'之间的字母,并从'K'开始。这似乎是一个错误,因为通常凯撒加密会处理所有的字母。不过,这段代码可能是为了演示某种特定的移位情况。
-
-
凯撒加密:
-
for i in list: index = (list.index(i) + 5) % len(list)
: 这段代码遍历list
中的每个字符,并计算其在列表中的新位置,新位置是当前位置加5并对列表长度取模。这是凯撒加密的核心思想,即将字母表中的每个字母移动固定的位置数。 -
注:
print(list[index], end=' ')
: 这行代码被注释掉了,如果取消注释,它会打印加密后的字符。
-
-
凯撒解密:
-
for i in list2: index = list.index(i) - 5
: 这段代码遍历list2
中的每个字符,并计算其在list
中的原始位置,原始位置是当前位置减5。这是凯撒解密的核心思想,即将字母表中的每个字母移动回其原始位置。 -
print(list[index], end=' ')
: 这行代码打印解密后的字符。
-
注意事项
-
upper
未定义: 代码中的upper
变量没有在这段代码中定义。它可能是在代码的其他部分定义的,或者这是一个遗漏。 -
list2
的错误:list2
似乎是一个错误的字母表,因为它跳过了'F'到'J'之间的字母。这可能会导致解密过程出现问题。 -
效率问题: 使用
list.index(i)
来查找字符的位置可能不是最高效的方法,特别是当列表很大时。一个更好的方法是使用字典来存储字符和其位置的映射。 -
代码注释: 代码中有一些有用的注释,但也有一些被注释掉的代码。为了更清晰地理解代码,建议删除不必要的注释,并确保所有重要的代码都是可见的。
修改后的代码示例
下面是一个修改后的代码示例,修复了上述提到的一些问题:
# 定义大写字母列表
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_zhang
和decrypt_zhang
,以及一个大小写转换函数convert_li
-
导入模块:
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`中做类似的操作。
* 其他非字母字符不会被加密。
-
convert_li函数: 这个函数实现了大小写转换的功能。
-
如果字母是大写的(ASCII值在65-90之间),则将其转换为小写。
-
如果字母是小写的(ASCII值在97-122之间),则将其转换为大写。
-
其他非字母字符不会被转换。
-
-
decrypt_zhang函数: 这个函数是
encrypt_zhang
的逆操作,实现了对输入字符串source
中的每个字母进行左移6位的解密操作。其逻辑与encrypt_zhang
相似,只是方向相反。 -
主程序:
-
首先,使用
encrypt_zhang
函数加密字符串'ZHANGsan',并打印结果。 -
然后,使用
convert_li
函数将加密后的字符串的大小写进行转换,并打印结果。 -
接着,使用
decrypt_zhang
函数对上一步得到的字符串进行解密,并打印结果。 -
最后,再次使用
convert_li
函数将解密后的字符串的大小写进行转换,并打印结果。
-
注意:虽然这段代码在逻辑上是正确的,但在实际应用中,这种简单的移位加密方法(如凯撒密码)并不安全,容易被破解。对于需要高安全性的场景,应使用更复杂的加密算法。
另外,这段代码中的encrypt_zhang
和decrypt_zhang
函数只处理了英文字母,对于其他字符(如数字、标点符号等)则不做处理。如果需要处理这些字符,可以在函数中添加相应的逻辑。