Encryption 公钥的长度(加密)可以与私钥不同吗?

Encryption 公钥的长度(加密)可以与私钥不同吗?,encryption,cryptography,bit,public-key-encryption,private-key,Encryption,Cryptography,Bit,Public Key Encryption,Private Key,我有一个1024位的私钥,并使用它生成一个公钥。 这是否自动意味着我的公钥也有1024个加密?或者它可以具有较小的加密大小?(512、256…) PS:我最感兴趣的是RSA密钥中模(“n”)的大小。大小通常为1024或2048位。但我很高兴看到这引发了一场讨论,所有这些都激发了我对密码学的兴趣。据我所知,没有要求两个密钥的大小相同。检查下面的如何生成密钥: 然而,我相信,如果一个键(或模数因子)明显更小,它将削弱密码分析的强度 编辑: 这一讨论在很大程度上变得无关紧要,因为OP澄清了他们最感兴

我有一个1024位的私钥,并使用它生成一个公钥。 这是否自动意味着我的公钥也有1024个加密?或者它可以具有较小的加密大小?(512、256…)


PS:我最感兴趣的是RSA密钥中模(“n”)的大小。大小通常为1024或2048位。但我很高兴看到这引发了一场讨论,所有这些都激发了我对密码学的兴趣。

据我所知,没有要求两个密钥的大小相同。检查下面的如何生成密钥:

然而,我相信,如果一个键(或模数因子)明显更小,它将削弱密码分析的强度

编辑:

这一讨论在很大程度上变得无关紧要,因为OP澄清了他们最感兴趣的是模数的大小,这对于加密和解密来说自然是相同的(不包括任何奇怪的未知密码系统)


为了澄清我的观点,我只是说,如果eNo,那么密钥对中的公钥总是与私钥大小匹配,实际上它是从私钥派生出来的

但是,对于某些加密实现,例如,密钥是使用分配给不同任务的子密钥创建的。这些子键之间的大小可以不同,用于创建它们的主键也可以不同。在这些情况下,公钥数据将指示与相应私钥数据匹配的主密钥和子密钥的密钥大小

然而,许多其他公钥实现不使用子密钥(例如),因此您只能看到单个密钥的大小。同样,该密钥大小将在公钥和私钥数据中指示

您将看到的密钥大小的唯一变化是当非对称加密与对称加密结合使用时。对称加密(会话密钥)将更小,但它使用完全不同的算法(例如AES、TWOFISH等),并且不是公钥的一部分(OpenPGP除外,在OpenPGP中可以保存对称密码首选项,因为它不使用实时连接来建立对称加密的通信和交换会话密钥数据)

编辑:关于公钥和私钥数据之间关系的更多详细信息(也称为证明David错误)

指向RSA是非常好的,但它取决于密钥交换协议,为此我们转到和,现在已经过期。这两个例子都有密钥交换方法以及公钥和私钥之间关系的示例和解释

实现此关系的算法(包括和)都同时创建公钥和私钥。特别是通过创建私钥,然后生成公钥。公钥继承私钥的所有特性。只有方法才能获得两者之间不匹配的详细信息组件将以某种方式独立于私钥生成公钥。当然,问题是它们不再是密钥对

RSA和El Gamal的密钥生成说明解释了公钥和私钥之间的公共数据,特别是公钥的所有组件都是私钥的一部分,但私钥包含解密数据和/或签名数据所需的附加数据。在El Gamal中,公钥组件为G、q、G和N而私有分量是G,q,G,h和x

现在,关于算法中没有提到密钥对的位大小,是的,这是真的,但是它们的每个实际实现在生成私钥时都将所选密钥大小作为常量之一(选择所有选项后,包括选择密钥大小和指定密码短语),用于在GnuPG中生成密钥:

static int
do_create( int algo, unsigned int nbits, KBNODE pub_root, KBNODE sec_root,
           DEK *dek, STRING2KEY *s2k, PKT_secret_key **sk, u32 timestamp,
       u32 expiredate, int is_subkey )
{
  int rc=0;

  if( !opt.batch )
    tty_printf(_(
"We need to generate a lot of random bytes. It is a good idea to perform\n"
"some other action (type on the keyboard, move the mouse, utilize the\n"
"disks) during the prime generation; this gives the random number\n"
"generator a better chance to gain enough entropy.\n") );

  if( algo == PUBKEY_ALGO_ELGAMAL_E )
    rc = gen_elg(algo, nbits, pub_root, sec_root, dek, s2k, sk, timestamp,
         expiredate, is_subkey);
  else if( algo == PUBKEY_ALGO_DSA )
    rc = gen_dsa(nbits, pub_root, sec_root, dek, s2k, sk, timestamp,
         expiredate, is_subkey);
  else if( algo == PUBKEY_ALGO_RSA )
    rc = gen_rsa(algo, nbits, pub_root, sec_root, dek, s2k, sk, timestamp,
         expiredate, is_subkey);
  else
    BUG();

  return rc;
}
三种算法之间的细微差异与已发布算法中提及的项目值有关,但在每种情况下,“nbits”都是一个常数


在OpenSSL、OpenSSH和任何其他使用公钥加密的系统中,在生成密钥的代码中,您会发现与密钥大小相关的一致性。在每个实现中,为了拥有匹配的公钥和私钥对,公钥必须从私钥派生。因为私钥是使用密钥生成的y size作为一个常量,该密钥大小必须由公钥继承。如果公钥不包含与私钥的所有正确共享信息,则根据定义,它将与该密钥不匹配,因此加密/解密过程和签名/验证过程将失败。

对于RSA,可以使用公钥小到2位。即数字3可以是您的公钥。
RSA公钥的一个流行选择是17。

这取决于加密算法和您确切地称之为公钥/私钥的内容。有时,与磁盘或网络上的序列化相比,在RAM中使用不同的大小是可能的

RSA RSA公钥由模数
n
和公共指数
e
组成。我们通常为
e
选择一个较小的值(通常为3或65537)。
e
的大小对安全性几乎没有影响。由于
e
通常小于4个字节,而
n
超过100个字节,因此总大小由模数决定。如果确实需要,可以将
e
作为协议规范的一部分进行修复,以便只存储
n

RSA私钥可以用不同的形式表示,但通常我们存储值
p
q
dp
dq
e
d
n
InvQ
。它们的组合大小为