首页 > 其他 > 详细

2020.03.17关键字AES RSA加密

时间:2021-03-17 22:57:41      阅读:44      评论:0      收藏:0      [点我收藏+]
单项加密:md5 sha
双向加密:rsa(私钥+公钥) aes(密钥+iv偏移量) 填充算法
https://www.cnblogs.com/ppybear/p/12462449.html


Bouncy Castle Inc.公司提供的算法包,进行aes加密;方案1
package testMain;

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.Key;
import java.security.KeyFactory;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.PBEParametersGenerator;
import org.bouncycastle.crypto.digests.SHA256Digest;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.generators.PKCS12ParametersGenerator;
import org.bouncycastle.crypto.macs.CFBBlockCipherMac;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.modes.CFBBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;

import com.bes.commons.codec.binary.Base64;
import com.bes.enterprise.appserver.common.util.AES;
import com.bes.enterprise.appserver.common.util.MD5Util;

public class mmmm {
	private static final byte[] DEFAULT_IV = { -12, 56, -25, 63, 78, 32, 76, 89, 34, 76, -64, 88, -56, 23, 66, 11 };
	private static final byte[] apiKey  = {96, 26, 72, -105, 127, -48, 54, 39, -5, 74, -95, -64, -43, -3, -109, 85};
	private static String PASSWORD = MD5Util.md5Str("BES9_5_0_2017");
	  private static final Base64 base64 = new Base64();
		//private static String  PPPPP= "AES/CBC/PKCS7Padding";
		private static String  PPPPP= "AES/CFB/PKCS5Padding";
	public static void main(String[] args) throws Exception {
		
		System.out.println(PASSWORD.getBytes());
		String password = "Basdasdas";
		//jdk加密
		String AESpassword = encrypt(password);
		System.out.println("jdk:" + AESpassword);
		//jdk:{AES}H/eSUbYWJQOYQp7rbNMrVQ==
		//{AES}jAF9c4oBeQF4agWl6HNkyQ==
		
		//BC加密
		String encrypt = encrypt(password, apiKey);
		System.out.println("B C:" + encrypt);
		
		//BC解jdk的密
		String encrypt1 = decrypt(AESpassword.substring("{AES}".length()), apiKey);
		System.out.println("B C解密jdk:" + encrypt1);
		
		//BC解bc的密
		String encrypt2 = decrypt(encrypt, apiKey);
		System.out.println("B C解密bc:" + encrypt2);
		
	}
	
	//jdk
	  public static String encrypt(String content) throws Exception
	  {
	    Cipher cipher = Cipher.getInstance(PPPPP);
	    cipher.init(1, getSecretKey(), new IvParameterSpec(DEFAULT_IV));
	    byte[] rawCipherText = cipher.doFinal(content.getBytes());
	    return "{AES}" + new String(base64.encode(rawCipherText));
	  }
	  
	  public static String encrypt3(String content) throws Exception
	  {
	    Cipher cipher = Cipher.getInstance("PPPPP");
	    cipher.init(1, getSecretKey(), new IvParameterSpec(DEFAULT_IV));
	    byte[] rawCipherText = cipher.doFinal(content.getBytes());
	    return "{AES}" + new String(base64.encode(rawCipherText));
	  }

	  public static String decrypt(String cipherText) throws Exception {
	    Cipher cipher = Cipher.getInstance("PPPPP");
	    cipher.init(2, getSecretKey(), new IvParameterSpec(DEFAULT_IV));

	    byte[] rawData = cipherText.getBytes();
	    byte[] decryptData = base64.decode(new String(rawData, "{AES}".length(), rawData.length - "{AES}".length()));

	    return new String(cipher.doFinal(decryptData));
	  }
	  private static Key getSecretKey() throws Exception {
		    SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
		    PBEKeySpec ps = new PBEKeySpec(PASSWORD.toCharArray(), PASSWORD.getBytes(), 1024, 128);
		    SecretKey key = skf.generateSecret(ps);
		    SecretKeySpec keySpec = new SecretKeySpec(key.getEncoded(), "AES");
		    return keySpec;
		  }
	  
	  
      public static Key loadPublicKey(String stored) throws GeneralSecurityException, IOException 
      {
     byte[] data = java.util.Base64.getDecoder().decode((stored.getBytes()));
     X509EncodedKeySpec spec = new X509EncodedKeySpec(data);
     KeyFactory fact = KeyFactory.getInstance("AES");
     return fact.generatePublic(spec);

       }
      
      //bc
      public static String encrypt(String content, byte[] apiKey)
    		  throws Exception {
    		  if (apiKey == null) {
    		  throw new IllegalArgumentException("Key cannot be null!");
    		  }
    		  String encrypted = null;
    		  if (apiKey.length != 32 && apiKey.length != 24
    		  && apiKey.length != 16) {
    		  throw new IllegalArgumentException(
    		  "Key length must be   128/192/256 bits!");
    		  }
    		  byte[] encryptedBytes = null;
    		  encryptedBytes = encrypt111(content.getBytes(), apiKey, DEFAULT_IV);
    		  encrypted = new String(base64.encode(encryptedBytes));
    		  return encrypted;
    		  }
      
      private static byte[] encrypt111(byte[] plain, byte[] key, byte[] iv)
    		  throws Exception {
    		  PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(
    	    		  new CFBBlockCipher(new AESEngine(), 128));
    		  CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key),
    		  iv);
    		  aes.init(true, ivAndKey);
    		  return cipherData(aes, plain);
    		  }
      
      private static byte[] cipherData(PaddedBufferedBlockCipher cipher,
    		  byte[] data) throws Exception {
    		  int minSize = cipher.getOutputSize(data.length);
    		  byte[] outBuf = new byte[minSize];
    		  int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);
    		  int length2 = cipher.doFinal(outBuf, length1);
    		  int actualLength = length1 + length2;
    		  byte[] result = new byte[actualLength];
    		  System.arraycopy(outBuf, 0, result, 0, result.length);
    		  return result;
    		  }
      
      //bc解密
      
      public static String decrypt(String content, byte[] apiKey)
      throws Exception {
      if (apiKey == null) {
      throw new IllegalArgumentException("Key cannot be null!");
      }
      String decrypted = null;
      byte[] encryptedContent = base64.decode(content);
      byte[] decryptedBytes = null;
      if (apiKey.length != 32 && apiKey.length != 24
      && apiKey.length != 16) {
      throw new IllegalArgumentException(
      "Key length must be   128/192/256 bits!");
      }
      decryptedBytes = decrypt222(encryptedContent, apiKey, DEFAULT_IV);
      decrypted = new String(decryptedBytes);
      return decrypted;
      }
      
      private static byte[] decrypt222(byte[] cipher, byte[] key, byte[] iv)
    		  throws Exception {
    		  PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(
    		  new CFBBlockCipher(new AESEngine(), 128));
    		  CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key),
    		  iv);
    		  aes.init(false, ivAndKey);
    		  return cipherData(aes, cipher);
    		  }
      
      
}

  

Bouncy Castle Inc.公司提供的算法包,进行aes加密;方案2
package com;

import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.AESFastEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;
import org.bouncycastle.util.encoders.Hex;

/*算法模式:CBC
填充模式:PKCS5
初始化向量IV:0x31, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x38, 0x27, 0x36, 0x35, 0x33, 0x23, 0x32, 0x33,IV值一定是128位的(16字节).
为提高加密性能,建议使用Bouncy Castle Inc.公司提供的算法包,以下样例中使用的就是该公司的算法包。其运算速度是jdk自带的10倍以上。

*/public class AESTest {
    private static final byte[] INIT_VECTOR = new byte[] {-12, 56, -25, 63, 78, 32,
            76, 89, 34, 76, -64, 88, -56, 23, 66, 11};
    public static void main(String[] args) {
        try {
        String apiKey = "222b8f353b79afb361e27b3523967928";
        String content = "Bpokdsad";
        String encrypt = encrypt(content, apiKey);
        System.out.println(encrypt);
        String decrypt = decrypt(encrypt, apiKey);
        System.out.println(decrypt);
        } catch (Exception e) {
        e.printStackTrace();
        }
    }


 
public static String encrypt(String content, String apiKey)
throws Exception {
if (apiKey == null) {
throw new IllegalArgumentException("Key cannot be null!");
}
String encrypted = null;
byte[] keyBytes = apiKey.getBytes();
System.out.println(keyBytes.length);
if (keyBytes.length != 32 && keyBytes.length != 24 //*8
&& keyBytes.length != 16) {
throw new IllegalArgumentException(
"Key length must be   128/192/256 bits!");
}
byte[] encryptedBytes = null;

PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(
new CBCBlockCipher(new AESFastEngine()));
CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(keyBytes),
        INIT_VECTOR);
aes.init(true, ivAndKey);
encryptedBytes =  cipherData(aes, content.getBytes());


encrypted = new String(Hex.encode(encryptedBytes));
return encrypted;
}
 
 
public static String decrypt(String content, String apiKey)
throws Exception {
if (apiKey == null) {
throw new IllegalArgumentException("Key cannot be null!");
}
String decrypted = null;
byte[] encryptedContent = Hex.decode(content);
byte[] keyBytes = apiKey.getBytes();
byte[] decryptedBytes = null;
if (keyBytes.length != 32 && keyBytes.length != 24
&& keyBytes.length != 16) {
throw new IllegalArgumentException(
"Key length must be   128/192/256 bits!");
}

PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(
new CBCBlockCipher(new AESFastEngine()));
CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(keyBytes),
        INIT_VECTOR);
aes.init(false, ivAndKey);
decryptedBytes = cipherData(aes, encryptedContent);

decrypted = new String(decryptedBytes);
return decrypted;
}
 
 
 
private static byte[] cipherData(PaddedBufferedBlockCipher cipher,
byte[] data) throws Exception {
int minSize = cipher.getOutputSize(data.length);
byte[] outBuf = new byte[minSize];
int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);
int length2 = cipher.doFinal(outBuf, length1);
int actualLength = length1 + length2;
byte[] result = new byte[actualLength];
System.arraycopy(outBuf, 0, result, 0, result.length);
return result;
}

}
Bouncy Castle Inc.公司提供的算法包,进行rsa加密
package testRsa;
 
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.crypto.generators.*;
import org.bouncycastle.crypto.params.*;
import org.bouncycastle.crypto.*;
import org.bouncycastle.crypto.util.PrivateKeyFactory;
import org.bouncycastle.crypto.util.PrivateKeyInfoFactory;
import org.bouncycastle.crypto.util.PublicKeyFactory;
import org.bouncycastle.crypto.util.SubjectPublicKeyInfoFactory;
import org.bouncycastle.crypto.engines.*;
import org.bouncycastle.asn1.pkcs.*;
import org.bouncycastle.asn1.*;
import java.math.BigInteger;
import java.security.SecureRandom;
import java.util.*;
 
public class test_rsa {
public static void main(String[] args) throws Exception {
     //生成密钥对
     RSAKeyPairGenerator rsaKeyPairGenerator = new RSAKeyPairGenerator();
     RSAKeyGenerationParameters rsaKeyGenerationParameters = new RSAKeyGenerationParameters(BigInteger.valueOf(3),
    		                                                     new SecureRandom(), 1024, 25);
     //初始化参数  
     rsaKeyPairGenerator.init(rsaKeyGenerationParameters); 
     AsymmetricCipherKeyPair keyPair = rsaKeyPairGenerator.generateKeyPair();
     //公钥    
     AsymmetricKeyParameter publicKey = keyPair.getPublic();
     //私钥
     AsymmetricKeyParameter privateKey = keyPair.getPrivate();
     
     SubjectPublicKeyInfo subjectPublicKeyInfo = SubjectPublicKeyInfoFactory.createSubjectPublicKeyInfo(publicKey);
     PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.createPrivateKeyInfo(privateKey);
     //变字符串
     ASN1Object asn1ObjectPublic = subjectPublicKeyInfo.toASN1Primitive();
     byte[] publicInfoByte = asn1ObjectPublic.getEncoded();
     ASN1Object asn1ObjectPrivate = privateKeyInfo.toASN1Primitive();
     byte[] privateInfoByte = asn1ObjectPrivate.getEncoded();
     //这里可以将密钥对保存到本地
     final Base64.Encoder encoder64 = Base64.getEncoder();
     System.out.println("PublicKey:\n" +  encoder64.encodeToString(publicInfoByte));
     System.out.println("PrivateKey:\n" + encoder64.encodeToString(privateInfoByte));
     //加密、解密
     ASN1Object pubKeyObj = subjectPublicKeyInfo.toASN1Primitive();//这里也可以从流中读取,从本地导入
     AsymmetricKeyParameter pubKey = PublicKeyFactory.createKey(SubjectPublicKeyInfo.getInstance(pubKeyObj));
     AsymmetricBlockCipher cipher = new RSAEngine();
     cipher.init(true, pubKey);//true表示加密
 
     final Base64.Decoder decoder64 = Base64.getDecoder();
     //加密
     String data = "成aa功324$$了#*(=-nh)。。。";
     System.out.println("\n明文:" + data);
     byte[] encryptData = cipher.processBlock(data.getBytes("utf-8")
                                              , 0, data.getBytes("utf-8").length);
     System.out.println("密文:" + encoder64.encodeToString(encryptData));
 
     //解密
     AsymmetricKeyParameter priKey = PrivateKeyFactory.createKey(privateInfoByte);
     cipher.init(false, priKey);//false表示解密
     byte[] decriyptData=cipher.processBlock(encryptData, 0, encryptData.length);
     String decryptData = new String(decriyptData,"utf-8");
     System.out.println("解密后数据:" + decryptData);
    }
}

  

2020.03.17关键字AES RSA加密

原文:https://www.cnblogs.com/sina-p/p/14551750.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!