乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      RSA加密---從后臺(tái)到客戶端實(shí)現(xiàn)報(bào)文加解密

       印度阿三17 2019-06-28

      RSA是當(dāng)前最流行的非對(duì)稱加密方式,使用公鑰加密使用密鑰解密,如何妥善的保管密鑰就成了關(guān)鍵。

      動(dòng)態(tài)生成密鑰

      工具類

      package com.yitong.utils;
      
      import java.security.KeyFactory;
      import java.security.KeyPair;
      import java.security.KeyPairGenerator;
      import java.security.NoSuchAlgorithmException;
      import java.security.PrivateKey;
      import java.security.PublicKey;
      import java.security.spec.PKCS8EncodedKeySpec;
      import java.security.spec.X509EncodedKeySpec;
      
      import javax.crypto.Cipher;
      
      
      /**
       * RSA工具類
       */
      public class RSAUtil {
      
          /**
           * @description: 隨機(jī)生成RSA密鑰對(duì)(密鑰默認(rèn)長(zhǎng)度為1024)
           * @params:
           * @return:
           */
          public static KeyPair getRSAKeyPair() {
              try {
                  KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
                  kpg.initialize(1024);
                  return kpg.genKeyPair();
              } catch (NoSuchAlgorithmException e) {
                  e.printStackTrace();
              }
              return null;
          }
      
          /**
           * @description: 隨機(jī)生成RSA密鑰對(duì)
           * @params:
           * @return:
           */
          public static KeyPair getRSAKeyPair(int length) {
              try {
                  KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
                  kpg.initialize(length);
                  return kpg.genKeyPair();
              } catch (NoSuchAlgorithmException e) {
                  e.printStackTrace();
              }
              return null;
          }
      
          /**
           * @description: 用公鑰加密
           * @params:
           * @return: String
           */
          public static String encryptData(String data, PublicKey publicKey) {
              try {
                  Cipher cipher = Cipher.getInstance("RSA");
                  cipher.init(Cipher.ENCRYPT_MODE, publicKey);
                  return HexUtil.encode(cipher.doFinal(data.getBytes()));
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return null;
          }
      
          /**
           * @description: 用私鑰解密
           * @params:
           * @return: String
           */
          public static String decryptData(String encryptedData, PrivateKey privateKey) {
              try {
                  Cipher cipher = Cipher.getInstance("RSA");
                  cipher.init(Cipher.DECRYPT_MODE, privateKey);
                  return new String(cipher.doFinal(HexUtil.decode(encryptedData)));
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return null;
          }
      
          /**
           * @description: 字符串還原公鑰
           * @params:
           * @return: PublicKey
           */
          public static PublicKey getPublicKey(String key) {
              try {
                  byte[] keyBytes;
                  keyBytes = Base64Util.decode(key);
                  X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
                  KeyFactory keyFactory = null;
                  keyFactory = KeyFactory.getInstance("RSA");
                  PublicKey publicKey = keyFactory.generatePublic(keySpec);
                  return publicKey;
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return null;
          }
      
          /**
           * @description: 字符串還原公鑰Base64
           * @params:
           * @return: String
           */
          public static String getPublicKey(PublicKey publicKey) {
              return Base64Util.encode(publicKey.getEncoded());
          }
      
          /**
           * @description: 字符串還原私鑰
           * @params:
           * @return: PrivateKey
           */
          public static PrivateKey getPrivateKey(String key) {
              try {
                  byte[] keyBytes;
                  keyBytes = Base64Util.decode(key);
                  PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
                  KeyFactory keyFactory = null;
                  keyFactory = KeyFactory.getInstance("RSA");
                  PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
                  return privateKey;
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return null;
          }
      
          /**
           * @description: 字符串還原私鑰Base64
           * @params:
           * @return: String
           */
          public static String getPrivateKey(PrivateKey privateKey) {
              return Base64Util.encode(privateKey.getEncoded());
          }
      
      }
      

      使用

          static String plainText = "123456789123456789";// 明文
      	static String cipherText;// 密文
      	static PublicKey publicKey;
      	static PrivateKey privateKey;
          private static void RSAEncrypt() {
      		if (null == publicKey) {
      			KeyPair aKey = RSAUtil.getRSAKeyPair();
      			publicKey = aKey.getPublic();
      			privateKey = aKey.getPrivate();
      			String pString = RSAUtil.getPublicKey(publicKey);
      			String pString2 = RSAUtil.getPrivateKey(privateKey);
      			System.out.println("公鑰:"   pString   "\n私鑰:"   pString2);
      		}
      		for (int i = 0; i < 5; i  ) {
      			cipherText = RSAUtil.encryptData(plainText, publicKey);
      			System.out.println("加密密文:"   cipherText);
      			try {
      				System.out.println("解密明文:"   RSAUtil.decryptData(cipherText, privateKey));
      			} catch (Exception e) {
      				// TODO Auto-generated catch block
      				e.printStackTrace();
      			}
      		}
      	}
      

      這個(gè)是動(dòng)態(tài)生成一對(duì)密鑰的用法,這里存在一個(gè)問(wèn)題,自己生成的一對(duì)密鑰別人不知道,除了自己任何人都沒(méi)有辦法解密,我們一般都是自己加密給別人解密,這樣就得想辦法把私鑰傳給別人,但存在泄露的風(fēng)險(xiǎn)。

      利用證書和keystore方式加解密

      這種方式是為了解決傳遞密鑰存在泄露風(fēng)險(xiǎn)的問(wèn)題,keystore擁有完整的一對(duì)密鑰,既包含公鑰也包含私鑰,證書只包含公鑰,只能利用證書進(jìn)行加密。

      利用keytool生成證書

      以win系統(tǒng)為例,打開cmd,輸入:
      keytool -genkey -alias 你的證書別名 -keyalg 密鑰算法 -keystore 證書庫(kù)文件保存的位置和文件名 -keysize 密鑰長(zhǎng)度 -validity 證書有效期天數(shù)
      示例:
      keytool -genkey -alias mykey -keyalg RSA -keystore D:/mk.keystore -keysize 1024 -validity 36500
      然后按照提示輸入密鑰庫(kù)的相關(guān)信息:

      輸入密鑰庫(kù)口令:
      再次輸入新口令:
      您的名字與姓氏是什么?
        [Unknown]:  zhang
      您的組織單位名稱是什么?
        [Unknown]:  pc
      您的組織名稱是什么?
        [Unknown]:  pc
      您所在的城市或區(qū)域名稱是什么?
        [Unknown]:  shanghai
      您所在的省/市/自治區(qū)名稱是什么?
        [Unknown]:  shanghai
      該單位的雙字母國(guó)家/地區(qū)代碼是什么?
        [Unknown]:  86
      CN=zhang, OU=yitong, O=pc, L=shanghai, ST=shanghai, C=86是否正確?
        [否]:  是
      
      輸入 <mykey> 的密鑰口令
              (如果和密鑰庫(kù)口令相同, 按回車):
      再次輸入新口令:
      
      Warning:
      JKS 密鑰庫(kù)使用專用格式。建議使用 "keytool -importkeystore -srckeystore D:/mk.keystore -destkeystore D:/mk.keystore -deststoretype pkcs12" 遷移到行業(yè)標(biāo)準(zhǔn)格式 PKCS12。
      

      這樣就在D盤根目錄下生成一個(gè)密鑰庫(kù),這個(gè)密鑰庫(kù)相當(dāng)重要一定要妥善保管,接下來(lái)就需要生成證書了:

      keytool -export -alias mykey -keystore D:/mk.keystore -file D:/mk.cer
      

      這樣就能再D盤根目錄下看到證書文件了,我們可以根據(jù)需要在原有的密鑰庫(kù)添加新的密鑰。

      加解密

      直接上代碼:

          static String plainText = "123456789123456789";// 明文
      	static String cipherText;// 密文
      	static PublicKey publicKey;
      	static PrivateKey privateKey;
      
      	static String certificatePath = "D:/mk.cer";
      	static String keystorePath = "D:/mk.keystore";
          private static void CerEncrypt() throws Exception {
      		// 加密
      		CertificateFactory cff = CertificateFactory.getInstance("X.509");
      		InputStream in = new FileInputStream(certificatePath);
      		Certificate cf = cff.generateCertificate(in);
      		PublicKey pString = cf.getPublicKey(); // 得到證書文件攜帶的公鑰
      		System.out.println("公鑰:"   Base64Util.encode(pString.getEncoded()));
      		cipherText = RSAUtil.encryptData(plainText, pString);
      		System.out.println("加密密文:"   cipherText);
      
      		// 解密
      		FileInputStream inputStream = new FileInputStream(keystorePath);
      		KeyStore ks = KeyStore.getInstance("JKS");
      		ks.load(inputStream, "000000".toCharArray());
      		inputStream.close();
      		String alias = "mykey";
      		String pswd = "000000";
      		Certificate cert = ks.getCertificate(alias);
      		PublicKey publicKey = cert.getPublicKey();
      		PrivateKey privateKey = (PrivateKey) ks.getKey(alias, pswd.toCharArray());
      		System.out.println("私鑰:"   RSAUtil.getPrivateKey(privateKey)   "\n公鑰:"   RSAUtil.getPublicKey(publicKey));
      		System.out.println(RSAUtil.decryptData(cipherText, privateKey));
      
      	}
      

      應(yīng)用

      當(dāng)我們的報(bào)文需要RSA加密的時(shí)候就可以將證書放在客戶端,keystore放在服務(wù)端,這樣客戶端發(fā)送的報(bào)文就能自行加密,在服務(wù)端利用keystone文件獲取私鑰進(jìn)行解密。

      來(lái)源:https://www./content-4-276251.html

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多