UEFI实战——RSA算法

RSA算法简述

RSA算法中的RSA并不是什么专业术语的缩写,它们是三个名字的头一个字母,这三个人是Rivest、Shamir 和 Adleman,他们提出了这个算法。

RSA算法是一个加密算法,用处当然是对数据进行加解密。

RSA算是是一种非对称的加密算法,有非对称当然就有对称算法。

对称算法的意思是,加密和解密用的密钥是同一个;而非对称算法有一对密钥,称为公钥和私钥,公钥加密的数据用私钥来解密,私钥加密的数据用公钥来解密。

非对称算法的好处在于双方可以各自持有公私钥,我用私钥加密之后的数据可以直接给你,你用公钥解密即可,公钥本身可以公开,所以不存在风险;但是如果是对称算法,我通过密钥加密之后可以直接把加密之后的数据给你,但是密钥怎么给你呢?因为这个密钥本身就是私密的,传递过程中如果出现安全问题,那加密本身就没有意义了。

非对称算法当然也有坏处,同样的安全级别,非对称算法加密时间要比对称算法加密要长。

最后说下公钥和私钥,它们其实就是一组二进制数据,长度可以是1024或者2048比特的,需要注意它们是成对出现的,两者有对应的关系。

Windows下使用RSA算法

RSA算法包含在OpenSSL这个开源的加密库中。

可以在https://www.openssl.org/找到相关的OpenSSL源码。

要在Windows下使用,可以在http://slproweb.com/products/Win32OpenSSL.html找到二进制安装文件。

安装如下:

安装完成之后可以目录找到对应的文件:

在上述目录打开一个Shell,并运行openssl.exe:

通过help可以查看帮助:

下面的命令可以生成私钥(名称是private.pem):

从私钥可以提取出公钥:

同目录下可以找到这两个文件:

通过这对密钥,就可以对文件进行加解密了。

比如这里有一个文件helloworld.txt,里面就是一句"Hello World":

通过下述的命令用公钥进行加密:

查看加密之后的文件:

反正看不懂是什么东西了。

然后再通过私钥来解密:

解密之后,就又能得到原来的"Hello World"了:

最后,还是查看一下刚才生成的公钥和私钥,实际上它们都可以通过文本工具来打开。

这个是私钥:

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDYjsDqqWseZhgnksNmFpFpsii5mBHT2p99CDe5jONLk3hOflSJ
LiEVvRfxaW4bP/ahUm/4YedBOAWx/qIbp/y33Lry3hCKlcw0S7CDLOuyJYTyR9P4
DV6OdsJbHtd/KMt1oI0MIp5TUeNMx28LpT0mkAV9xRC30w5z9rsPpO96BwIDAQAB
AoGAayWmmfSdRXsqNFpPR7Ge3PcDY2C0YWfoRYrNV4c35ureOagT15P1VrYqpI2P
pvfs5UDOmcyHCSPY3YqpVpm1VbJJ8wpiWboQtQhEZ6Z0faENiFjzYxgY77H5BLh6
9X/MH97ug4ByMkhVQFS5cfAwbyVsw54fj42zKkT5G5e8tXECQQDzAenHtjEQ8KsM
3DwPy98zKLO1l/HhhL9wYVF7HjAeBtrFHnw1LaTz9MKh6Ow/qh78LhEtXYcKVQE9
D3VfsJNtAkEA5CLRD/6UGIk/Lv8Zsg11tikTDPyIcPJdDAay4OlvrHFVBr2B/kpO
YGYQK6r8kT74T1SM1A4YUNOo0e2ppKEmwwJBAI6C1rk6jbfjjEy0c7zH0RPNkOa0
PzQEh8i+KezMHWfemTn00N7W79/p8KLHWJVVjWpTEdvK98EFbP6ELE973FkCQFMx
ayG1CZaE/jiKKHmotONPyTW0JaFikJHhI3wnRGUTExmZI/1yZXB756u099OTrgNn
5s8xsKZQ+UBMtc9mQPcCQGVKSD5Lov1b75el4FhsDJGh/+zhXxiMoS5pwPslC7SJ
rkV7Owkb7IM0L7ruL6j4u/tC8Rk0mJ2x4crjWOt6bl0=
-----END RSA PRIVATE KEY-----

这个是公钥:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYjsDqqWseZhgnksNmFpFpsii5
mBHT2p99CDe5jONLk3hOflSJLiEVvRfxaW4bP/ahUm/4YedBOAWx/qIbp/y33Lry
3hCKlcw0S7CDLOuyJYTyR9P4DV6OdsJbHtd/KMt1oI0MIp5TUeNMx28LpT0mkAV9
xRC30w5z9rsPpO96BwIDAQAB
-----END PUBLIC KEY-----

当然上面的东西看不出上面具体的东西,似乎也不想是1024个比特......

实际上还是可以通过命令来转换的:

转换之后的内容如下:

RSA Private-Key: (1024 bit, 2 primes)
modulus:
    00:d8:8e:c0:ea:a9:6b:1e:66:18:27:92:c3:66:16:
    91:69:b2:28:b9:98:11:d3:da:9f:7d:08:37:b9:8c:
    e3:4b:93:78:4e:7e:54:89:2e:21:15:bd:17:f1:69:
    6e:1b:3f:f6:a1:52:6f:f8:61:e7:41:38:05:b1:fe:
    a2:1b:a7:fc:b7:dc:ba:f2:de:10:8a:95:cc:34:4b:
    b0:83:2c:eb:b2:25:84:f2:47:d3:f8:0d:5e:8e:76:
    c2:5b:1e:d7:7f:28:cb:75:a0:8d:0c:22:9e:53:51:
    e3:4c:c7:6f:0b:a5:3d:26:90:05:7d:c5:10:b7:d3:
    0e:73:f6:bb:0f:a4:ef:7a:07
publicExponent: 65537 (0x10001)
privateExponent:
    6b:25:a6:99:f4:9d:45:7b:2a:34:5a:4f:47:b1:9e:
    dc:f7:03:63:60:b4:61:67:e8:45:8a:cd:57:87:37:
    e6:ea:de:39:a8:13:d7:93:f5:56:b6:2a:a4:8d:8f:
    a6:f7:ec:e5:40:ce:99:cc:87:09:23:d8:dd:8a:a9:
    56:99:b5:55:b2:49:f3:0a:62:59:ba:10:b5:08:44:
    67:a6:74:7d:a1:0d:88:58:f3:63:18:18:ef:b1:f9:
    04:b8:7a:f5:7f:cc:1f:de:ee:83:80:72:32:48:55:
    40:54:b9:71:f0:30:6f:25:6c:c3:9e:1f:8f:8d:b3:
    2a:44:f9:1b:97:bc:b5:71
prime1:
    00:f3:01:e9:c7:b6:31:10:f0:ab:0c:dc:3c:0f:cb:
    df:33:28:b3:b5:97:f1:e1:84:bf:70:61:51:7b:1e:
    30:1e:06:da:c5:1e:7c:35:2d:a4:f3:f4:c2:a1:e8:
    ec:3f:aa:1e:fc:2e:11:2d:5d:87:0a:55:01:3d:0f:
    75:5f:b0:93:6d
prime2:
    00:e4:22:d1:0f:fe:94:18:89:3f:2e:ff:19:b2:0d:
    75:b6:29:13:0c:fc:88:70:f2:5d:0c:06:b2:e0:e9:
    6f:ac:71:55:06:bd:81:fe:4a:4e:60:66:10:2b:aa:
    fc:91:3e:f8:4f:54:8c:d4:0e:18:50:d3:a8:d1:ed:
    a9:a4:a1:26:c3
exponent1:
    00:8e:82:d6:b9:3a:8d:b7:e3:8c:4c:b4:73:bc:c7:
    d1:13:cd:90:e6:b4:3f:34:04:87:c8:be:29:ec:cc:
    1d:67:de:99:39:f4:d0:de:d6:ef:df:e9:f0:a2:c7:
    58:95:55:8d:6a:53:11:db:ca:f7:c1:05:6c:fe:84:
    2c:4f:7b:dc:59
exponent2:
    53:31:6b:21:b5:09:96:84:fe:38:8a:28:79:a8:b4:
    e3:4f:c9:35:b4:25:a1:62:90:91:e1:23:7c:27:44:
    65:13:13:19:99:23:fd:72:65:70:7b:e7:ab:b4:f7:
    d3:93:ae:03:67:e6:cf:31:b0:a6:50:f9:40:4c:b5:
    cf:66:40:f7
coefficient:
    65:4a:48:3e:4b:a2:fd:5b:ef:97:a5:e0:58:6c:0c:
    91:a1:ff:ec:e1:5f:18:8c:a1:2e:69:c0:fb:25:0b:
    b4:89:ae:45:7b:3b:09:1b:ec:83:34:2f:ba:ee:2f:
    a8:f8:bb:fb:42:f1:19:34:98:9d:b1:e1:ca:e3:58:
    eb:7a:6e:5d
-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQDYjsDqqWseZhgnksNmFpFpsii5mBHT2p99CDe5jONLk3hOflSJ
LiEVvRfxaW4bP/ahUm/4YedBOAWx/qIbp/y33Lry3hCKlcw0S7CDLOuyJYTyR9P4
DV6OdsJbHtd/KMt1oI0MIp5TUeNMx28LpT0mkAV9xRC30w5z9rsPpO96BwIDAQAB
AoGAayWmmfSdRXsqNFpPR7Ge3PcDY2C0YWfoRYrNV4c35ureOagT15P1VrYqpI2P
pvfs5UDOmcyHCSPY3YqpVpm1VbJJ8wpiWboQtQhEZ6Z0faENiFjzYxgY77H5BLh6
9X/MH97ug4ByMkhVQFS5cfAwbyVsw54fj42zKkT5G5e8tXECQQDzAenHtjEQ8KsM
3DwPy98zKLO1l/HhhL9wYVF7HjAeBtrFHnw1LaTz9MKh6Ow/qh78LhEtXYcKVQE9
D3VfsJNtAkEA5CLRD/6UGIk/Lv8Zsg11tikTDPyIcPJdDAay4OlvrHFVBr2B/kpO
YGYQK6r8kT74T1SM1A4YUNOo0e2ppKEmwwJBAI6C1rk6jbfjjEy0c7zH0RPNkOa0
PzQEh8i+KezMHWfemTn00N7W79/p8KLHWJVVjWpTEdvK98EFbP6ELE973FkCQFMx
ayG1CZaE/jiKKHmotONPyTW0JaFikJHhI3wnRGUTExmZI/1yZXB756u099OTrgNn
5s8xsKZQ+UBMtc9mQPcCQGVKSD5Lov1b75el4FhsDJGh/+zhXxiMoS5pwPslC7SJ
rkV7Owkb7IM0L7ruL6j4u/tC8Rk0mJ2x4crjWOt6bl0=
-----END RSA PRIVATE KEY-----

当然公钥也可以转换成字符串:

得到的内容如下:

RSA Public-Key: (1024 bit)
Modulus:
    00:d8:8e:c0:ea:a9:6b:1e:66:18:27:92:c3:66:16:
    91:69:b2:28:b9:98:11:d3:da:9f:7d:08:37:b9:8c:
    e3:4b:93:78:4e:7e:54:89:2e:21:15:bd:17:f1:69:
    6e:1b:3f:f6:a1:52:6f:f8:61:e7:41:38:05:b1:fe:
    a2:1b:a7:fc:b7:dc:ba:f2:de:10:8a:95:cc:34:4b:
    b0:83:2c:eb:b2:25:84:f2:47:d3:f8:0d:5e:8e:76:
    c2:5b:1e:d7:7f:28:cb:75:a0:8d:0c:22:9e:53:51:
    e3:4c:c7:6f:0b:a5:3d:26:90:05:7d:c5:10:b7:d3:
    0e:73:f6:bb:0f:a4:ef:7a:07
Exponent: 65537 (0x10001)
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYjsDqqWseZhgnksNmFpFpsii5
mBHT2p99CDe5jONLk3hOflSJLiEVvRfxaW4bP/ahUm/4YedBOAWx/qIbp/y33Lry
3hCKlcw0S7CDLOuyJYTyR9P4DV6OdsJbHtd/KMt1oI0MIp5TUeNMx28LpT0mkAV9
xRC30w5z9rsPpO96BwIDAQAB
-----END PUBLIC KEY-----

其实也看不懂这些到底是干什么的......

主要是本身对RSA的实现还不了解。

UEFI下的RSA算法

以上的内容让我们知道了RSA的一些基本知识和操作方式。

下面将介绍如何UEFI下使用RSA算法。

UEFI下的OpenSSL

UEFI下有一个Package称为CryptoPkg:

其中就包含了OpenSSL库。

不过默认代码是没有的,需要额外的去下载:

具体可以参考OpenSSL-HOWTO.txt的说明。

下载之后放到上图的目录中,命名位openssl,之后就可以编译。

编译的指令如下:

build -p CryptoPkg/CryptoPkg.dsc -a X64 -t VS2015x86

注意编译的工具可以根据实际情况指定。

编译成功之后可以在Build目录下找到生成的内容:

其中有一个Cryptest.efi可以放到Shell下进行测试:

上图是它的测试结果。

至于它的实现代码,也可以在Cryptest.inf找到。

关于RSA的算法,在如下的代码中:

  Status = ValidateCryptRsa ();
  if (EFI_ERROR (Status)) {
    return Status;
  }

  Status = ValidateCryptRsa2 ();
  if (EFI_ERROR (Status)) {
    return Status;
  }
发布了197 篇原创文章 · 获赞 193 · 访问量 60万+

猜你喜欢

转载自blog.csdn.net/jiangwei0512/article/details/96375874