Go 实现工具包(import调用该包即可)

package xrsa
import ("encoding/pem""encoding/base64""crypto/x509""crypto/rsa""crypto/rand""errors""crypto""io""bytes""encoding/asn1"
)
const (CHAR_SET = "UTF-8"BASE_64_FORMAT = "UrlSafeNoPadding"RSA_ALGORITHM_KEY_TYPE = "PKCS8"RSA_ALGORITHM_SIGN = crypto.SHA256
)
type XRsa struct {publicKey *rsa.PublicKeyprivateKey *rsa.PrivateKey
}
// 生成密钥对
func CreateKeys(publicKeyWriter, privateKeyWriter io.Writer, keyLength int) error {// 生成私钥文件privateKey, err := rsa.GenerateKey(rand.Reader, keyLength)if err != nil {return err}derStream := MarshalPKCS8PrivateKey(privateKey)block := &pem.Block{Type:  "PRIVATE KEY",Bytes: derStream,}err = pem.Encode(privateKeyWriter, block)if err != nil {return err}// 生成公钥文件publicKey := &privateKey.PublicKeyderPkix, err := x509.MarshalPKIXPublicKey(publicKey)if err != nil {return err}block = &pem.Block{Type:  "PUBLIC KEY",Bytes: derPkix,}err = pem.Encode(publicKeyWriter, block)if err != nil {return err}return nil
}
func NewXRsa(publicKey []byte, privateKey []byte) (*XRsa, error) {block, _ := pem.Decode(publicKey)if block == nil {return nil, errors.New("public key error")}pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)if err != nil {return nil, err}pub := pubInterface.(*rsa.PublicKey)block, _ = pem.Decode(privateKey)if block == nil {return nil, errors.New("private key error!")}priv, err := x509.ParsePKCS8PrivateKey(block.Bytes)if err != nil {return nil, err}pri, ok := priv.(*rsa.PrivateKey)if ok {return &XRsa {publicKey: pub,privateKey: pri,}, nil} else {return nil, errors.New("private key not supported")}
}
// 公钥加密
func (r *XRsa) PublicEncrypt(data string) (string, error) {partLen := r.publicKey.N.BitLen() / 8 - 11chunks := split([]byte(data), partLen)buffer := bytes.NewBufferString("")for _, chunk := range chunks {bytes, err := rsa.EncryptPKCS1v15(rand.Reader, r.publicKey, chunk)if err != nil {return "", err}buffer.Write(bytes)}return base64.RawURLEncoding.EncodeToString(buffer.Bytes()), nil
}
// 私钥解密
func (r *XRsa) PrivateDecrypt(encrypted string) (string, error) {partLen := r.publicKey.N.BitLen() / 8raw, err := base64.RawURLEncoding.DecodeString(encrypted)chunks := split([]byte(raw), partLen)buffer := bytes.NewBufferString("")for _, chunk := range chunks {decrypted, err := rsa.DecryptPKCS1v15(rand.Reader, r.privateKey, chunk)if err != nil {return "", err}buffer.Write(decrypted)}return buffer.String(), err
}
// 数据加签
func (r *XRsa) Sign(data string) (string, error) {h := RSA_ALGORITHM_SIGN.New()h.Write([]byte(data))hashed := h.Sum(nil)sign, err := rsa.SignPKCS1v15(rand.Reader, r.privateKey, RSA_ALGORITHM_SIGN, hashed)if err != nil {return "", err}return base64.RawURLEncoding.EncodeToString(sign), err
}
// 数据验签
func (r *XRsa) Verify(data string, sign string) error {h := RSA_ALGORITHM_SIGN.New()h.Write([]byte(data))hashed := h.Sum(nil)decodedSign, err := base64.RawURLEncoding.DecodeString(sign)if err != nil {return err}return rsa.VerifyPKCS1v15(r.publicKey, RSA_ALGORITHM_SIGN, hashed, decodedSign)
}
func MarshalPKCS8PrivateKey(key *rsa.PrivateKey) []byte {info := struct {Version             intPrivateKeyAlgorithm []asn1.ObjectIdentifierPrivateKey          []byte}{}info.Version = 0info.PrivateKeyAlgorithm = make([]asn1.ObjectIdentifier, 1)info.PrivateKeyAlgorithm[0] = asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1}info.PrivateKey = x509.MarshalPKCS1PrivateKey(key)k, _ := asn1.Marshal(info)return k
}
func split(buf []byte, lim int) [][]byte {var chunk []bytechunks := 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
}

php实现

if (! function_exists('url_safe_base64_encode')) {function url_safe_base64_encode ($data) {return str_replace(array('+','/', '='),array('-','_', ''), base64_encode($data));}
}if (! function_exists('url_safe_base64_decode')) {function url_safe_base64_decode ($data) {$base_64 = str_replace(array('-','_'),array('+','/'), $data);return base64_decode($base_64);}
}class XRsa
{const CHAR_SET = "UTF-8";const BASE_64_FORMAT = "UrlSafeNoPadding";const RSA_ALGORITHM_KEY_TYPE = OPENSSL_KEYTYPE_RSA;const RSA_ALGORITHM_SIGN = OPENSSL_ALGO_SHA256;protected $public_key;protected $private_key;protected $key_len;public function __construct($pub_key, $pri_key = null){$this->public_key = $pub_key;$this->private_key = $pri_key;$pub_id = openssl_get_publickey($this->public_key);$this->key_len = openssl_pkey_get_details($pub_id)['bits'];}/** 创建密钥对*/public static function createKeys($key_size = 2048){$config = array("private_key_bits" => $key_size,"private_key_type" => self::RSA_ALGORITHM_KEY_TYPE,);$res = openssl_pkey_new($config);openssl_pkey_export($res, $private_key);$public_key_detail = openssl_pkey_get_details($res);$public_key = $public_key_detail["key"];return ["public_key" => $public_key,"private_key" => $private_key,];}/** 公钥加密*/public function publicEncrypt($data){$encrypted = '';$part_len = $this->key_len / 8 - 11;$parts = str_split($data, $part_len);foreach ($parts as $part) {$encrypted_temp = '';openssl_public_encrypt($part, $encrypted_temp, $this->public_key);$encrypted .= $encrypted_temp;}return url_safe_base64_encode($encrypted);}/** 私钥解密*/public function privateDecrypt($encrypted){$decrypted = "";$part_len = $this->key_len / 8;$base64_decoded = url_safe_base64_decode($encrypted);$parts = str_split($base64_decoded, $part_len);foreach ($parts as $part) {$decrypted_temp = '';openssl_private_decrypt($part, $decrypted_temp,$this->private_key);$decrypted .= $decrypted_temp;}return $decrypted;}/** 私钥加密*/public function privateEncrypt($data){$encrypted = '';$part_len = $this->key_len / 8 - 11;$parts = str_split($data, $part_len);foreach ($parts as $part) {$encrypted_temp = '';openssl_private_encrypt($part, $encrypted_temp, $this->private_key);$encrypted .= $encrypted_temp;}return url_safe_base64_encode($encrypted);}/** 公钥解密*/public function publicDecrypt($encrypted){$decrypted = "";$part_len = $this->key_len / 8;$base64_decoded = url_safe_base64_decode($encrypted);$parts = str_split($base64_decoded, $part_len);foreach ($parts as $part) {$decrypted_temp = '';openssl_public_decrypt($part, $decrypted_temp,$this->public_key);$decrypted .= $decrypted_temp;}return $decrypted;}/** 数据加签*/public function sign($data){openssl_sign($data, $sign, $this->private_key, self::RSA_ALGORITHM_SIGN);return url_safe_base64_encode($sign);}/** 数据签名验证*/public function verify($data, $sign){$pub_id = openssl_get_publickey($this->public_key);$res = openssl_verify($data, url_safe_base64_decode($sign), $pub_id, self::RSA_ALGORITHM_SIGN);return $res;}
}

Golang-RSA加密解密-数据无大小限制(gophp)相关推荐

  1. 加密解密_使用RSA密钥对加密解密数据

    使用RSA密钥对加密解密数据 作者: 郭政鸿 2021/1/6 前言: 前几天看了非对称加密, 那非对称加密处理常见的https中的应用, 平时我们可以用来做什么呢? 1. 生成RSA密钥对 使用op ...

  2. golang实现RSA加密解密算法

    golang实现RSA加密解密算法 前言 一.生成密钥对(公钥私钥) 二.根据公钥加密 二.根据私钥解密 总结 前言 直接看正文吧! 一.生成密钥对(公钥私钥) 代码如下(示例): //生成私钥pri ...

  3. RSA加密解密算法的java实现

    最近有一个外部合作项目要求在数据传输过程中使用RSA加密算法对数据进行加密,所以需要编写一个加解密的工具类,因为对方不是java语言,所以是各自实现的这个工具,本文主要讨论实现以及双方调试过程中的一些 ...

  4. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  5. Java使用RSA加密解密签名及校验

    RSA加密解密类: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; i ...

  6. C#的RSA加密解密签名,就为了支持PEM PKCS#8格式密钥对的导入导出

    差点造了一整个轮子 .Net Framework 4.5 里面的RSA功能,并未提供简单对PEM密钥格式的支持(.Net Core有咩?),差点(还远着)造了一整个轮子,就为了支持PEM PKCS#8 ...

  7. java rsa 验_Java使用RSA加密解密签名及校验

    RSA加密解密类: package com.ihep; import java.io.BufferedReader; import java.io.BufferedWriter; import jav ...

  8. python rsa加密解密_RSA加密解密(python版)

    RSA的算法涉及三个参数,n.e.d. 其中,n是两个大质数p.q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度. e1和d是一对相关的值,e可以任意取,但要求e与(p-1)*(q-1)互质: ...

  9. IOS之RSA加密解密与后台之间的双向加密详解

    IOS之RSA加密解密与后台之间的双向加密详解 序言 因为项目中需要用到RSA加密,刚开始也是有点乱,这两天也整理的差不多了,希望能帮到大家. 这次先上代码,我想大部分人肯定是着急解决问题,所以不要废 ...

最新文章

  1. springboot初学
  2. ADSL的PPPOE拨号客户端上的ppp authentication pap “callin”的正确理解
  3. margin 0 auto 什么意思
  4. asynchttpclient 超时_DNF:95更新前还能免费获得一件超时空装备?但这个任务一定完成...
  5. java.util.Stack类简介
  6. ftp 客户端 使用http代理 源码_代理服务器连接HTTPS过程
  7. 计算机组成原理算术运算实验报告,计算机组成原理算术逻辑运算实验报告
  8. spring更新后 外层事务查不到_再深一点:面试工作两不误,源码级理解Spring事务...
  9. 遍历WinForm窗体 根据语言类型设置其控件Text显示
  10. Python+pandas处理Excel文件案例一则
  11. 基于安卓手机的WAPI证书安装使用详解
  12. 企业信息系统战略规划
  13. Rocket-chip-l2bus
  14. win10强制删除文件夹(“你需要来自XXX的权限才能对此文件夹进行更改”的解决方法)
  15. RGB色彩模式与CMYK色彩模式参数转换公式
  16. work bench 建表时PK/NN/ UQ等的含义
  17. Java线程中,Blocked,Wait,以及TIMED_WAIT的区别
  18. unity 开发EasyAR发布IOS和安卓坑记录
  19. 按址索骥,直捣黄龙-指针法在字符串str中每个ch2字符后都添加一个ch3字符
  20. django项目manage.py指定IP和端口

热门文章

  1. 大学计算机英语听力,计算机二级 -【听力改革】大学英语六级听力改革基础训练 TEST 5(附音频MP3) -我要模考网...
  2. multiset upper_bound() 与 lower_bound()
  3. 互联网晚报 | 8月23日|共享充电宝涨至4元/小时;公安部辟谣2022红绿灯新国标:不存在;滴滴高德曹操首汽等11家公司被约谈...
  4. Pytorch中如何理解RNN LSTM GRU的input(重点理解seq_len / time_steps)
  5. Websocket无法连接
  6. user-select的详细用法
  7. c/c++ 有n个人围成一圈, 顺序排号。从第1个人开始报数(从1~3报数), 凡报到3的人退出圈子, 问最后留下的人原来排在第几号。
  8. Android aab安装到手机
  9. Unity初级案例-愤怒的小鸟:三:07猪的受伤+08弹弓划线操作+09死亡和加分特效的制作+10游戏逻辑的判定,实现多只小鸟的飞出
  10. 和Timesten有个约会--Timesten技术专栏系列(一)