Go-RSA解密 --ECB模式

前言

本文是一个使用GO-RSA解密的一个例子,我们使用的是ECB模式。使用到的库是 github.com/smartwalle/crypto4go


一、Rsa解密

1.引入库

我们引入库的时候,可以使用go get。如果开启了go mod,也可以使用go mod 下载。

go get github.com/smartwalle/crypto4go

2.代码部分

思路就是,把我们的密钥key 和要解密的数据data,转换成base64格式的字符串,传入封装好的方法中,会返回解密后的数据。
下面包含了一个完整的例子,复制过去应该就可以执行测试。

package main

import (
	"bytes"
	"crypto/rand"
	"crypto/rsa"
	"encoding/base64"
	"fmt"
	"log"
	"strings"

	"github.com/smartwalle/crypto4go"
)
func main() {
	data :="bo4iVXaCbS7t6SRvD7mJdZL/ugiC+qpssSQYfh4GXwBIzP3wa8Pk+MC7EzCEIaBt1TQVR41WW41tz7TV1xlKTl0+proxd498oUgyG9IcnpmJ5BVnWepZGL5xvgYxoo4DKq3RgJkTXlwJlThxgglDV+Lbv2kVfIipmYNnwriQgWg="
	privateKey :="MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAL6CtOwMoKpxEGw8WTuf6NRuUDGXUXb3rOOo6NZ65U3bYgGE3z6b880eQF37Wd2WBDcUKfBiw2xwhunqAQLSq9XDlIcejydctNsTb+HV8FmqqMEzC4mO4O10N4l4hEIkcHomOk1+wdvgEx555P/TwMPvG5zUxneKTpMdaDxHnf3TAgMBAAECgYAEYvQRf1Tvt7y+EUGouszcn1GfYrGQgLFtaIU78wZ2nXeLO2j8gxDBB1JKF7CBBqRANGmmzE9dntWsayPs0bb9IdHXXHby1oZ62wMX7pfwBrvf5wOCz8JazRYZjaP7dOP3dGHWGEtX2I5SFG43hRwrvT7AMnB5YTWSjapAQEPQAQJBAPYt5gJ5XFmAwOXZ977lR96AgV62nuFFRRJjrX/7eh0jvhp1AVDa8fW95PQY+h3F8OJwZBDYYXVQ9zrNr4QWZdMCQQDGHErgUPL4H1crDK2UGLS3TqbTPmIQp5uVauhmNMnqjqtceWI2I/an+NPx+4hI8rTzekmyrn+oQP/wCgX5owgBAkEA7Q4dotxCdV1qYuuViZk3r6aG7TFlpP8TGDYr6EW8vTqh4NAyyC1NOZn2UqeKkgj9gM9BTIdQsauZpmJSVRtMSQJBAMR7Lu/GmRLo0mUJz+V/k0vyH5aG2m+2K6JHQ3KKjG+rS90NLhCQHoN9T4dBdmsS+9A2yn0Cf+15edyxtDdgMAECQQCTHpjhdcfIbUNktNtbbb9X5oHjtooUsbavqePAQTZB5dl8j5caCa2KkC0P+hvfid8BFZ5fJAVsO0U6QrKvusxx"
	
	aeskey, err := RSADecryptByPrivateKey(data , privateKey )
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Println(aeskey)//3WZHqust0PBS9z5CBBbQig==
}

func RSADecryptByPrivateKey(data string, privateKey string) (string, error) {
	priKey, err := crypto4go.ParsePKCS1PrivateKey(crypto4go.FormatPKCS1PrivateKey(string(privateKey)))
	if err != nil {
		priKey, err = crypto4go.ParsePKCS8PrivateKey(crypto4go.FormatPKCS8PrivateKey(string(privateKey)))
		if err != nil {
			fmt.Println("ParsePKCS8PrivateKey : ", err.Error())
			return "", err
		}
	}

	key, err := base64.StdEncoding.DecodeString(data)
	if err != nil {
		fmt.Println("base64.RawURLEncoding.DecodeString : ", err.Error())
		return "", err
	}
	partLen := priKey.N.BitLen() / 8
	chunks := split([]byte(key), partLen)
	buffer := bytes.NewBufferString("")

	for _, chunk := range chunks {
		decrypted, err := rsa.DecryptPKCS1v15(rand.Reader, priKey, chunk)
		if err != nil {
			return "", err
		}
		buffer.Write(decrypted)
	}
	return buffer.String(), err
}
func split(buf []byte, lim int) [][]byte {
	var chunk []byte
	chunks := make([][]byte, 0, len(buf)/lim+1)
	for len(buf) >= lim {
		chunk, buf = buf[:lim], buf[lim:]
		chunks = append(chunks, chunk)
	}
	if len(buf) > 0 {
		chunks = append(chunks, buf[:len(buf)])
	}
	return chunks
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RSA/ECB/OAEPWithSHA-256AndMGF1Padding是一种RSA加密算法,使用OAEP(Optimal Asymmetric Encryption Padding)填充,使用SHA-256哈希函数和MGF1(Mask Generation Function 1)填充。 以下是Java代码示例: ```java import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.SecureRandom; import java.security.spec.MGF1ParameterSpec; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import javax.crypto.Cipher; import javax.crypto.spec.OAEPParameterSpec; import javax.crypto.spec.PSource; public class RSAEncryption { // 生成RSA密钥对 public static KeyPair generateRSAKeyPair() throws Exception { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048, new SecureRandom()); return keyPairGenerator.generateKeyPair(); } // RSA加密 public static byte[] encryptRSA(byte[] data, PublicKey publicKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); OAEPParameterSpec oaepParameterSpec = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-256"), PSource.PSpecified.DEFAULT); cipher.init(Cipher.ENCRYPT_MODE, publicKey, oaepParameterSpec); return cipher.doFinal(data); } // RSA解密 public static byte[] decryptRSA(byte[] data, PrivateKey privateKey) throws Exception { Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding"); OAEPParameterSpec oaepParameterSpec = new OAEPParameterSpec("SHA-256", "MGF1", new MGF1ParameterSpec("SHA-256"), PSource.PSpecified.DEFAULT); cipher.init(Cipher.DECRYPT_MODE, privateKey, oaepParameterSpec); return cipher.doFinal(data); } // 测试 public static void main(String[] args) throws Exception { // 生成RSA密钥对 KeyPair keyPair = generateRSAKeyPair(); PublicKey publicKey = keyPair.getPublic(); PrivateKey privateKey = keyPair.getPrivate(); // 加密数据 byte[] data = "Hello, RSA!".getBytes(); byte[] encryptedData = encryptRSA(data, publicKey); // 解密数据 byte[] decryptedData = decryptRSA(encryptedData, privateKey); // 输出结果 System.out.println("原始数据:" + new String(data)); System.out.println("加密后的数据:" + new String(encryptedData)); System.out.println("解密后的数据:" + new String(decryptedData)); } } ``` 需要注意的是,RSA加密算法不适合加密大量数据,因为加密后的数据长度会比原始数据长度长很多,而且加密速度较慢,所以一般只用于加密对称加密算法的密钥。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值