【问题标题】:GnuPG 1.4 RSA: Where's the Padding?GnuPG 1.4 RSA:填充在哪里?
【发布时间】:2014-05-06 18:33:48
【问题描述】:

为了更好地理解 RSA,我一直在研究 GunPG 1.4 的源代码,特别是 rsa.c 文件中的 RSA 实现。正如标题所说,我无法弄清楚填充发生在哪里。

因此,通常在 RSA 中,填充是在加密之前完成的,并在解密期间取消。加密首先从我们看到的第 409 行开始

int 
rsa_encrypt( int algo, MPI *resarr, MPI data, MPI *pkey )
{
RSA_public_key pk;

if( algo != 1 && algo != 2 )
return G10ERR_PUBKEY_ALGO;

pk.n = pkey[0];
pk.e = pkey[1];
resarr[0] = mpi_alloc( mpi_get_nlimbs( pk.n ) );
public( resarr[0], data, &pk );
return 0;
}

这看起来很简单,它在第 220 行将数据提供给更高的“公共”函数。公共负责计算重要的 (c = m^e mod n) 过程。这一切看起来像:

static void
public(MPI output, MPI input, RSA_public_key *pkey )
{
    if( output == input ) { /* powm doesn't like output and input the same */
    MPI x = mpi_alloc( mpi_get_nlimbs(input)*2 );
    mpi_powm( x, input, pkey->e, pkey->n );
    mpi_set(output, x);
    mpi_free(x);
}
else
mpi_powm( output, input, pkey->e, pkey->n );
}

等一下……现在看来,public 正在将该计算的工作传递给位于 mpi-pow.c 文件中的 mpi_powm()。我会为您省去细节,但该功能会变得很长。

在所有这一切的某个地方,某种 PKCS#1 填充和取消填充(或类似的东西)正在发生,但我无法弄清楚我的一生在哪里。谁能帮我看看填充发生在哪里?

【问题讨论】:

    标签: encryption rsa padding gnupg


    【解决方案1】:

    为了更好地理解 RSA,我一直在玩弄 GnuPG 1.4 的源代码,特别是 rsa.c 文件中的 RSA 实现。

    由于您无论如何都在查看较旧的 (ye olde rsaref.c from gnupg.org”,其中填充以非常明显的方式实现。

    ……某种 PKCS#1……

    确切地说,GnuPG 使用 PKCS #1 v1.5(在 RFC 4880 中指定)。

    谁能帮我看看填充发生在哪里?

    嗯,让我们看看我是否可以在逻辑上总结一下。 GnuGP pads 符合 PKCS #1 v1.5,所以它只是添加随机 pad 来满足长度要求。

    如果您查看cipher/pubkey.c 文件(它的头部包含rsa.h 文件),您会注意到一个pubkey_table_s 结构,它定义了定义键的元素列表。 出于填充原因,随机字节被附加到该列表中(更好:在该结构之后)。这样做是因为这些随机字节很容易通过查找列表的末尾来删除。长话短说,这就是random.c 可能开始对您更有意义的地方。现在,所有这些(以及更多)都被编译到一个名为 libcipher... 的库中,该库本身被编译为由添加填充和按您期望的方式处理 RSA 内容的函数使用。最后,编译的可执行文件使用 libcipher 提供的函数来处理填充 - 取决于个人对填充的需要。

    因此,您目前期望在 1 或 2 个文件中找到的内容,可能 3 个文件实际上分布在超过 6 个文件中……我认为这不是您学习工作的最佳基础。如前所述,出于参考目的,我会选择他们曾经开始使用的 old rsaref.c

    不确定这是否真的提供了您想要获得的所有详细信息,但它应该会给您一个很好的提示……希望对您有所帮助。

    【讨论】:

    • 呃,不是我希望的答案。我认为 OneManRiot 也不希望得到这样的答案。但是正确的答案对我来说已经足够了,我的赏金即将到期:)
    • @owlstead 呃,天哪……谢谢。老实说,我自己也在深入研究 RSA,并在最近几天检查了 GnuGP 1.4 和 2.0 代码。我能说什么?实施分散在各地。最有可能用于优化和功能重用目的。如果您仔细观察,您会注意到旧 rsaref.c 的主要 sn-ps 实际上已被复制和粘贴并进行了一些调整。但它不再那么整齐了。无论如何 - 如果您正在寻找“偏移量”来修剪填充,那么该结构将是您的指南。至于“干净”的 RSA 实现……嗯,有更好的。 ;)
    • 邮件列表在大多数情况下是比官方文档更好的参考,至少对于大多数 O/S 项目来说是这样;)
    【解决方案2】:

    GPG 1.4 根本不使用任何填充。它加密原始会话密钥。

    【讨论】:

    • 你确定吗?我确实看到encode_md_value 被称为我的回答中所写的。有参考吗?否则我将不得不尝试执行此操作,然后原始解密签名以找出 - 比我关心的工作更多。
    猜你喜欢
    • 2015-07-25
    • 2015-11-09
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 2017-10-17
    • 2023-03-18
    相关资源
    最近更新 更多