本帖最后由 小恩GG 于 2022-2-28 17:21 编辑
RSA是一种非对称公钥密码算法,也是现在使用最广泛的公钥密码算法,通过使用公钥解密,私钥加密,来完成加解密操作。为支持安全需求,在LPC55系列中,也多处藏有它的身影,例如: -RSA私钥签名安全启动中的引导代码,在安全启动中通过RSA验签来验证代码的真实性 -图像使用RSA签名,摘要计算要使用RSA密钥 那么RSA的基本原理是什么,如何通过LPC55来确切实践呢?本文将浅谈RSA理论与在LPC55中的实现。 1 RSA基础 1.1 RSA加密: -公式表达为:明文^Emod N = 密文 -解释:将明文和自己做E次乘方,然后将结果除以N求余数,余数就是密文。 1.2 RSA解密: -公式表达为:密文^Dmod N = 明文 -解释:将密文和自己做D次乘法,再对结果除以N求余数,结果为明文。
下面用图表来总结加密与解密过程: 1.3 密钥对生成: 由加密和解密过程得知我们需要得到D、E、N的值才能进行操作。在求解时按N、E、D的顺序生成密钥是最快捷的,且需要再添加L(仅在生成密钥过程中使用)完成求解。 -N:N是由任意两个很大的质数P、Q相乘得到,它与E组成公钥,与D组成私钥。 -L:L是P-1与Q-1的乘积 -E:E一般取大于1小于L的任意与L互质的数 -D:由公式由E*D mod L=1得到 1.4 举例: 下面为方便读者理解,举一个较小的例子来验证: 求N时,不妨令P=17,Q=19,得到N=323,L=16*18=144,E取大于1小于144与N互质的数,E=5,最后由E*D modL=1得到D=29。此时,我们得到了公钥:E=5,N=323,私钥:D=29,N=323。 取明文进行加密,任取一个数,例如123。 加密算法为:123^5mod 323 = 225,所以密文为225。 解密算法为:225^29mod 323 = 123,所以明文为123。 与理论吻合。 2 RSA在LPC55上的实现 mbedtls 是最小巧的SSL代码库。高效、便于移植和集成。支持常见的安全算法,如:AES、DES、RSA、ECC、SHA256、MD5、BASE64等等,它提供了具有直观的 API 和可读源代码的 SSL 库,即开即用,可以在大部分系统上直接构建它,为方便大家更直观的感受RSA算法在程序中的实现,故以LPC55系列中MCUXpresso SDK示例为例,路径为mbedtls_examples\mbedtls_selftest。 由于演示版本SDK中demo默认开启RSA算法,可直接使用,若用户版本未开启可按照路径mbedtls/include/mbedtls/config.h自己进行配置。 2.1确定参数 从源文件调试进入mbedtls_rsa_self_test函数,即进入rsa.c文件中,RSA所需要的各个核心参数N、E、D、P、Q等已提前清晰定义(如下图),通过查看算法运行情况和运行结果来验证RSA算法是否能在LPC55中实现。
rsa.c: 2.2 RSA加密操作与解密操作 加密操作: mbedtls_rsa_pkcs1_encrypt是RSA加密算法实现函数,*input为输入数据,即明文,*output为输出数据,即密文。 该函数所用到的各个参数如图所示: 除以上参数外,*ctx所包含的内容就是需要进行RSA运算的各个重要参数如:RSA_N、RSA_E、RSA_D等,详细数据2.1中已给出。明确参数意义与具体数值后,进行程序调试并记录下运行前后明文密文所对应的数值。
在加密操作中,rsa_plaintext为输入的明文数据,rsa_ciphertext为输出的密文数据,二者数值是我们的重点关注。运行前rsa_plaintext中的数据如下图所示(与解密后的输出相对比)。 输出的密文及其位置如图(与解密操作的输入相对比)。 此时,加密过程已经完成,分别记录两个变量的数值,下面开始进行解密。
解密操作: mbedtls_rsa_pkcs1_decrypt是RSA解密算法实现函数,*input为加密的结果,即密文,*output为明文,其他参数与加密函数类似。 在解密操作中,rsa_ciphertext为输入的密文数据(也是加密操作输出的密文数据),rsa_decrypted为解密操作后输出的明文数据,rsa_decrypted数值是我们的重点关注。 得到输出后的解密结果如下图,通过rsa_decrypted与rsa_plaintext数据对比,可得到经过加密解密后,符合RSA理论数据,算法在LPC55上实现成功。 小结:
在mbedtls 这一ssl代码库中包括很多常见的安全算法,如:AES、DES、RSA、ECC、SHA256、MD5、BASE64等等,RSA仅仅是其中的一个, 而对于RSA算法,除了它的加密解密功能,还有数字签名验签等功能,因此本文的作用仅仅是抛砖引玉,在LPC55基础上浅谈RSA,如果读者对加解密算法感兴趣,也可以继续尝试其他算法和实例,将算法应用于更多领域。
|