Golang中是否有类似以下RSA加密模块的实现?

Golang中是否有类似以下RSA加密模块的实现? 你好,我正在尝试使用 Go 来访问另一个 API,但这个 API 要求密码以一种特殊的方式进行加密,只能通过以下(旧的)GitHub 仓库中的 encryptPublicLong(text: string, publicKey: string) 函数来实现:https://github.com/lsqswl/rsaencrypt/blob/master/lib/index.js

我对加密领域非常陌生,所以实际上我只是想问一下,这具体是哪种加密类型,以及 Go 中是否有与以下 encryptPublicLong 函数等效的实现?

// 此处应放置等效的 Go 代码实现

更多关于Golang中是否有类似以下RSA加密模块的实现?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

4 回复

虽然我认为这与RSA相关,但我不确定应该使用哪种实现,因为有很多加密函数,例如 EncryptOAEPEncryptPKCS1v15

更多关于Golang中是否有类似以下RSA加密模块的实现?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


虽然没有阅读那个 JS 文件,但仅凭名称猜测,你是否检查过 crypto/rsa 包?

也许这段代码能帮到你。

package ciphers

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha512"
	"crypto/x509"
	"encoding/pem"
        "log"
)

此文件已被截断。显示原文

这是基于 Node.js RSA 加密库的 Go 语言实现。该函数使用 RSA-OAEP 填充方案和 SHA-1 哈希算法进行非对称加密,支持长文本的分段加密。

package main

import (
	"crypto/rand"
	"crypto/rsa"
	"crypto/sha1"
	"crypto/x509"
	"encoding/base64"
	"encoding/pem"
	"errors"
	"fmt"
	"math"
)

// EncryptPublicLong 模拟原 Node.js 库的 encryptPublicLong 函数
func EncryptPublicLong(text string, publicKeyStr string) (string, error) {
	// 解析 PEM 格式的公钥
	block, _ := pem.Decode([]byte(publicKeyStr))
	if block == nil {
		return "", errors.New("failed to parse PEM block containing public key")
	}

	// 解析公钥
	pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
	if err != nil {
		return "", fmt.Errorf("failed to parse public key: %v", err)
	}

	publicKey, ok := pubInterface.(*rsa.PublicKey)
	if !ok {
		return "", errors.New("not an RSA public key")
	}

	// 计算分段大小(与 Node.js 库保持一致)
	keySize := publicKey.Size()
	maxLength := keySize - 42 // RSA-OAEP with SHA-1 的填充长度

	// 分段加密
	var encryptedParts []byte
	textBytes := []byte(text)

	for i := 0; i < len(textBytes); i += maxLength {
		end := i + maxLength
		if end > len(textBytes) {
			end = len(textBytes)
		}

		chunk := textBytes[i:end]
		
		// 使用 RSA-OAEP 和 SHA-1 进行加密
		encryptedChunk, err := rsa.EncryptOAEP(
			sha1.New(),
			rand.Reader,
			publicKey,
			chunk,
			nil,
		)
		if err != nil {
			return "", fmt.Errorf("encryption failed: %v", err)
		}

		encryptedParts = append(encryptedParts, encryptedChunk...)
	}

	// 返回 Base64 编码结果
	return base64.StdEncoding.EncodeToString(encryptedParts), nil
}

// 示例使用
func main() {
	// 示例公钥(PEM 格式)
	publicKeyPEM := `-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzJ5VicZPwzL8XwuqV8qS
...
-----END PUBLIC KEY-----`

	// 要加密的文本
	text := "This is a long text that needs to be encrypted using RSA-OAEP with SHA-1"

	// 执行加密
	encrypted, err := EncryptPublicLong(text, publicKeyPEM)
	if err != nil {
		fmt.Printf("加密失败: %v\n", err)
		return
	}

	fmt.Printf("加密结果: %s\n", encrypted)
}

// 辅助函数:计算分段大小
func calculateChunkSize(publicKey *rsa.PublicKey) int {
	keySize := publicKey.Size()
	// RSA-OAEP with SHA-1 的填充开销为 42 字节
	return keySize - 42
}

// 验证函数:确保与 Node.js 库兼容
func verifyEncryption(text, publicKeyStr string) error {
	// 这里可以添加与原始 Node.js 库输出的对比验证
	// 确保 Base64 编码、分段逻辑和加密参数一致
	return nil
}

关键实现细节:

  1. 加密算法:RSA-OAEP 填充方案,使用 SHA-1 哈希算法
  2. 分段处理:对于长文本,按照 (密钥长度 - 42) 的大小进行分段加密
  3. 密钥格式:支持 PEM 编码的 X.509 公钥
  4. 输出格式:Base64 编码的二进制数据

如果需要与原始 Node.js 库完全兼容,请确保:

  • 使用相同的公钥格式
  • 验证 Base64 编码输出是否一致
  • 确认分段大小计算完全匹配

这个实现应该能够替代原 Node.js 库的 encryptPublicLong 函数功能。

回到顶部