rsa 在java中和go语言的使用

这段时间在写个聊天的小demo,账号管理还有注册这些是准备还用java现有框架去做,然后聊天的服务器准备用go去写。中间就涉及到账号认证的问题,需要rsa进行加密。

记录一下。

1. 首先在一个有openssl的环境生成私钥和密钥

genrsa -out rsa_private_key.pem 1024

rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

2.公钥是不需要转成pcks8的,java要使用公钥的话,就需要转换成pcks8的密钥才能用。

pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

3.经过上面的转换后,我们就获得一个公钥,两个私钥(一个是原始的,一个是pcks8的),go语言的只需要用原始的就行了。

4.window下的openssl软件(虽然不是最新的,应该也能用。最好还是用linux服务器生成好一点)

链接:https://pan.baidu.com/s/1Ti1r_48OtkRrGLYBKcsOWw
提取码:fp73

 

具体代码如下(都做了base64的转换,确保跨语言不出现乱码的情况);

go语言:

package util

import (
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/base64"
"encoding/pem"
)
// go 语言支持原生的密钥  java 需要转成pkcs8 才能用
var privateKey = []byte(`
-----BEGIN RSA PRIVATE KEY-----
这是密钥
-----END RSA PRIVATE KEY-----
`)

var publicKey = []byte(`
-----BEGIN PUBLIC KEY-----
这是公钥
-----END PUBLIC KEY-----
`)

// 加密
func RSAEncrypt(origData string) string {
block, _ := pem.Decode(publicKey)
if block == nil {
return "public key error"
}
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return "public key error"
}
pub := pubInterface.(*rsa.PublicKey)

aimByte, _ := rsa.EncryptPKCS1v15(rand.Reader, pub, []byte(origData))
str := base64.StdEncoding.EncodeToString(aimByte)
return str
}

// 解密
func RSADecrypt(ciphertext string) string {

block, _ := pem.Decode(privateKey)
if block == nil {
return "private key error!"
}
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return "private key error!"
}
// base 64 解密
sDec, _ := base64.StdEncoding.DecodeString(ciphertext)
bb, _ := rsa.DecryptPKCS1v15(rand.Reader, priv, sDec)

return string(bb)
}



java语言:
package com.net.test.blog.util;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

public class RSAEncrypt {

// 都是原生的密钥(加密转了)
private static final String USER_PUBLIC_KEY =
"公钥";

private static final String USER_PRIVATE_KEY = "pcks8密钥";


public static String userDecrypt(String str) throws Exception {
//64位解码加密后的字符串
byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
//base64编码的私钥
byte[] decoded = Base64.decodeBase64(USER_PRIVATE_KEY);
RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
//RSA解密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, priKey);
String outStr = new String(cipher.doFinal(inputByte));
return outStr;
}

public static String userEncrypt(String str) throws Exception {
//base64编码的公钥
byte[] decoded = Base64.decodeBase64(USER_PUBLIC_KEY);
RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
//RSA加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
return outStr;
}

}

posted @ 2022-01-16 12:03  努力的机械佬  阅读(564)  评论(1)    收藏  举报