Golang Go语言中怎么实现 rsa 加解密
一般是公钥加密,私钥解密。 但是这份代码,需要私钥加密,公钥解密。
下边是 php 代码,公钥解密
function public_key_decrypt($data, $public_key)
{
$public_key = '-----BEGIN PUBLIC KEY-----' . "\n" . $public_key . "\n" . '-----END PUBLIC KEY-----';
$data = base64_decode($data);
$pu_key = openssl_pkey_get_public($public_key);
$crypto = '';
foreach (str_split($data, 128) as $chunk) {
openssl_public_decrypt($chunk, $decryptData, $pu_key);
$crypto .= $decryptData;
}
return $crypto;
}
用 chatgpt 转化为 golang 的时候代码有问题。 想问下该怎么处理。
func (t *TopPayService) rsaPublicDecrypt(publicKey *rsa.PublicKey, encryptedData []byte) ([]byte, error) { // 使用 RSA OAEP 解密 decryptedData, err := rsa.DecryptOAEP( sha256.New(), // 使用 SHA-256 作为哈希函数 rand.Reader, // 随机数生成器 publicKey, // 公钥 encryptedData, // 加密的数据 nil, // 可选的 label ,默认为 nil ) if err != nil { return nil, err } return decryptedData, nil }
Golang Go语言中怎么实现 rsa 加解密
更多关于Golang Go语言中怎么实现 rsa 加解密的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang Go语言中怎么实现 rsa 加解密的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
我需要的是公钥解密
go get github.com/farmerx/gorsa
找到了这个扩展
传说中的变态模式,私钥加密公钥解密
RSA 的密钥是成对的,不存在那个就必须是公钥,那个就是私钥。都是人为指定的。
一样的,本来是公钥加密私钥解密,你现在反过来了,那还是用公钥加密当解密用,只是个函数名而已。
私钥加密公钥解密,与签名等效
私钥加密,公钥解密,这叫数字签名
一般公钥解密叫验证私钥的签名,如果是向指定公钥传递加密信息应该考虑密钥协商,再一个 RSA 太长了,建议换 ed25519 或者类似的短一点的加密方式
让我想起很久以前写的 rsa 库,为了用 go 重构 php 中历史代码的加解密逻辑,不得不自己写一套…应该还能用
https://github.com/sysulq/rsa
谢谢大家,@sophos 你写的我让 chatgpt 给解析下
这个代码实现了 RSA 加密和解密的一些功能,以下是对代码的详细解释:
错误定义
定义了一些可能会在 RSA 加密/解密过程中遇到的错误:
ErrDataToLarge:
ErrDataLen:
ErrDataBroken:
ErrKeyPairDismatch:
ErrDecryption:
ErrPublicKey:
ErrPrivateKey: 获取私钥错误。
公钥解密函数
pubKeyDecrypt
用公钥解密数据:
计算模数的字节长度,并检查数据长度是否符合要求。
将数据转换为大整数,并检查数据是否超出模数的范围。
通过模幂运算解密数据。
去掉填充字节,返回解密后的数据。
LeftUnPad
去掉左边的填充字节:
检查第一个字节是否为 0 。
检查第二个字节是否为 0 或 1 。
找到第一个非零字节的索引,返回剩余的数据。
RightUnPad
去掉右边的填充字节:
从右边开始找到第一个非零字节的索引,返回剩余的数据。
私钥加密函数
priKeyEncrypt
用私钥加密数据:
计算模数的字节长度,检查数据长度是否符合要求。
创建加密的消息,填充数据。
通过模幂运算加密数据,返回加密后的数据。
公钥和私钥加密/解密读写器
pubKeyIO
用公钥进行加密或解密:
根据是否加密,调整块大小。
读取数据块,加密或解密数据块,写入输出。
priKeyIO
用私钥进行加密或解密:
根据是否加密,调整块大小。
读取数据块,加密或解密数据块,写入输出。
公钥和私钥加密/解密字节数组
PubKeyByte
用公钥加密或解密字节数组:
根据是否加密,调整块大小。
如果数据长度小于块大小,直接加密或解密。
否则,通过读写器进行处理,返回处理后的数据。
PriKeyByte
用私钥加密或解密字节数组:
根据是否加密,调整块大小。
如果数据长度小于块大小,直接加密或解密。
否则,通过读写器进行处理,返回处理后的数据。
获取公钥和私钥函数
GetPubKey
从 Base64 编码的字符串中读取公钥:
解码 Base64 字符串,调用 GetPubKeyFromPem 解析 PEM 格式的公钥。
GetPubKeyFromPem
从
解码 PEM 格式的公钥,解析成 RSA 公钥。
GetPriKey
从 Base64 编码的字符串中读取私钥:
解码 Base64 字符串,调用 GetPriKeyFromPem 解析 PEM 格式的私钥。
GetPriKeyFromPem
从 PEM 格式的字节数组中读取私钥:
解码 PEM 格式的私钥,解析成 RSA 私钥。
内部工具函数
encrypt
加密函数,执行模幂运算。
decrypt
解密函数,执行模幂运算。
copyWithLeftPad
在左边填充 0 以适应指定大小。
nonZeroRandomBytes
生成非零的随机字节。
leftPad
在左边填充字节以适应指定大小。
modInverse
计算
这些函数和方法共同实现了 RSA 公钥加密、私钥解密、私钥加密、公钥解密的功能,包括读取和解析公钥/私钥文件,处理填充和数据块的分割等。
在Golang中实现RSA加解密,通常使用标准库中的crypto/rsa
和crypto/rand
包,以及crypto/x509
和encoding/pem
包来处理公钥和私钥的编码和解码。以下是一个简单的示例,展示了如何使用RSA进行加密和解密:
-
生成RSA密钥对: 使用
rsa.GenerateKey
函数生成一个RSA密钥对。 -
加密: 使用公钥(
*rsa.PublicKey
)和rsa.EncryptPKCS1v15
函数进行加密。注意,RSA加密的数据长度有限制,通常需要对数据进行分段加密。 -
解密: 使用私钥(
*rsa.PrivateKey
)和rsa.DecryptPKCS1v15
函数进行解密。
示例代码如下:
package main
import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"fmt"
"os"
)
func main() {
// 生成密钥对
priv, err := rsa.GenerateKey(rand.Reader, 2048)
if err != nil {
fmt.Println(err)
return
}
// 保存私钥到文件
privFile, err := os.Create("private_key.pem")
if err != nil {
fmt.Println(err)
return
}
pem.Encode(privFile, &pem.Block{
Type: "RSA PRIVATE KEY",
Bytes: x509.MarshalPKCS1PrivateKey(priv),
})
privFile.Close()
// 类似地,可以保存公钥到文件,并进行加密和解密操作
// ...
}
注意,实际应用中还需处理错误、分段加密/解密等细节。