首页
/ srsRAN_4G安全机制:从AES到ZUC的完整加密流程

srsRAN_4G安全机制:从AES到ZUC的完整加密流程

2026-01-29 11:29:52作者:瞿蔚英Wynne

srsRAN_4G作为开源SDR 4G软件套件,其安全机制涵盖从AES到ZUC的完整加密流程,为4G通信提供了坚实的安全保障。本文将深入解析srsRAN_4G中的加密技术实现,帮助读者全面了解其安全防护体系。

安全加密算法概述

在移动通信系统中,加密算法是保障数据传输安全的核心。srsRAN_4G实现了多种加密算法,其中AES(Advanced Encryption Standard)和ZUC(祖冲之算法)是最主要的两种。AES主要用于用户平面和控制平面的数据加密,而ZUC则作为中国自主研发的流密码算法,在3GPP标准中被采用,用于提供完整性保护和加密服务。

AES加密算法实现

AES算法在srsRAN_4G中的实现主要集中在lib/include/srsran/common/ssl.h文件中。该文件定义了AES的上下文结构和相关操作函数,包括密钥设置和ECB、CTR等工作模式的实现。

typedef mbedtls_aes_context aes_context;

#define AES_ENCRYPT 1
#define AES_DECRYPT 0

inline int aes_setkey_enc(aes_context* ctx, const unsigned char* key, unsigned int keysize)
{
  return mbedtls_aes_setkey_enc(ctx, key, keysize);
}

inline int aes_crypt_ecb(aes_context* ctx, int mode, const unsigned char input[16], unsigned char output[16])
{
  return mbedtls_aes_crypt_ecb(ctx, mode, input, output);
}

在实际应用中,AES算法被广泛用于各种加密场景。例如,在lib/src/common/liblte_security.cc文件中,AES-ECB模式被用于生成密钥和加密数据:

aes_crypt_ecb(&ctx, AES_ENCRYPT, const_zero, L);
aes_crypt_ecb(&ctx, AES_ENCRYPT, tmp, T);

ZUC加密算法实现

ZUC算法是一种面向移动通信系统的流密码算法,在srsRAN_4G中主要用于完整性保护。其实现代码位于lib/include/srsran/common/zuc.hlib/src/common/zuc.cc文件中。

ZUC算法的状态结构定义如下:

typedef struct {
  u32 LFSR_S0;
  u32 LFSR_S1;
  // ... 其他LFSR状态寄存器
  u32 F_R1;
  u32 F_R2;
  u32 BRC_X0;
  u32 BRC_X1;
  u32 BRC_X2;
  u32 BRC_X3;
} zuc_state_t;

ZUC算法主要包含初始化和密钥流生成两个过程:

void zuc_initialize(zuc_state_t* state, const u8* k, u8* iv);
void zuc_generate_keystream(zuc_state_t* state, int key_stream_len, u32* p_keystream);

密钥派生流程

srsRAN_4G中的密钥派生过程遵循3GPP标准,从主密钥开始,通过一系列密钥派生函数(KDF)生成各种子密钥,用于不同的安全服务。这一过程在lib/src/common/security.cc文件中实现。

主要密钥派生函数

  1. k_asme派生:从CK和IK派生ASME(Access Security Management Entity)根密钥
uint8_t security_generate_k_asme(const uint8_t* ck,
                                 const uint8_t* ik,
                                 const uint8_t* ak_xor_sqn_,
                                 const uint16_t mcc,
                                 const uint16_t mnc,
                                 uint8_t*       k_asme)
  1. k_enb派生:从k_asme派生eNodeB密钥
uint8_t security_generate_k_enb(const uint8_t* k_asme, const uint32_t nas_count_, uint8_t* k_enb)
  1. 算法密钥派生:从k_enb派生各种算法密钥(NAS、RRC、UP的加密和完整性保护密钥)
uint8_t security_generate_k_nas(const uint8_t*                    k_asme,
                                const CIPHERING_ALGORITHM_ID_ENUM enc_alg_id,
                                const INTEGRITY_ALGORITHM_ID_ENUM int_alg_id,
                                uint8_t*                          k_nas_enc,
                                uint8_t*                          k_nas_int)

密钥派生的核心实现

密钥派生的核心是KDF函数,srsRAN_4G实现了多个重载版本的kdf_common函数,支持不同数量的输入参数:

int kdf_common(const uint8_t fc, const std::array<uint8_t, 32>& key, const std::vector<uint8_t>& P0, uint8_t* output)
int kdf_common(const uint8_t                  fc,
               const std::array<uint8_t, 32>& key,
               const std::vector<uint8_t>&    P0,
               const std::vector<uint8_t>&    P1,
               uint8_t*                       output)

这些函数使用SHA-256哈希算法,根据输入的密钥和参数生成派生密钥。

加密与完整性保护流程

srsRAN_4G实现了完整的加密和完整性保护机制,涵盖了NAS(非接入层)、RRC(无线资源控制)和UP(用户平面)等多个协议层。

加密实现

加密功能主要在lib/src/common/security.cc中实现,支持多种加密算法:

  1. EEA1 (AES-CBC-MAC)
uint8_t security_128_eea1(uint8_t* key,
                          uint32_t count,
                          uint8_t  bearer,
                          uint8_t  direction,
                          uint8_t* msg,
                          uint32_t msg_len,
                          uint8_t* msg_out)
  1. EEA2 (SNOW 3G)
uint8_t security_128_eea2(uint8_t* key,
                          uint32_t count,
                          uint8_t  bearer,
                          uint8_t  direction,
                          uint8_t* msg,
                          uint32_t msg_len,
                          uint8_t* msg_out)
  1. EEA3 (ZUC)
uint8_t security_128_eea3(uint8_t* key,
                          uint32_t count,
                          uint8_t  bearer,
                          uint8_t  direction,
                          uint8_t* msg,
                          uint32_t msg_len,
                          uint8_t* msg_out)

完整性保护实现

完整性保护同样支持多种算法,包括EIA1、EIA2和EIA3:

uint8_t security_128_eia1(const uint8_t* key,
                          uint32_t       count,
                          uint32_t       bearer,
                          uint8_t        direction,
                          uint8_t*       msg,
                          uint32_t       msg_len,
                          uint8_t*       mac)

uint8_t security_128_eia2(const uint8_t* key,
                          uint32_t       count,
                          uint32_t       bearer,
                          uint8_t        direction,
                          uint8_t*       msg,
                          uint32_t       msg_len,
                          uint8_t*       mac)

uint8_t security_128_eia3(const uint8_t* key,
                          uint32_t       count,
                          uint32_t       bearer,
                          uint8_t        direction,
                          uint8_t*       msg,
                          uint32_t       msg_len,
                          uint8_t*       mac)

安全机制的实际应用

srsRAN_4G的安全机制在eNodeB和UE(用户设备)中都有广泛应用。例如,在eNodeB的实现中,安全模块负责对所有无线接口上的信令和数据进行加密和完整性保护。

安全配置示例

在实际部署中,可以通过配置文件(如enb.conf.example)来设置安全相关参数:

[security]
integrity_enabled = true
encryption_enabled = true
integrity_algorithm = EIA2
encryption_algorithm = EEA2

安全相关模块路径

srsRAN_4G的安全相关代码主要分布在以下目录和文件中:

  • 加密算法定义:lib/include/srsran/common/ssl.hlib/include/srsran/common/zuc.h
  • 密钥派生实现:lib/src/common/security.cc
  • 安全算法实现:lib/src/common/liblte_security.cc
  • eNodeB安全配置:srsenb/enb.conf.example

总结

srsRAN_4G提供了从AES到ZUC的完整加密流程,通过多层次的密钥派生和多种加密算法的实现,为4G通信提供了全面的安全保障。其安全机制遵循3GPP标准,实现了从密钥生成、密钥派生到数据加密和完整性保护的全流程。

通过深入了解srsRAN_4G的安全实现,开发者可以更好地理解移动通信系统的安全机制,为构建安全可靠的无线通信系统提供参考。对于想要深入研究的开发者,可以从lib/src/common/security.cclib/src/common/liblte_security.cc等文件入手,进一步探索srsRAN_4G安全机制的实现细节。

登录后查看全文
热门项目推荐
相关项目推荐