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;
}
}

浙公网安备 33010602011771号