Rsa 비대 칭 암호 화 알고리즘,자바,golang 언어 상호 연결

Rsa 알고리즘 은 비대 칭 암호 화 입 니 다.일반 공개 키 암호 화,비밀 키 복호화 입 니 다.본 고 는 주로 자바 단 에서 키 쌍 을 생 성하 고 공개 키 암호 화 데 이 터 를 사용 하여 비밀 키 를 golang 단 에 보 냅 니 다.golang 단 은 비밀 키 를 사용 하여 복호화 하고 빅 데이터 의 세그먼트 암호 화 를 지원 합 니 다.
자바 코드:
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.ArrayUtils;

import javax.crypto.Cipher;
import java.io.*;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

public class RSAEncrypt {
    private static Map keyMap = new HashMap();  //              
    public static void main(String[] args) throws Exception {
        //       
        genKeyPair();
        //     
        String message = readString4("D:\\3575.txt");
        System.out.println("        :" + keyMap.get(0));
        System.out.println("        :" + keyMap.get(1));
        String messageEn = encrypt(message,keyMap.get(0));
//        System.out.println(message + "\t        :" + messageEn);
        FileOutputStream os = new FileOutputStream("D:\\3575.dat");
        os.write(messageEn.getBytes());
        String messageDe = decrypt(messageEn,keyMap.get(1));
//        System.out.println("        :" + messageDe);
    }
    private static String readString4(String filePath)
    {
        int len=0;
        StringBuffer str=new StringBuffer("");
        File file=new File(filePath);
        try {
            FileInputStream is=new FileInputStream(file);
            InputStreamReader isr= new InputStreamReader(is);
            BufferedReader in= new BufferedReader(isr);
            String line=null;
            while( (line=in.readLine())!=null )
            {
                if(len != 0) //         
                {
                    str.append("\r
"+line); } else { str.append(line); } len++; } in.close(); is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return str.toString(); } /** * * @throws NoSuchAlgorithmException */ public static void genKeyPair() throws NoSuchAlgorithmException { // KeyPairGenerator , RSA KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); // , 96-1024 keyPairGen.initialize(1024,new SecureRandom()); // , keyPair KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded())); // String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded()))); // Map keyMap.put(0,publicKeyString); //0 keyMap.put(1,privateKeyString); //1 } /** * RSA * * @param str * * @param publicKey * * @return * @throws Exception * */ public static String encrypt( String str, String publicKey ) throws Exception{ //base64 byte[] decoded = Base64.decodeBase64(publicKey); RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); //RSA Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); byte[] b = str.getBytes("utf-8"); byte[] b1 = null; /** */ for (int i = 0; i < b.length; i += 117) { byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(b, i,i + 117)); b1 = ArrayUtils.addAll(b1, doFinal); } String outStr = Base64.encodeBase64String(b1); return outStr; } /** * RSA * * @param str * * @param privateKey * * @return * @throws Exception * */ public static String decrypt(String str, String privateKey) throws Exception{ //64 byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8")); //base64 byte[] decoded = Base64.decodeBase64(privateKey); RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); //RSA Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, priKey); byte[] b1 = inputByte; /** */ byte[] b = null; StringBuilder sb = new StringBuilder(); for (int i = 0; i < b1.length; i += 128) { byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(b1, i, i + 128)); sb.append(new String(doFinal,"utf-8")); } return sb.toString(); } }

자바 생 성 된 비밀 키 를 골 랑 엔 드 에 보 냅 니 다.여 기 는 하나의 코드 만 캡 처 합 니 다.구체 적 인 git 주소:https://github.com/Lyafei/go-rsa
package gorsa

import (
	"bytes"
	"errors"
	"crypto"
	"crypto/sha1"
	"crypto/rand"
	"crypto/sha256"
	"crypto/rsa"
	"encoding/base64"
	"io/ioutil"
)

var RSA = &RSASecurity{}

type RSASecurity struct {
	pubStr string          //     
	priStr string          //     
	pubkey *rsa.PublicKey  //  
	prikey *rsa.PrivateKey //  
}

//     
func (rsas *RSASecurity) SetPublicKey(pubStr string) (err error) {
	rsas.pubStr = pubStr
	rsas.pubkey, err = rsas.GetPublickey()
	return err
}

//     
func (rsas *RSASecurity) SetPrivateKey(priStr string) (err error) {
	rsas.priStr = priStr
	rsas.prikey, err = rsas.GetPrivatekey()
	return err
}

// *rsa.PublicKey
func (rsas *RSASecurity) GetPrivatekey() (*rsa.PrivateKey, error) {
	return getPriKey([]byte(rsas.priStr))
}

// *rsa.PrivateKey
func (rsas *RSASecurity) GetPublickey() (*rsa.PublicKey, error) {
	return getPubKey([]byte(rsas.pubStr))
}

//     
func (rsas *RSASecurity) PubKeyENCTYPT(input []byte) ([]byte, error) {
	if rsas.pubkey == nil {
		return []byte(""), errors.New(`Please set the public key in advance`)
	}
	output := bytes.NewBuffer(nil)
	err := pubKeyIO(rsas.pubkey, bytes.NewReader(input), output, true)
	if err != nil {
		return []byte(""), err
	}
	return ioutil.ReadAll(output)
}

//     
func (rsas *RSASecurity) PubKeyDECRYPT(input []byte) ([]byte, error) {
	if rsas.pubkey == nil {
		return []byte(""), errors.New(`Please set the public key in advance`)
	}
	output := bytes.NewBuffer(nil)
	err := pubKeyIO(rsas.pubkey, bytes.NewReader(input), output, false)
	if err != nil {
		return []byte(""), err
	}
	return ioutil.ReadAll(output)
}

//     
func (rsas *RSASecurity) PriKeyENCTYPT(input []byte) ([]byte, error) {
	if rsas.prikey == nil {
		return []byte(""), errors.New(`Please set the private key in advance`)
	}
	output := bytes.NewBuffer(nil)
	err := priKeyIO(rsas.prikey, bytes.NewReader(input), output, true)
	if err != nil {
		return []byte(""), err
	}
	return ioutil.ReadAll(output)
}

//     
func (rsas *RSASecurity) PriKeyDECRYPT(input []byte) ([]byte, error) {
	if rsas.prikey == nil {
		return []byte(""), errors.New(`Please set the private key in advance`)
	}
	output := bytes.NewBuffer(nil)
	err := priKeyIO(rsas.prikey, bytes.NewReader(input), output, false)
	if err != nil {
		return []byte(""), err
	}

	return ioutil.ReadAll(output)
}

/**
 *   RSAWithSHA1    
 */
func (rsas *RSASecurity) SignSha1WithRsa(data string) (string, error) {
	sha1Hash := sha1.New()
	s_data := []byte(data)
	sha1Hash.Write(s_data)
	hashed := sha1Hash.Sum(nil)

	signByte, err := rsa.SignPKCS1v15(rand.Reader, rsas.prikey, crypto.SHA1, hashed)
	sign := base64.StdEncoding.EncodeToString(signByte)
	return string(sign), err
}

/**
 *   RSAWithSHA256    
 */
func (rsas *RSASecurity) SignSha256WithRsa(data string) (string, error) {
	sha256Hash := sha256.New()
	s_data := []byte(data)
	sha256Hash.Write(s_data)
	hashed := sha256Hash.Sum(nil)

	signByte, err := rsa.SignPKCS1v15(rand.Reader, rsas.prikey, crypto.SHA256, hashed)
	sign := base64.StdEncoding.EncodeToString(signByte)
	return string(sign), err
}

/**
 *   RSAWithSHA1    
 */
func (rsas *RSASecurity) VerifySignSha1WithRsa(data string, signData string) error {
	sign, err := base64.StdEncoding.DecodeString(signData)
	if err != nil {
		return err
	}
	hash := sha1.New()
	hash.Write([]byte(data))
	return rsa.VerifyPKCS1v15(rsas.pubkey, crypto.SHA1, hash.Sum(nil), sign)
}

/**
 *   RSAWithSHA256    
 */
func (rsas *RSASecurity) VerifySignSha256WithRsa(data string, signData string) error {
	sign, err := base64.StdEncoding.DecodeString(signData)
	if err != nil {
		return err
	}
	hash := sha256.New()
	hash.Write([]byte(data))

	return rsa.VerifyPKCS1v15(rsas.pubkey, crypto.SHA256, hash.Sum(nil), sign)
}

좋은 웹페이지 즐겨찾기