• 一个只使用了hashlib和base64的对称加密实现


    Python的加密算法实现起来不复杂,但是有时,现场环境可能无法挂载AES, DEC这类模块,这里有一个简化的实现,利用hash, xor实现的对称加密。它的最终输出加密字符串比较大,至少有32*2*2个字节。

    1. #!/usr/bin/env python3
    2. # -*- coding: utf-8 -*-
    3. import hashlib
    4. import base64
    5. import binascii
    6. PRIVATE_KEY = bytearray(("May the force be with U.").encode('utf-8'));
    7. def xor_array_with_key(array, key):
    8. result = bytearray() # 创建一个空的字节数组,用于存储结果
    9. for i in range(0, len(array), len(key)): # 按照每 32 字节的步长遍历数组
    10. for j in range(len(key)): # 遍历每个字节
    11. if(i+j)>=len(array) or j>=len(key): break;
    12. result.append(array[i+j] ^ key[j]) # 将当前字节和对应的密钥字节进行异或操作,并附加到结果中
    13. return result
    14. # 使用 SHA256 哈希算法对字符串进行加密
    15. def gp_encrypt_string(string):
    16. global PRIVATE_KEY
    17. sha256_hash = hashlib.sha256()
    18. sha256_hash.update(string.encode('utf-8'))
    19. encrypted_data = sha256_hash.digest();
    20. KEY_SIZE = 256/8;
    21. outputhex = sha256_hash.hexdigest(); #the very first 256/8 = 32Bytes.
    22. utf8_string = string.encode('utf-8');
    23. byte_array = len(string).to_bytes(4, 'big'); #有效数据开头是字符串长度
    24. byte_array = byte_array + bytearray(utf8_string);
    25. byte_array = bytearray(byte_array);
    26. offset = len(byte_array)%KEY_SIZE;
    27. zero_bytes = bytearray(b"\x00" * int(KEY_SIZE - offset)) # 5 个零的字节数组
    28. byte_array.extend(zero_bytes)
    29. byte_array = xor_array_with_key(byte_array, encrypted_data)
    30. byte_array = xor_array_with_key(byte_array, PRIVATE_KEY)
    31. base64_encoded = base64.b64encode(byte_array).decode('utf-8')
    32. outputhex = outputhex + base64_encoded;
    33. sha256_hash = hashlib.sha256()
    34. sha256_hash.update(outputhex.encode('utf-8'));
    35. outputhex = outputhex + sha256_hash.hexdigest();
    36. return outputhex;
    37. # 对使用上述方法加密的字符串进行解密
    38. def gp_decrypt_string(encrypted_string):
    39. global PRIVATE_KEY
    40. #no encode string
    41. KEY_SIZE = 256/8;
    42. if(len(encrypted_string)<=KEY_SIZE*2*2): return encrypted_string;
    43. last32HexBytes = encrypted_string[int(-1*KEY_SIZE*2):];
    44. stringRemoveTail = encrypted_string[0:int(-1*KEY_SIZE*2)];
    45. first32HexBytes = stringRemoveTail[0:int(KEY_SIZE*2)];
    46. binOfKey = binascii.unhexlify(first32HexBytes);
    47. sha256_hash = hashlib.sha256()
    48. sha256_hash.update(stringRemoveTail.encode('utf-8'))
    49. encrypted_data = sha256_hash.hexdigest();
    50. if(last32HexBytes != encrypted_data):
    51. return encrypted_string;
    52. thePasswordBody = stringRemoveTail[int(KEY_SIZE*2):];
    53. base64_decoded = base64.b64decode(thePasswordBody)
    54. #print('before xor', base64_decoded);
    55. base64_decoded = xor_array_with_key(base64_decoded, PRIVATE_KEY)
    56. byte_array = xor_array_with_key(base64_decoded, binOfKey);
    57. lenOfStr = int.from_bytes(byte_array[0:4], 'big');
    58. decrypted_string = byte_array[4:].decode('utf-8')
    59. decrypted_string = decrypted_string[:lenOfStr]
    60. return decrypted_string
    61. #is string encrypted?
    62. def gp_is_encrypt_string(encrypted_string):
    63. #no encode string
    64. KEY_SIZE = 256/8;
    65. if(len(encrypted_string)<=KEY_SIZE*2*2): return False;
    66. last32HexBytes = encrypted_string[int(-1*KEY_SIZE*2):];
    67. stringRemoveTail = encrypted_string[0:int(-1*KEY_SIZE*2)];
    68. first32HexBytes = stringRemoveTail[0:int(KEY_SIZE*2)];
    69. binOfKey = binascii.unhexlify(first32HexBytes);
    70. sha256_hash = hashlib.sha256()
    71. sha256_hash.update(stringRemoveTail.encode('utf-8'))
    72. encrypted_data = sha256_hash.hexdigest();
    73. if(last32HexBytes != encrypted_data):
    74. return False;
    75. else:
    76. return True;
    77. def test():
    78. # 测试
    79. plaintext = "Hello, World!"
    80. encrypted = gp_encrypt_string(plaintext)
    81. print("加密后的字符串:", encrypted)
    82. print("加密校验:", gp_is_encrypt_string(encrypted))
    83. decrypted = gp_decrypt_string(encrypted)
    84. print("解密后的字符串:", decrypted)
    85. #test()

  • 相关阅读:
    一文读懂面试官都在问的Fastjson漏洞
    出现这个页面的问题是什么
    Vue基础
    一款集成ST-link下载及虚拟串口的STM32F103C8T6最小系统板设计
    WebGIS-分辨率与比例尺
    vue 路由
    [附源码]计算机毕业设计基于Springboot物品捎带系统
    Unity实现Camera和Audio数据的低延迟RTMP推送技术探讨
    探索比特币符文热:市场趋势与持续性分析
    Docker安装/使用Redis(可用/详细)
  • 原文地址:https://blog.csdn.net/twicave/article/details/133905423