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

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

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import hashlib
import base64
import binascii

PRIVATE_KEY =  bytearray(("May the force be with U.").encode('utf-8'));

def xor_array_with_key(array, key):
    result = bytearray()  # 创建一个空的字节数组,用于存储结果
    for i in range(0, len(array), len(key)):  # 按照每 32 字节的步长遍历数组
        for j in range(len(key)):  # 遍历每个字节
            if(i+j)>=len(array) or j>=len(key): break;
            result.append(array[i+j] ^ key[j])  # 将当前字节和对应的密钥字节进行异或操作,并附加到结果中
    return result

# 使用 SHA256 哈希算法对字符串进行加密
def gp_encrypt_string(string):
    global PRIVATE_KEY
    sha256_hash = hashlib.sha256()
    sha256_hash.update(string.encode('utf-8'))
    encrypted_data = sha256_hash.digest();

    KEY_SIZE = 256/8;
    outputhex = sha256_hash.hexdigest(); #the very first 256/8 = 32Bytes.

    utf8_string = string.encode('utf-8');
    byte_array = len(string).to_bytes(4, 'big');  #有效数据开头是字符串长度
    byte_array = byte_array + bytearray(utf8_string);
    byte_array = bytearray(byte_array);
    offset = len(byte_array)%KEY_SIZE;
    zero_bytes = bytearray(b"\x00" * int(KEY_SIZE - offset))      # 5 个零的字节数组
    byte_array.extend(zero_bytes)
    byte_array = xor_array_with_key(byte_array, encrypted_data)
    byte_array = xor_array_with_key(byte_array, PRIVATE_KEY)

    base64_encoded = base64.b64encode(byte_array).decode('utf-8')
    outputhex = outputhex + base64_encoded;
    sha256_hash = hashlib.sha256()
    sha256_hash.update(outputhex.encode('utf-8'));
    outputhex = outputhex + sha256_hash.hexdigest();
    return outputhex;

# 对使用上述方法加密的字符串进行解密
def gp_decrypt_string(encrypted_string):
    global PRIVATE_KEY
    #no encode string
    KEY_SIZE = 256/8;
    if(len(encrypted_string)<=KEY_SIZE*2*2): return encrypted_string;

    last32HexBytes = encrypted_string[int(-1*KEY_SIZE*2):];
    stringRemoveTail = encrypted_string[0:int(-1*KEY_SIZE*2)];

    first32HexBytes = stringRemoveTail[0:int(KEY_SIZE*2)];
    binOfKey = binascii.unhexlify(first32HexBytes);


    sha256_hash = hashlib.sha256()
    sha256_hash.update(stringRemoveTail.encode('utf-8'))
    encrypted_data = sha256_hash.hexdigest();
    if(last32HexBytes != encrypted_data):
       return encrypted_string;

    thePasswordBody = stringRemoveTail[int(KEY_SIZE*2):];
    base64_decoded = base64.b64decode(thePasswordBody)
    #print('before xor', base64_decoded);
    base64_decoded = xor_array_with_key(base64_decoded, PRIVATE_KEY)
    byte_array = xor_array_with_key(base64_decoded, binOfKey);
    lenOfStr = int.from_bytes(byte_array[0:4], 'big');
    decrypted_string = byte_array[4:].decode('utf-8')
    decrypted_string = decrypted_string[:lenOfStr]
    return decrypted_string

#is string encrypted?
def gp_is_encrypt_string(encrypted_string):
    #no encode string
    KEY_SIZE = 256/8;
    if(len(encrypted_string)<=KEY_SIZE*2*2): return False;

    last32HexBytes = encrypted_string[int(-1*KEY_SIZE*2):];
    stringRemoveTail = encrypted_string[0:int(-1*KEY_SIZE*2)];

    first32HexBytes = stringRemoveTail[0:int(KEY_SIZE*2)];
    binOfKey = binascii.unhexlify(first32HexBytes);


    sha256_hash = hashlib.sha256()
    sha256_hash.update(stringRemoveTail.encode('utf-8'))
    encrypted_data = sha256_hash.hexdigest();
    if(last32HexBytes != encrypted_data):
       return False;
    else:
       return True;

def test():
    # 测试
    plaintext = "Hello, World!"
    encrypted = gp_encrypt_string(plaintext)
    print("加密后的字符串:", encrypted)

    print("加密校验:", gp_is_encrypt_string(encrypted))

    decrypted = gp_decrypt_string(encrypted)
    print("解密后的字符串:", decrypted)

#test()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子正

thanks, bro...

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值