冲刺(day2)

发布时间 2023-12-12 18:59:41作者: Heartsteel

团队任务总结


一、团队成员任务分配

为了推进项目的进展,我们团队在今天共同完成了两个重要的功能模块。以下是团队成员在这两个模块上的任务分配和进展:

  1. 张钰权: 负责解密功能的实现。成功完成了解密文件的编写,包括AES解密和RSA密钥解密,确保解密过程的正确性和安全性。

  2. 周绍坤: 参与了解密功能的编写过程,负责协助处理解密时可能遇到的异常情况,并对项目的异常处理进行了优化。

  3. 张爽: 参与了SM4密钥生成和RSA密钥对生成功能的编写,保障了项目中关键的密钥生成和管理。

  4. 王熠名: 负责加密功能的实现。完成了文件加密的编写,包括AES加密和RSA密钥加密,确保了文件的安全传输和存储。

  5. 董子瑄: 参与了加密功能的编写过程,对加密时可能遇到的问题进行了分析和解决,提高了加密过程的稳定性。


二、团队任务及进展

在今天的工作中,我们小组成功完成了两个关键功能的编写:

  1. 解密功能模块:

    • 张钰权成功实现了文件的解密过程,通过AES解密和RSA密钥解密,确保了解密操作的正确性和安全性。
    • 周绍坤在解密模块中进行了异常处理的优化,提高了系统的稳定性。
  2. 加密功能模块:

    • 张爽,王熠名成功完成了文件的加密过程,通过AES加密和RSA密钥加密,确保了文件在传输和存储过程中的安全性。
    • 董子瑄在加密模块中分析并解决了可能出现的问题,提高了加密操作的稳定性。

三、团队遇到的困难

在完成这两个功能模块的过程中,团队遇到了一些挑战:

  • 密钥管理: 对于密钥的生成、存储和使用,团队需要更加仔细地考虑安全性和可维护性。

  • 异常处理: 在解密和加密过程中,可能会涉及到多种异常情况,团队需要进一步完善异常处理机制,确保系统不会出现较为离谱的漏洞。


四、心得体会

团队成员在合作完成这两个功能模块的过程中积累了许多经验:

  • 张钰权: 在解密功能的编写中,我对AES和RSA的结合使用有了更深入的理解,同时对异常情况的处理也有了更多实践。

  • 周绍坤: 通过参与解密功能的编写,我对异常处理有了更清晰的认识,同时也意识到密钥管理在项目中的重要性。

  • 张爽: 参与了密钥生成功能的编写,对密钥的生成和存储有了更加深入的了解,为项目的密钥管理提供了可靠的基础。

  • 王熠名: 在加密功能的实现中,我学到了如何结合AES和RSA实现更加安全的文件加密,对加密算法有了更深刻的理解。

  • 董子瑄: 参与了加密功能的编写,通过解决可能出现的问题,我对加密操作的稳定性需求有了更多的认识。


五、明日计划

为了进一步推进项目,团队制定了明日的计划:

  1. 优化密钥管理: 进一步完善密钥的生成、存储和使用机制,确保系统的密钥管理更加安全可靠。

  2. 异常处理优化: 针对解密和加密过程中可能出现的异常情况,进一步优化异常处理机制,提高系统的鲁棒性。

  3. 性能优化: 对解密和加密功能进行性能测试,优化代码,确保系统在大规模文件操作时仍能保持高效。

  4. 文档整理: 对已完成的功能模块进行文档整理,确保项目的文档清晰明了,方便后续维护和扩展。


六、总结

今天的团队合作中,大家共同完成了解密和加密功能模块,充分展现了团队成员在技术和协作方面的能力。通过不断学习和合作,我们相信在未来的项目中,团队将能够更好地应对各种挑战,取得更多的进展。


 

七、代码示例

from Crypto.Cipher import AES
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from Crypto.Util.Padding import unpad
import os

def decrypt_sm4(ciphertext, key):
    iv = ciphertext[:16]
    cipher = AES.new(key, AES.MODE_CBC, iv)
    plaintext = unpad(cipher.decrypt(ciphertext[16:]), AES.block_size)
    return plaintext

def decrypt_file(input_path, output_dir, rsa_private_key_path, sm4_key_path):
    try:
        with open(input_path, 'rb') as file:
            content = file.read()

        # 从外部加载 SM4 密钥文件
        with open(sm4_key_path, 'rb') as sm4_key_file:
            sm4_key = sm4_key_file.read()

        # 使用 RSA 私钥解密 SM4 密钥
        rsa_private_key = serialization.load_pem_private_key(
            open(rsa_private_key_path, 'rb').read(),
            password=None,
            backend=default_backend()
        )

        sm4_key = rsa_private_key.decrypt(
            sm4_key,
            padding.PKCS1v15()
        )

        # 分离加密的文件内容
        enc_content = content

        decrypted_content = decrypt_sm4(enc_content, sm4_key)

        decrypted_file_path = os.path.join(output_dir, os.path.basename(input_path).replace("_enc.docx", "_dec.docx"))  # 修改文件扩展名
        with open(decrypted_file_path, 'wb') as decrypted_file:
            decrypted_file.write(decrypted_content)

        print(f"文件{input_path}解密成功,并保存至{decrypted_file_path}。")
    except Exception as e:
        print(f"解密文件{input_path}时发生错误:{e}")

def main(input_dir, output_dir, rsa_private_key_path, sm4_key_path):
    try:
        os.makedirs(output_dir, exist_ok=True)

        file_list = [f for f in os.listdir(input_dir) if f.endswith('_enc.docx')]  # 修改文件扩展名
        for file_name in file_list:
            decrypt_file(os.path.join(input_dir, file_name), output_dir, rsa_private_key_path, sm4_key_path)

    except Exception as e:
        print(f"错误:{e}")

if __name__ == "__main__":
    input_directory = r"e:\dzgwtest"
    output_directory = r"e:\dzgwtest"
    rsa_private_key_path = os.path.join(output_directory, "private_key.pem")
    sm4_key_path = os.path.join(output_directory, "sm4key1.enc")
    main(input_directory, output_directory, rsa_private_key_path, sm4_key_path)
import os
from Crypto.Cipher import AES
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from Crypto.Util.Padding import pad

def generate_sm4_key(output_dir, count):
    try:
        key = os.urandom(16)
        key_file_path = os.path.join(output_dir, f"sm4key{count}.enc")
        with open(key_file_path, 'wb') as key_file:
            key_file.write(key)
        print(f"SM4密钥{count}生成成功,并保存至{key_file_path}。")
        return key
    except Exception as e:
        print(f"生成SM4密钥时发生错误:{e}")
        return None

def generate_rsa_key_pair(output_dir):
    private_key = rsa.generate_private_key(
        public_exponent=65537,
        key_size=2048,
        backend=default_backend()
    )

    private_pem = private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption()
    )

    public_key = private_key.public_key()
    public_pem = public_key.public_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PublicFormat.SubjectPublicKeyInfo
    )

    with open(os.path.join(output_dir, "private_key.pem"), 'wb') as private_key_file:
        private_key_file.write(private_pem)

    with open(os.path.join(output_dir, "public_key.pem"), 'wb') as public_key_file:
        public_key_file.write(public_pem)

    print("RSA密钥对生成成功。")

def encrypt_sm4(content, key):
    cipher = AES.new(key, AES.MODE_CBC)
    ciphertext = cipher.encrypt(pad(content, AES.block_size))
    return cipher.iv + ciphertext

def encrypt_file(input_path, output_dir, sm4_key, rsa_public_key):
    try:
        with open(input_path, 'rb') as file:
            content = file.read()

        enc_content = encrypt_sm4(content, sm4_key)
        enc_file_path = os.path.join(output_dir, os.path.basename(input_path).replace(".docx", "_enc.docx"))  # 修改文件扩展名
        with open(enc_file_path, 'wb') as enc_file:
            enc_file.write(enc_content)

        enc_rsa_key = rsa_public_key.encrypt(
            sm4_key,
            padding.PKCS1v15()
        )

        with open(os.path.join(output_dir, "sm4key1.enc"), 'wb') as sm4_key_file:
            sm4_key_file.write(enc_rsa_key)

        print(f"文件{input_path}加密成功,并保存至{enc_file_path}。")
    except Exception as e:
        print(f"加密文件{input_path}时发生错误:{e}")

def main(input_dir, output_dir):
    try:
        os.makedirs(output_dir, exist_ok=True)
        generate_rsa_key_pair(output_dir)

        file_list = [f for f in os.listdir(input_dir) if f.endswith('.doc') or f.endswith('.docx')]
        for i, file_name in enumerate(file_list, start=1):
            sm4_key = generate_sm4_key(output_dir, i)

            rsa_public_key_path = os.path.join(output_dir, "public_key.pem")
            rsa_public_key = serialization.load_pem_public_key(
                open(rsa_public_key_path, 'rb').read(),
                backend=default_backend()
            )

            encrypt_file(os.path.join(input_dir, file_name), output_dir, sm4_key, rsa_public_key)

    except Exception as e:
        print(f"错误:{e}")

if __name__ == "__main__":
    input_directory = r"e:\dzgwtest"
    output_directory = r"e:\dzgwtest"
    main(input_directory, output_directory)