erlang 如何使用Elixir生成GPG兼容和PEM编码的密钥?

e5njpo68  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(225)

我正在尝试创建一个Elixir代码,它将生成GnuPG兼容的密钥对,并且能够加密、解密和签名消息。但它还可以导出PEM格式的密钥和消息,这一点也很重要,这样用户就可以在GnuPG实现中使用它。
我是这样开始尝试的:

defmodule GPG do
  def test do
    private_key = generate_private_key()
    public_pem = pem_encoded_public_key(private_key)

    IO.puts("Public Key PEM:")
    IO.puts(public_pem)
  end

  defp pem_encoded_public_key(private_key) do
    private_key
    |> public_key_from_private_key()
    |> pem_entry_encode(:RSAPublicKey)
  end

  defp generate_private_key do
    :public_key.generate_key({:rsa, 2048, 65537})
  end

  defp public_key_from_private_key(private_key) do
    {:RSAPublicKey, elem(private_key, 2), elem(private_key, 2)}
  end

  defp pem_entry_encode(key, type) do
    :public_key.pem_encode([:public_key.pem_entry_encode(type, key)])
  end
end

如果我在iEx上运行GNU.test(),它将输出:

iex(3)> GPG.test()
Public Key PEM:
-----BEGIN RSA PUBLIC KEY-----
MIICCgKCAQEAxEKcdLQmc8ik+srOf/hVTUzADGOVOrtOAigyqCMmtxAmNW4fTj5+
3MTSBTHQLSO0gWeuq2gR2Qrb/vd0d3OOielAudonvgo3enDL2jDp49zokB333LgK
64QK+l1erkjmy1Atj2fbXJAE0O2VzZmfMjCUGBJJQ/cklWXZH0Qczjojith2VHJU
jx4OoGHzIOOJ9qDOPPrY43vvymWs4CEM7OPUKq37MDfU0yxtSGoBERW2a/4jUOlk
JNQSBzjUSfd7VZaIziyF8NRy47j1ErrES3DS8m5zPoR/d+qyrQs0pg1S7Wgr9Aws
tpwM6yFEKhK507S4gdBuVWqyIVuiI/HcmwKCAQEAxEKcdLQmc8ik+srOf/hVTUzA
DGOVOrtOAigyqCMmtxAmNW4fTj5+3MTSBTHQLSO0gWeuq2gR2Qrb/vd0d3OOielA
udonvgo3enDL2jDp49zokB333LgK64QK+l1erkjmy1Atj2fbXJAE0O2VzZmfMjCU
GBJJQ/cklWXZH0Qczjojith2VHJUjx4OoGHzIOOJ9qDOPPrY43vvymWs4CEM7OPU
Kq37MDfU0yxtSGoBERW2a/4jUOlkJNQSBzjUSfd7VZaIziyF8NRy47j1ErrES3DS
8m5zPoR/d+qyrQs0pg1S7Wgr9AwstpwM6yFEKhK507S4gdBuVWqyIVuiI/Hcmw==
-----END RSA PUBLIC KEY-----

但是如果我创建一个test_public_key.txt文件,将这个给定的密钥作为内容,并运行GnuPG来评估它,就会发生这种情况:

$ gpg --show-keys test_public_key.txt 
gpg: no valid OpenPGP data found.

我在想我错过了什么。

3okqufwl

3okqufwl1#

我相信gpg期望这种格式

header -> -----BEGIN PGP PUBLIC KEY BLOCK-----
empty  -> 
key    -> blablablablablablablablablablablabla
key    -> blablablablablablablablablablablabla
header -> -----END PGP PUBLIC KEY BLOCK-----

只需手动更改标题并添加一个空行。

相关问题