我是否应该验证 RSA 包生成的用户密钥对是否唯一(其他用户没有相同的密钥对)?

Should I make a validation for user's Key Pairs generated by RSA package that the key pairs is unique(other users doesn't have the same key pairs)?

我最近在处理数字签名,想弄清楚如何让每个注册的用户都有自己的密钥对进行编码和解码过程。我使用 Go 构建这种系统,并使用 Go 中的 crypto/rsa package。我已经阅读了一些关于如何制作安全数字签名的文章并找到了很多东西。然后,我尝试构建用于保护非对称加密过程的第一件事。

然后,我面临的第一个问题是我问自己一个问题 “我是否应该创建一个验证,确保没有其他用户拥有 RSA 包生成的密钥对?”这样可以确保每个用户都不会无意或故意伪装成其他用户,因为他们有相同的密钥对(即使机会真的很小)。

请给我一些关于这种情况的见解。如果我的问题不够清楚,请随时提出或投诉,我真的很难考虑我的用户和系统的任何安全方面。

import (
    "crypto/rand"
    "crypto/rsa"
    "encoding/pem"
    ...
)
...
func createKeyPairs(userRegistered *User) (err error) {
    keyPairs, err := rsa.GenerateKey(rand.Reader, 4096)
    if err != nil {
        return err
    }

    // SHOULD I ADD SOME VALIDATION FOR THE KEYPAIRS GENERATED BY CRYPTO RSA AND RAND PACKAGE HERE

    caPrivateKeyPEMFile, err := os.Create(userRequestingCA.ID + "PrivateKey.pem")
    pem.Encode(caPrivateKeyPEMFile, &pem.Block{
        Type:  "RSA PRIVATE KEY",
        Bytes: x509.MarshalPKCS1PrivateKey(keyPairs),
    })

    caPublicKeyPEMFile, err := os.Create(userRequestingCA.ID + "PublicKey.pem")
    pem.Encode(caPublicKeyPEMFile, &pem.Block{
        Type:  "RSA PUBLIC KEY",
        Bytes: x509.MarshalPKCS1PublicKey(&keyPairs.PublicKey),
    })
}

不,你不应该。

主要是因为严格的私钥比对不够,需要确保模数中的两个素数不同

第二个原因是它几乎毫无意义:选择相同质数的可能性极低,你只会浪费时间。

给定一个 4096 位 RSA 密钥,您正在寻找两个 2048 位质数。那些碰撞的机会是天文数字上的小。

可能有用的一种情况是,如果您的机器上有可怕的熵。但是你可能还有其他问题,这可能是一个单独的问题。

有关为什么模素数很重要(相对于原始密钥内容)的更多详细信息,以及计算素数冲突可能性的详细信息,请参阅 this security.se question

第三个原因是它会要求您保留所有用户私钥的参数。你绝对不应该,而且你可能一开始就不应该代表他们生成密钥对。