最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 實(shí)現(xiàn)常見(jiàn)的非對(duì)稱(chēng)加密算法

 更新時(shí)間:2020年11月21日 09:46:03   作者:布禾  
這篇文章主要介紹了Java 實(shí)現(xiàn)常見(jiàn)的非對(duì)稱(chēng)加密算法,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下

概述

非對(duì)稱(chēng)加密算法與對(duì)稱(chēng)加密算法的主要差別在于非對(duì)稱(chēng)加密算法用于加密和解密的密鑰不相同,非對(duì)稱(chēng)加密算法密鑰分為公鑰和私鑰,公鑰加密只能用私鑰解密,反之私鑰加密只能用公鑰解密。相比對(duì)稱(chēng)加密算法,非對(duì)稱(chēng)加密算法加/解密效率低,但安全性高,這兩種算法一般結(jié)合使用。常見(jiàn)非對(duì)稱(chēng)加密算法有RSA、ECC、Elgamal等。

使用RSA實(shí)現(xiàn)加密解密

公鑰加密,私鑰解密。

package com.ss.utils;

import javax.crypto.Cipher;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class RsaUtil {
  public static final String KEY_TYPE_PRIVATE_KEY = "privateKey";
  public static final String KEY_TYPE_PUBLIC_KEY = "publicKey";

  /**
   * 生成公鑰和私鑰
   *
   * @return
   * @throws NoSuchAlgorithmException
   */
  public static Map<String, String> generateKey() throws NoSuchAlgorithmException {
    Map<String, String> resultMap = new HashMap<>();
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    Base64.Encoder encoder = Base64.getEncoder();
    resultMap.put(KEY_TYPE_PRIVATE_KEY, encoder.encodeToString(keyPair.getPrivate().getEncoded()));
    resultMap.put(KEY_TYPE_PUBLIC_KEY, encoder.encodeToString(keyPair.getPublic().getEncoded()));
    return resultMap;
  }

  /**
   * RSA加密
   * @param key
   * @param content
   * @param keyType
   * @return
   * @throws Exception
   */
  public static String rsaEncrypt(String key, String content, String keyType) throws Exception {
    return rsa(key, content.getBytes(), keyType, Cipher.ENCRYPT_MODE);
  }

  /**
   * RSA解密
   * @param key
   * @param content
   * @param keyType
   * @return
   * @throws Exception
   */
  public static String rsaDecrypt(String key, String content, String keyType) throws Exception {
    return rsa(key, Base64.getDecoder().decode(content), keyType, Cipher.DECRYPT_MODE);
  }

  private static String rsa(String key, byte[] content, String keyType, int mode) throws Exception {
    Cipher cipher = Cipher.getInstance("RSA");
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    if (KEY_TYPE_PRIVATE_KEY.equals(keyType)) {
      cipher.init(mode, keyFactory.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(key))));
    } else {
      cipher.init(mode, keyFactory.generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(key))));
    }
    byte[] bytes = cipher.doFinal(content);
    return mode == Cipher.DECRYPT_MODE ? new String(bytes) : Base64.getEncoder().encodeToString(bytes);
  }

  public static void main(String[] args) throws Exception {
    String content = "大王叫我來(lái)巡山吶";

    //生成密鑰對(duì)
    Map<String, String> keyMap = generateKey();
    System.out.println("私鑰:" + keyMap.get(KEY_TYPE_PRIVATE_KEY));
    System.out.println("公鑰:" + keyMap.get(KEY_TYPE_PUBLIC_KEY));

    //私鑰加密,公鑰解密
    String privateKeyData = rsaEncrypt(keyMap.get(KEY_TYPE_PRIVATE_KEY), content, KEY_TYPE_PRIVATE_KEY);
    System.out.println("私鑰加密:" + privateKeyData);
    System.out.println("公鑰解密:" + rsaDecrypt(keyMap.get(KEY_TYPE_PUBLIC_KEY), privateKeyData, KEY_TYPE_PUBLIC_KEY));

    //公鑰加密,私鑰解密
    String publicKeyData = rsaEncrypt(keyMap.get(KEY_TYPE_PUBLIC_KEY), content, KEY_TYPE_PUBLIC_KEY);
    System.out.println("公鑰加密:" + publicKeyData);
    System.out.println("私鑰解密:" + rsaDecrypt(keyMap.get(KEY_TYPE_PRIVATE_KEY), publicKeyData, KEY_TYPE_PRIVATE_KEY));
  }
}

輸出

私鑰:MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDQPZnj0+/uh5jG0/rqVsXKLve7wTw2LVEwdBhm+SPrLoHYb4+6idNeF4bWgTqNRs2hfewq5cyiwXujT+eqp0g1ebSLWSUWzBsktynQMggxb8IwtnFYzmZX7BSAUudrfTre74RtKS0krYY5PCXCGR/EGbbXMVv1m2S59BrkWEI8c/iORhRAJ5/pqRW/51cIimPx9iTYx/QZC4VsCRi8ZrBaXcJhEi4Y/YzOFhfITID4ATis0Z3yw3FVybKzJo3Nexupcec5qaLBlwuDkY6E4NgQq51bjBCUB78RgXFLdaVtfBu9Vr7pRdqrh7sD//kpiicjiLJvmcLG9egXrkHRlm2TAgMBAAECggEAes75hM0mwOujBA9b+Pu3pedRHp91XRYYvZSaF5ByyG4jEXuprf8+ck05riOEXnEVMFpM/3eK2al1uviSzafeA/uEqHGoV+uDToHe3PPEtTMNuSC/c/o1jUCjTpKV/GRcZcGnvaD9CJZ1hCeetPuQKlxn4j0v2IcOPkRh36zVU0SZJKu5Ltt6iyGbpk6qqlpLnX93Ez5weWLnuolgjF34JBDQpc/zZjHwC8/avE81cJ3dUQR55l9QiwZUoMQ2eDWO1UcPAEqRssNAwEHbQJFSJmqtvg1yuSSvPIGB5ATPlTu7EoOLFMOQm3qoAxX7/FR9uU50wHivyZrRyKV4CdiLcQKBgQDuj6bh1WUQRIBU5ZOtljbs73RdYYbS1uUHubizQ3rqrNo3+TmaVu+7H3DPPI0L21YVpjXuPMUVkix+KA7HiDqULxx0yZMsdqXmggOT2QFEjGdueMFAJw09jAHnCIwuxmn3f94XAvV6N+Hfhjy31RGPQhjFGn6QQ16a3NI46CD6VwKBgQDfdorB9Wm0H6QJ8AYAQuHAiFJnXeOzN0q2407F5kx8XkAKwKaI7ybGZbiYESxFTe0AdVQlYRJbAby1iUW/OGOS+Ia5buzCo+BqrP6RxzLDYVClyXS3WFSLPKko6WIscS+uOF36mWWn34YYH/ktT8B/hUNFUD+PEctkrklONkZZJQKBgQCsn9hTbHYgKmFujV2qa5s9IhzjAZJs+MFsMLD9TuQf8opJnJdZHnWEw0B/RUKPBN0q90XpKaI3dLmrZFMlgWdaGSkPPVm4//YWcZgjIREwyCSEJO85+8gx9CDgTCgcJMlDJgzQO/zjvpI8i8deAtkc/+gqoHxa6dUIXKfmM9rBKwKBgFxIv0sUh5+8hWkZN9E5zbNOWQGZM6Tai791ph1yW1ntLnOCVgQtB41dits6FFdWtC7BRYveR89Pq1gpJaWvqueSPUktNxe2x8ImSUd4xU0Mzlp5FPt2vgt2dMGRiFqkL7W6T41jdija1az231fIHM5NAZgJaQYzqhSdKWbkYS8FAoGBAOciP4bEln64PnvuZtYnZNvt/5PHB4ssZ3S1WExyTtI7328ZKAsi3F7PjxCh7gviXfEI2t3AcVwpPaJYveL3Zg/jl2x6zNSLDW8kgNhAJE221u3pZefeidvIWwki/OXWtRqyoACteLnEb6lbM3tKdltWZOryQTiXqGdTluLEQLE0
公鑰:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0D2Z49Pv7oeYxtP66lbFyi73u8E8Ni1RMHQYZvkj6y6B2G+PuonTXheG1oE6jUbNoX3sKuXMosF7o0/nqqdINXm0i1klFswbJLcp0DIIMW/CMLZxWM5mV+wUgFLna3063u+EbSktJK2GOTwlwhkfxBm21zFb9ZtkufQa5FhCPHP4jkYUQCef6akVv+dXCIpj8fYk2Mf0GQuFbAkYvGawWl3CYRIuGP2MzhYXyEyA+AE4rNGd8sNxVcmysyaNzXsbqXHnOamiwZcLg5GOhODYEKudW4wQlAe/EYFxS3WlbXwbvVa+6UXaq4e7A//5KYonI4iyb5nCxvXoF65B0ZZtkwIDAQAB
私鑰加密:V9kG4o3nceI4a19t/V5431v9Ek1PiV3FZokfnRNBor/RBymwDX4rsGNHEYuyN6/sbbD56r3ij5tUpShXFlcHrzVH4IfD4ySbvNNeMs2FrZLF3zvQmwRKDPH6SJ0DEczi5N97Vfh4b2tfyLT8iX3t9LPWgEj5mB7MXiYPc56mza+ZAqDduxWWsm6Emm81uKn97wZnasg8zXlDbhRttVTWhszbDhrFqsgd2sb8ZZUZIuiGTaIg7U6Slc5x9uS3UVACXXVyMCmxiVutQtg3Z4kt80ruh7xO0hl4cWk6P2Tg0ncaIQn/5vKsO2UXr/EsCb2rchWN3ZBHTVyQ83v/EHDtQw==
公鑰解密:大王叫我來(lái)巡山吶
公鑰加密:aartOyClfEIz1JT5nghpTbXxLZEOovm+vwvg+u3Tw8t5LOF+C7Gg/uxUP8Hm5jEkN6JfBHaMWTKg0RQ2xf3CCuXcLIpYVCOUwADwd05E8guEfZBT8FIp8jghCz2j+lAIiTfGZvsK9qUdZEmwTAEjV6uP4avF6njriglGJ4KhcYXEO66tOJWe2nQ1hyYXEHS43h9F0dtlWDjF6Xr6wdmUALnhprHDwKPdT/1T8p7+M5Fz7fUC7TJulBHWCSZvhgl405PvN+iTv7VysBJKRPks1JnmMe6BxFyhxXZfNRHmUyQvTMSfWt/A5gOy8ao/SOwWv0QMSh5NbocSd/tpjn27kw==
私鑰解密:大王叫我來(lái)巡山吶

使用RSA實(shí)現(xiàn)數(shù)字簽名

私鑰簽名,公鑰驗(yàn)證。

package com.ss.utils;

import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class SignatureUtil {
  public static final String KEY_TYPE_PRIVATE_KEY = "privateKey";
  public static final String KEY_TYPE_PUBLIC_KEY = "publicKey";

  /**
   * 生成公鑰和私鑰
   *
   * @return
   * @throws NoSuchAlgorithmException
   */
  public static Map<String, String> generateKey() throws NoSuchAlgorithmException {
    Map<String, String> resultMap = new HashMap<>();
    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
    KeyPair keyPair = keyPairGenerator.generateKeyPair();
    Base64.Encoder encoder = Base64.getEncoder();
    resultMap.put(KEY_TYPE_PRIVATE_KEY, encoder.encodeToString(keyPair.getPrivate().getEncoded()));
    resultMap.put(KEY_TYPE_PUBLIC_KEY, encoder.encodeToString(keyPair.getPublic().getEncoded()));
    return resultMap;
  }

  /**
   * 私鑰簽名
   * @param privateKeyStr
   * @param content
   * @return
   * @throws Exception
   */
  public static String generateSignature(String privateKeyStr, String content) throws Exception {
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    Signature signature = Signature.getInstance("SHA1withRSA");
    PrivateKey privateKey = keyFactory.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyStr)));
    signature.initSign(privateKey);
    signature.update(content.getBytes());
    return Base64.getEncoder().encodeToString(signature.sign());
  }

  /**
   * 公鑰驗(yàn)證
   * @param publicKeyStr
   * @param content
   * @param sign
   * @return
   * @throws Exception
   */
  public static boolean verifySignature(String publicKeyStr, String content, String sign) throws Exception {
    KeyFactory keyFactory = KeyFactory.getInstance("RSA");
    Signature signature = Signature.getInstance("SHA1withRSA");
    PublicKey publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyStr)));
    signature.initVerify(publicKey);
    signature.update(content.getBytes());
    return signature.verify(Base64.getDecoder().decode(sign));
  }

  public static void main(String[] args) throws Exception {
    String content = "大王叫我來(lái)巡山吶";

    //生成密鑰對(duì)
    Map<String, String> keyMap = generateKey();

    //私鑰簽名
    String sign = generateSignature(keyMap.get(KEY_TYPE_PRIVATE_KEY), content);
    System.out.println("私鑰簽名:" + sign);

    //公鑰驗(yàn)證
    boolean verifyResult = verifySignature(keyMap.get(KEY_TYPE_PUBLIC_KEY), content, sign);
    System.out.println("公鑰驗(yàn)證:" + verifyResult);

    //將內(nèi)容做下修改,再進(jìn)行公鑰驗(yàn)證
    boolean verifyResult2 = verifySignature(keyMap.get(KEY_TYPE_PUBLIC_KEY), content + "啦啦啦啦", sign);
    System.out.println("公鑰驗(yàn)證:" + verifyResult2);
  }
}

輸出

私鑰簽名:XDWeOUVZhXNPl58mcmRK8ht9TAhnREc+NlnSs2b6PCJuj29ABuoXsjZeJqSspGw8hm9ckHVSTrUt8pX4BFBFzrINDRBsx3TdLp2L8nMkhjFUfo0qcyZo8ReEGFCNr0ergkq2W1Me/5W40GrQz4cJcQ4KV/QWzD8YHWcnDvKg9Q0nXJSngyhJTzUB8o/pgo/tmkA9+bWW212UD9nzEXu5aoPEcYyoo3iFWRX5o9Jgg6ZF+exmWizwZHkg4eD1zC5IN3m4yRS6GRbnZInEuDsOMp9W7HouDLUirkFZiSkyW+DVto+L6CE5eNBrWC52zxiNkVBlkyYKOatSpcrQrtnyiQ==
公鑰驗(yàn)證:true
公鑰驗(yàn)證:false

以上就是Java 實(shí)現(xiàn)常見(jiàn)的非對(duì)稱(chēng)加密算法的詳細(xì)內(nèi)容,更多關(guān)于Java 非對(duì)稱(chēng)加密算法的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java判斷多個(gè)時(shí)間段是否重合的方法小結(jié)

    Java判斷多個(gè)時(shí)間段是否重合的方法小結(jié)

    這篇文章主要為大家詳細(xì)介紹了Java中判斷多個(gè)時(shí)間段是否重合的方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • Java中文件的操作與輸入輸出流舉例詳解

    Java中文件的操作與輸入輸出流舉例詳解

    Java語(yǔ)言的輸入輸出功能是十分強(qiáng)大而靈活的,下面這篇文章主要給大家介紹了關(guān)于Java中文件的操作與輸入輸出流的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Java中static的特點(diǎn)

    Java中static的特點(diǎn)

    本文主要介紹了Java中static的特點(diǎn)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • springboot自定義starter實(shí)現(xiàn)過(guò)程圖解

    springboot自定義starter實(shí)現(xiàn)過(guò)程圖解

    這篇文章主要介紹了springboot自定義starter實(shí)現(xiàn)過(guò)程圖解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • SpringBoot攔截器實(shí)現(xiàn)項(xiàng)目防止接口重復(fù)提交

    SpringBoot攔截器實(shí)現(xiàn)項(xiàng)目防止接口重復(fù)提交

    基于SpringBoot框架來(lái)開(kāi)發(fā)業(yè)務(wù)后臺(tái)項(xiàng)目時(shí),接口重復(fù)提交是一個(gè)常見(jiàn)的問(wèn)題,本文主要介紹了SpringBoot攔截器實(shí)現(xiàn)項(xiàng)目防止接口重復(fù)提交,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • java中this的n種使用方法

    java中this的n種使用方法

    this可能是幾乎所有有一點(diǎn)面向?qū)ο笏枷氲恼Z(yǔ)言都會(huì)引用到的變量,this有多少種用法。下面小編給大家?guī)?lái)了java中this的n種使用方法,感興趣的朋友一起看看吧
    2018-08-08
  • Springboot項(xiàng)目參數(shù)校驗(yàn)方式(Validator)

    Springboot項(xiàng)目參數(shù)校驗(yàn)方式(Validator)

    本文介紹了如何在Spring Boot項(xiàng)目中使用`spring-boot-starter-validation`包和注解來(lái)實(shí)現(xiàn)請(qǐng)求參數(shù)校驗(yàn),主要介紹了校驗(yàn)注解的使用方法、校驗(yàn)失敗的異常捕獲以及`@Validated`的分組功能
    2025-02-02
  • java微信開(kāi)發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證

    java微信開(kāi)發(fā)API第三步 微信獲取以及保存接口調(diào)用憑證

    這篇文章主要為大家詳細(xì)介紹了java微信開(kāi)發(fā)API第二步,微信獲取以及保存接口調(diào)用憑證,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Jenkins如何使用DockerFile自動(dòng)部署Java項(xiàng)目

    Jenkins如何使用DockerFile自動(dòng)部署Java項(xiàng)目

    這篇文章主要介紹了Jenkins如何使用DockerFile自動(dòng)部署Java項(xiàng)目,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 圖解Java排序算法之歸并排序

    圖解Java排序算法之歸并排序

    這篇文章主要為大家詳細(xì)介紹了Java經(jīng)典排序算法之歸并排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論

页游| 望奎县| 武胜县| 汉寿县| 那曲县| 石楼县| 固阳县| 合江县| 阜宁县| 惠东县| 航空| 河西区| 洞口县| 韩城市| 太和县| 阳江市| 东乌| 祁门县| 洪泽县| 翁牛特旗| 宜城市| 桃园市| 甘谷县| 大港区| 红河县| 武宣县| 博客| 搜索| 藁城市| 怀安县| 郑州市| 勐海县| 温宿县| 望江县| 浙江省| 织金县| 灵山县| 牙克石市| 鄂托克前旗| 阿克苏市| 青海省|