1.sgx_rsa 加密函数介绍
sgx_rsa的底层库使用的是openssl的库,但由于sgx的安全性又与openssl官方rsa的加密流程有些许不同,从而产生了跨平台的相关问题 。这里是sgx_rsa的加密源码:源码
2.sgx_rsa 跨平台加密流程介绍
我们想使用sgx在encalve内部产生的rsa密钥对,将公钥传输到untrust区域,然后让前端通过该公钥进行加密敏感数据,然后将密文返回到enclave内部,通过其私钥进行解密。此时只有在前端与后端的encalve内部才是明文,对外全部都是密文。
3.sgx_rsa 跨平台加解密的问题
3.1 在enclave内部生成的公钥仅仅是一个void类型的指针,所以很难将其从enclave内部复制出来,通过查阅相关资料,发现一般做法会将产生密钥对函数 sgx_create_rsa_key_pair函数 产生的n和e复制出来,进行传输。到另一个enclave内部后然后让其调用sgx_create_rsa_pub1_key函数生成对应的公钥进行加密。
3.2 但是复制出来的n和e通过前端的相关库产生的公私钥对无法使用。我们进一步实验,通过发现原始openssl的rsa密钥产生函数产生的公钥pem文件依旧无法使用。我们推断由于跨平台的特性可能仅仅只能通过sgx提供的库才可以通过n,e产生正常使用的公私钥对。
4.sgx_rsa 跨平台加密解决方案
我们分析enclave内部的密钥产生算法,将其修改并且复制到untrust区域,通过输入由enclave内部生成的n,e让其在产生公钥时,调用openssl库函数将其保存到pem文件夹中,将此时产生的公私钥对进行在前端加解密,发现可以进行跨平台使用。
此时只需要注意一下rsa的加密格式(下图为sgx-rsa的加密格式,对应平台的加密格式应该与此相同)·
也可以通过该网站验证你的公私钥是否生成正确:网址
为什么不在enclave内部时就调用库函数将其保存到pem文件中呢,因为在enclave内部我们调用的是库函数,无法修改其在内部函数进行上述操作。
5.其它
如果有其它更好的办法或者本文有什么错误的地方,欢迎大家进行指正。需要源码请私聊。