MST

星途 面试题库

面试题:网络编程中如何实现简单的加密通信

在后端开发的网络编程场景下,假设使用Python语言,简述如何利用常见的加密库(如`cryptography`)实现客户端与服务器之间简单的加密通信流程,包括密钥生成、数据加密传输以及解密验证等关键步骤。
15.5万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试
  1. 密钥生成
    • 使用cryptography库生成密钥。例如,对于对称加密(如AES),可以这样生成密钥:
    from cryptography.fernet import Fernet
    key = Fernet.generate_key()
    
    • 对于非对称加密(如RSA),可以使用以下方式生成私钥和公钥:
    from cryptography.hazmat.primitives.asymmetric import rsa, padding
    from cryptography.hazmat.primitives import serialization, hashes
    
    private_key = rsa.generate_private_key(
        public_exponent = 65537,
        key_size = 2048
    )
    public_key = private_key.public_key()
    
    private_pem = private_key.private_bytes(
        encoding = serialization.Encoding.PEM,
        format = serialization.PrivateFormat.PKCS8,
        encryption_algorithm = serialization.NoEncryption()
    )
    public_pem = public_key.public_bytes(
        encoding = serialization.Encoding.PEM,
        format = serialization.PublicFormat.SubjectPublicKeyInfo
    )
    
  2. 客户端数据加密传输
    • 对称加密
      • 假设客户端已经获取到密钥key,要发送的数据为data(假设为字符串类型,需要先编码为字节类型)。
      from cryptography.fernet import Fernet
      cipher_suite = Fernet(key)
      data = "Hello, Server!".encode('utf - 8')
      cipher_text = cipher_suite.encrypt(data)
      # 这里将cipher_text通过网络发送给服务器
      
    • 非对称加密
      • 客户端使用服务器的公钥public_key加密数据。假设数据为message(同样需编码为字节类型)。
      message = "Hello, Server!".encode('utf - 8')
      encrypted = public_key.encrypt(
          message,
          padding.OAEP(
              mgf = padding.MGF1(algorithm = hashes.SHA256()),
              algorithm = hashes.SHA256(),
              label = None
          )
      )
      # 将encrypted通过网络发送给服务器
      
  3. 服务器解密验证
    • 对称加密
      • 服务器接收到cipher_text,使用相同的密钥key进行解密。
      from cryptography.fernet import Fernet
      cipher_suite = Fernet(key)
      decrypted_data = cipher_suite.decrypt(cipher_text)
      print(decrypted_data.decode('utf - 8'))
      
    • 非对称加密
      • 服务器使用自己的私钥private_key解密数据。
      original_message = private_key.decrypt(
          encrypted,
          padding.OAEP(
              mgf = padding.MGF1(algorithm = hashes.SHA256()),
              algorithm = hashes.SHA256(),
              label = None
          )
      )
      print(original_message.decode('utf - 8'))
      

在实际网络编程中,还需要处理网络连接(如使用socket库)、密钥的安全分发等问题,以确保整个加密通信流程的安全性和可靠性。