rsa 전단 암호 화 백 엔 드 복호화 사용

43572 단어 도구 클래스
최근 프로젝트 에서 ras 알고리즘 을 사용 하여 데이터 암호 화 전송 을 하고 암호 화 된 데 이 터 는 데이터베이스 에 저장 해 야 합 니 다.사용 과정 에서 windows 에서 매번 생 성 되 는 공개 키 와 비밀 키 가 일치 하 는 문 제 를 발 견 했 습 니 다. 그러나 코드 를 서버 (Linux 시스템) 에 업로드 한 후에 생 성 되 는 공개 키 와 비밀 키 가 다 릅 니 다. 그러면 이전에 암호 화 된 데 이 터 를 만 들 고 뒤의 서버 가 다시 시작 한 후에 서로 다른 공개 키 와 비밀 키 를 생 성하 면 이전에 암호 화 된 데 이 터 를 복호화 할 수 없습니다.
bcprov - jdk15on - 1.55. jar 패키지 와 comons - codec - 1.9. jar 를 도입 해 야 합 니 다.
        
            commons-codec
            commons-codec
            1.9
        
        
            org.bouncycastle
            bcprov-jdk15on
            1.60
        

최초의 코드
public class RSAEncrypt {
	/** 
	 *         
	 * @throws NoSuchAlgorithmException 
	 */  
	public  static Map<String,String> genKeyPair() throws NoSuchAlgorithmException {
		Map<String, String> keyMap = new HashMap<>();
		// KeyPairGenerator           ,  RSA        
		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");  
		//          ,     96-1024   
		keyPairGen.initialize(1024,new SecureRandom());  
		//        ,   keyPair   
		KeyPair keyPair = keyPairGen.genKeyPair();
		System.out.println(keyPair.getPublic().getEncoded());
		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("pub",publicKeyString);
		keyMap.put("pri",privateKeyString);
		return keyMap;
	}  
	/** 
	 * 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);
		String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
		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);
		String outStr = new String(cipher.doFinal(inputByte));
		return outStr;
	}

	public static void main(String[] args) throws Exception {
		//       
		Map<String, String> keyMap = genKeyPair();
		//     
		String message = "123456";
		System.out.println("        :" + keyMap.get("pub"));
		System.out.println("        :" + keyMap.get("pri"));
		String messageEn = encrypt(message,keyMap.get("pub"));
		System.out.println(message + "\t        :" + messageEn);
		String messageDe = decrypt(messageEn,keyMap.get("pri"));
		System.out.println("        :" + messageDe);
	}
}

이 키 쌍 을 만 드 는 방식 은 난수 이기 때문에 매번 다 릅 니 다. 전단 암호 화가 끝나 면 복호화 하기에 적합 합 니 다. 저장 할 필요 가 없고 암호 화 전송 만 할 수 있 습 니 다.
keyPairGen.initialize(1024,new SecureRandom());

생 성 된 키 가 일치 할 때마다 수정 합 니 다.
        //    SecureRandom random = new SecureRandom();//windows linux    ,                
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        //               
        secureRandom.setSeed("seed".getBytes());
        keyPairGenerator.initialize(1024, secureRandom);

백 엔 드 복호화 하면 이렇게 설정 할 수 있 습 니 다.
//     、          。    Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());//     、         
		Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding",new BouncyCastleProvider());


최종 적 으로 수 정 된 코드, windows, Liux 는 모두 일치 하 는 키 쌍 을 생 성 합 니 다.
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
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 {
	/** 
	 *         
	 * @throws NoSuchAlgorithmException 
	 */  
	public  static Map<String,String> genKeyPair(String seed) throws NoSuchAlgorithmException {
		Map<String, String> keyMap = new HashMap<>();
		// KeyPairGenerator           ,  RSA        
		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
		SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
		//               
		secureRandom.setSeed(seed.getBytes());
		//          ,     96-1024   
		keyPairGen.initialize(1024,secureRandom);
		//        ,   keyPair   
		KeyPair keyPair = keyPairGen.genKeyPair();
		System.out.println(keyPair.getPublic().getEncoded());
		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("pub",publicKeyString);
		keyMap.put("pri",privateKeyString);
		return keyMap;
	}  
	/** 
	 * 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(keyFactory.getAlgorithm());//     、         
		Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding",new BouncyCastleProvider());
		cipher.init(Cipher.ENCRYPT_MODE, pubKey);
		String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
		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(keyFactory.getAlgorithm());//     、         
		Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding",new BouncyCastleProvider());
		cipher.init(Cipher.DECRYPT_MODE, priKey);
		String outStr = new String(cipher.doFinal(inputByte));
		return outStr;
	}

	public static void main(String[] args) throws Exception {
		//       
		Map<String, String> keyMap = genKeyPair("seed");
		//     
		String message = "123456";
		System.out.println("        :" + keyMap.get("pub"));
		System.out.println("        :" + keyMap.get("pri"));
		String messageEn = encrypt(message,keyMap.get("pub"));
		System.out.println(message + "\t        :" + messageEn);
		String messageDe = decrypt(messageEn,keyMap.get("pri"));
		System.out.println("        :" + messageDe);
	}
}

프론트 엔 드 는 vue 를 사용 하여 npm 를 Vue 프로젝트 에 설치 할 수 있 습 니 다.
npm install jsencrypt --dev

페이지 도입 jsencrypt
import { JSEncrypt } from 'jsencrypt'

공개 키 는 백 엔 드 에 제공 합 니 다. 만약 에 전단 에 데 이 터 를 복호화 해 야 한다 면 백 엔 드 에 비밀 키 를 제공 해 야 합 니 다.
methods: {
    //    
    encryptedData(publicKey, data) {
      //   JSEncrypt  
      let encryptor = new JSEncrypt();
      //     
      encryptor.setPublicKey(publicKey);
      //     
      return encryptor.encrypt(data);
    },
    //   
    decryptData(privateKey,data){
      //   JSEncrypt  
      let decrypt= new JSEncrypt();
      //     
      decrypt.setPrivateKey(privateKey);
      //     
      return decrypt.decrypt(secretWord);
    }
  }

좋은 웹페이지 즐겨찾기