【问题标题】:Encrypt client-private-key with RSA-2048 server-public-key使用 RSA-2048 服务器公钥加密客户端私钥
【发布时间】:2019-11-27 18:08:36
【问题描述】:

我需要使用 RSA-2048 服务器公钥加密客户端私钥。 我知道私钥显然比公钥长,我不确定是否可能......但我看到在 Python 中完成了类似的任务,所以我想知道你的意见。

/* main */

clientPrivateKey, _ := generateRsaPair(2048)
_, serverPublicKey := generateRsaPair(2048)

clientPrivateKeyAsByte := privateKeyToBytes(clientPrivateKey)

encryptWithPublicKey(clientPrivateKeyAsByte, serverPublicKey) 

致命错误 crypto/rsa:消息对于 RSA 公钥大小来说太长了

/* Functions */

func generateRsaPair(bits int) (*rsa.PrivateKey, *rsa.PublicKey) {
    privkey, err := rsa.GenerateKey(rand.Reader, bits)
    if err != nil {
        log.Error(err)
    }
    return privkey, &privkey.PublicKey
}

func encryptWithPublicKey(msg []byte, pub *rsa.PublicKey) []byte {
    hash := sha512.New()
    ciphertext, err := rsa.EncryptOAEP(hash, rand.Reader, pub, msg, nil)
    checkError(err)

    return ciphertext
}

func privateKeyToBytes(priv *rsa.PrivateKey) []byte {
    privBytes := pem.EncodeToMemory(
        &pem.Block{
            Type:  "RSA PRIVATE KEY",
            Bytes: x509.MarshalPKCS1PrivateKey(priv),
        },
    )

    return privBytes
}

【问题讨论】:

  • 输入是否必须经过 PEM 编码? DER 数据应该短得多。如果一切都失败了,您始终可以对称加密并包装对称密钥。
  • 您是否有理由不能将密钥拆分为 2048 字节的块并分别加密?我想更好的问题是,你从加密客户端的密钥中得到什么?您永远不应该将客户端的密钥发送到服务器。
  • 不,输入是DER数据。 >“始终对称加密并包装对称密钥”我同意,也许这是个好主意。
  • @user2896976 谢谢,> “有什么理由不能将密钥分成 2048 字节的块并加密每个块”不,没有。我想了想,只是搜索了一个更简单的方法。
  • 使用 RSA-2048 server-public-key 加密 client-private-key 这几乎可以肯定是一个错误、误解,或两者兼而有之。

标签: go encryption rsa


【解决方案1】:

如果您想加密大于密钥大小的内容,则可以简单地使用混合加密。您首先使用随机 AES 密钥加密(或包装,如果特定的包装操作可用)私钥的编码,例如使用 AES-CBC 或 AES-CTR(IV 全为零)。然后,您使用私钥加密该 AES 密钥。密文由加密的 AES 密钥和加密的数据组成 - 在本例中为 RSA 私钥。

但是请注意,私钥实际上应该由一个实体管理。它不被称为 private 密钥。分发私钥通常被认为是不好的密钥管理做法。

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    相关资源
    最近更新 更多