OP-TEE TA与远程服务器DH共享密钥导出不一致问题排查
DH共享密钥不一致排查指南(OP-TEE TA ↔ Python服务器)
1. 公钥格式转换错误排查
- TA公钥转Python对象:OP-TEE输出的DH公钥通常是原始大整数的大端序二进制,Python端需准确转换为DH公钥对象,不能直接用PEM格式加载。示例代码:
from cryptography.hazmat.primitives.asymmetric import dh from cryptography.hazmat.backends import default_backend # 加载RFC3526固定参数(见下文) p = 0xFFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF6955817183995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF parameters = dh.DHParameterNumbers(p, 5).parameters(default_backend()) # ta_pub_bytes为TA传来的原始公钥二进制(大端) ta_public_num = int.from_bytes(ta_pub_bytes, byteorder='big') ta_public_key = parameters.public_key(ta_public_num) - 服务器公钥转TA的C数组:需先将PEM转DER格式,再直接按字节生成C数组,不能截断或修改字节序。示例代码:
TA端需用OP-TEE的from cryptography.hazmat.primitives import serialization server_pub = server_private_key.public_key() der_pub = server_pub.public_bytes( encoding=serialization.Encoding.DER, format=serialization.PublicFormat.SubjectPublicKeyInfo ) # 生成可直接在TA中使用的C数组 c_array = '{' + ', '.join([f'0x{b:02x}' for b in der_pub]) + '}'TEE_ImportKeyAPI解析DER格式公钥,不能直接将字节当作原始大整数处理。
2. DH组参数一致性验证
必须确保TA和服务器使用完全相同的RFC3526 2048位MODP参数,不能仅依赖key_size=2048和generator=5(不同实现可能生成不同素数p):
- Python端直接加载RFC3526的固定素数p(如上述代码),而非调用
dh.generate_parameters生成新参数。 - TA端需硬编码与Python完全一致的p值,确保组参数(p、g)无任何差异。
3. 共享密钥导出处理一致性
DH共享密钥是原始大整数,双方导出时需做完全相同的处理:
- TA端:确认使用
TEE_DeriveKey时未添加额外派生算法(如哈希),若添加则Python端需执行相同操作。 - Python端:直接调用
exchange方法获取原始共享秘密二进制:
对比时需确保双方的共享秘密二进制(大端序)完全一致,若TA端对结果做了SHA-256哈希,Python端也需执行shared_key = server_private_key.exchange(ta_public_key)hashlib.sha256(shared_key).digest()。
4. 字节序问题排查
所有大整数(公钥、共享秘密)的二进制传输必须使用大端序(网络字节序):
- 检查TA端解析服务器公钥时是否误用小端序。
- 检查Python端转换TA公钥时是否指定
byteorder='big'。
5. 公钥合法性验证
双方需验证对方公钥是否在DH组的合法范围内:
- Python端验证示例:
pub_num = ta_public_key.public_numbers().y p = parameters.parameter_numbers().p # 公钥需满足1 < pub_num < p-1 assert 1 < pub_num < p - 1 # 验证公钥属于合法子群(RFC3526的p为安全素数,子群阶为(p-1)/2) assert pow(pub_num, (p - 1) // 2, p) == 1 - TA端使用
TEE_VerifyKeyAPI验证公钥合法性,排除非法公钥导致的计算错误。
内容的提问来源于stack exchange,提问作者Shirin Ebadi
相关产品推荐
相关产品推荐

