使用RSA-2048服务器公钥加密客户端私钥

时间:2019-07-18 18:34:06

标签: go encryption rsa

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

/* main */

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

clientPrivateKeyAsByte := privateKeyToBytes(clientPrivateKey)

encryptWithPublicKey(clientPrivateKeyAsByte, serverPublicKey) 

致命错误密码/ 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
}

1 个答案:

答案 0 :(得分:0)

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

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