加密(3)非對稱加密

一、介紹

1、概念

非對稱加密,又稱現代加密算法,非對稱加密是計算機通信安全的基石,保證了加密數據不會被破解。加密和解密使用的是兩個不同的密鑰,這種算法叫作非對稱加密算法

2、示例

首先生成密鑰對, 公鑰為(5,14),私鑰為(11,14);

現在A希望將原文2發送給B:

A使用公鑰加密數據. 2的5次方mod 14 = 4 , 將密文4發送給B;

B使用私鑰解密數據. 4的11次方mod14 = 2, 得到原文2。

3、和對稱加密的比較

與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公開密鑰(publickey)?和私有密(privatekey)

4、特點

(1)加密和解密使用不同的密鑰,且公開密鑰和私有密鑰是一對。

(2)如果用公開密鑰對數據進行加密,只能用對應的私有密鑰才能解密;

? ? ? ? 如果用私有密鑰對數據進行加密,只能用對應的公開密鑰才能解密

(3)處理數據的速度較慢, 因為安全級別高

5、常用算法
  • RSA
  • ECC

二、?RSA

1、使用方法

首先需要生成公鑰和密鑰對;之后使用一個加密另外一個解密。

import org.apache.commons.io.FileUtils;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.File;
import java.nio.charset.Charset;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;public class RsaUtil {public static void main(String[] args) throws Exception {String input = "測試wtyy666";// 加密算法String algorithm = "RSA";String priPath = "a.pri";String pubPath = "a.pub";//1、生成密鑰對并保存在本地文件中generateKeyToFile(algorithm, pubPath, priPath);//2、加密String s = encryptRSA(algorithm, getPrivateKey(priPath,algorithm), input);System.out.println("加密后:"+s);// 3、解密String s1 = decryptRSA(algorithm, getPublicKey(pubPath,algorithm), s);System.out.println("解密后:"+s1);}//讀取私鑰public static PrivateKey getPrivateKey(String priPath,String algorithm) throws Exception{// 將文件內容轉為字符串String privateKeyString = FileUtils.readFileToString(new File(priPath), Charset.defaultCharset());// 獲取密鑰工廠KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 構建密鑰規范 進行Base64解碼PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyString));// 生成私鑰return keyFactory.generatePrivate(spec);}//讀取公鑰public static PublicKey getPublicKey(String pulickPath,String algorithm) throws Exception{// 將文件內容轉為字符串String publicKeyString = FileUtils.readFileToString(new File(pulickPath), Charset.defaultCharset());// 獲取密鑰工廠KeyFactory keyFactory = KeyFactory.getInstance(algorithm);// 構建密鑰規范 進行Base64解碼X509EncodedKeySpec spec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyString));// 生成公鑰return keyFactory.generatePublic(spec);}/*** 生成密鑰對并保存在本地文件中** @param algorithm : 算法* @param pubPath   : 公鑰保存路徑* @param priPath   : 私鑰保存路徑* @throws Exception*/private static void generateKeyToFile(String algorithm, String pubPath, String priPath) throws Exception {// 獲取密鑰對生成器KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 獲取密鑰對KeyPair keyPair = keyPairGenerator.generateKeyPair();// 獲取公鑰PublicKey publicKey = keyPair.getPublic();// 獲取私鑰PrivateKey privateKey = keyPair.getPrivate();// 獲取byte數組byte[] publicKeyEncoded = publicKey.getEncoded();byte[] privateKeyEncoded = privateKey.getEncoded();// 進行Base64編碼String publicKeyString = Base64.getEncoder().encodeToString(publicKeyEncoded);String privateKeyString = Base64.getEncoder().encodeToString(privateKeyEncoded);// 保存文件FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));System.out.println("生成的共鑰: " + publicKeyString);System.out.println("生成的私鑰: " + privateKeyString);}/*** 解密數據** @param algorithm      : 算法* @param encrypted      : 密文* @param key            : 密鑰* @return : 原文* @throws Exception*/public static String decryptRSA(String algorithm,Key key,String encrypted) throws Exception{// 創建加密對象// 參數表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 私鑰進行解密cipher.init(Cipher.DECRYPT_MODE,key);// 由于密文進行了Base64編碼, 在這里需要進行解碼byte[] decode = Base64.getDecoder().decode(encrypted);// 對密文進行解密,不需要使用base64,因為原文不會亂碼byte[] bytes1 = cipher.doFinal(decode);//System.out.println(new String(bytes1));return new String(bytes1);}/*** 使用密鑰加密數據** @param algorithm      : 算法* @param input          : 原文* @param key            : 密鑰* @return : 密文* @throws Exception*/public static String encryptRSA(String algorithm,Key key,String input) throws Exception{// 創建加密對象// 參數表示加密算法Cipher cipher = Cipher.getInstance(algorithm);// 初始化加密// 第一個參數:加密的模式// 第二個參數:使用私鑰進行加密cipher.init(Cipher.ENCRYPT_MODE,key);// 私鑰加密byte[] bytes = cipher.doFinal(input.getBytes());// 對密文進行Base64編碼System.out.println(Base64.getEncoder().encodeToString(bytes));return Base64.getEncoder().encodeToString(bytes);}
}
生成的共鑰: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4QYyI6aTqFZrQrcprgbCE2g60eLKVYBguiPLt7zPT2rCw+13s5c7G7WWjgiJ7UN2rQ+r+aVEKSe8eou/7lb8kEMrbJYJGg8y9KGyQ62ry1/0Rvw5DtHCoSpcu8czTVkB2mhYSCG+BTXaMmsVNICEXR7g4CZ/ILfLCugjNangkQ8iIEFYaLE1ssbcZmXCyA3kTVMqdplHYi1wgd9Vk8tQP77K5joZzb23F5bWZW+8yS+i1gKq1sxipzb8ZG/UMCP6upjqAHh6bgTJa+ORZmT6cXtjW235XK/Jq5NelN/9RGzsHbPSFgvFIayEAgA8WyyR/JCAIqUtj6hjwNG7tOAEfQIDAQAB
生成的私鑰: MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDhBjIjppOoVmtCtymuBsITaDrR4spVgGC6I8u3vM9PasLD7XezlzsbtZaOCIntQ3atD6v5pUQpJ7x6i7/uVvyQQytslgkaDzL0obJDravLX/RG/DkO0cKhKly7xzNNWQHaaFhIIb4FNdoyaxU0gIRdHuDgJn8gt8sK6CM1qeCRDyIgQVhosTWyxtxmZcLIDeRNUyp2mUdiLXCB31WTy1A/vsrmOhnNvbcXltZlb7zJL6LWAqrWzGKnNvxkb9QwI/q6mOoAeHpuBMlr45FmZPpxe2Nbbflcr8mrk16U3/1EbOwds9IWC8UhrIQCADxbLJH8kIAipS2PqGPA0bu04AR9AgMBAAECggEACMs038WzPCrXrcj/1nvKIKXwbigttT3G+Hf7MYJoG8wv4A7oK/U2+hWmAvoiW5B3mSNT4Gov75YpolMYnHmeDK828kPle8xcttQ7wuIkMG3e8qsJrihxYDdy6XrLLmj1AxUrdyFyFAKvV8DKjPHWy9cv2nnrBjJv0qnLGy+47kI7J4yR137NGz4TvnfS3IxYi1LGwvI7fi38cNVF11FRCQLlkdUYe0RWQ0RFlAu9G6/87cwLB2YnWiZ6RH+zSGcMK2/M7TPHeBtxEkJnMUjpfTVeOqsf6/XRpELwHtRDr2qfEq4LGCPvX1rQFJ11NpJKnh5MbdAOGwevQXWawrYlawKBgQDubHucFUcIyFJciu7fo3NvsbrXBWbaU6bdXZPPhSsxBfOvCIRmS0I+AqBYwjZVB+gejB3p21LFFjz9PO6ewz5bXTJrB2J8CEJfA8zj/7A2XKCl9po4X6ngDOy5ls0PwkELvnILpgdpW5ZfjEpviOHsXJk+QPHCrtINn1sHcUDeXwKBgQDxnNZidrnGgJxpDJvJtmimci5sbnnfg8Vs/YzJTyPh+9m1OZ23gg4h1mfFBi4wuSHofjD7nLG/TYFeF4BbsY032nBSz30EaSYO4IrO0UxgNGQfFnaCS0hQVr0Rr4na+KpYFr26pIJL+FGCR6iYiYTVhGVDTBLK2+WUEOve/ahSowKBgQCoIVn9lEeWWuUxm0ud6z5xKmzuSkHgfhLykZW1RlxR4reX27K6DCI3ZlS6oqH7zmqSeA50JhS1JNx3W+uNi3NCrHLsZLW/b3eWVzC6K0mQ3DrxLfhM/rDlbVfV/BC5JywFYxQ7QKaDVnGxCVZIVseyjQ4Hh3a06eD4eEKR+fxbkwKBgQDgdWflSY8FDm5AWWpRVpiaKPFf4rJuJ6i9vD+StWcMhkCWz9Ppq3UdkmYM79TxhswthS5UUhn/My3AD+07QhODk/dNt1zZQCYPJCNQR7jAl2t8Rg4KtY2UtUAosf9L4j++XkIcpsA1e5edhJzoOLmi8sBwaLf8pZT+nUnDe7toKQKBgQCxu1yYVjCz1i+sJ3inUOaGZjZ/cOLCxmGzLxpKBMPa6VHVbJZtt+n9hdU+Jxi+U1QIdXLtXdvNrkW9LrXEBvuk7uU6VBZSHmaJ/7iGl52bUuQHQnUW8ZKs30obXq7nW5K5VBcHcJMroms+e7xHS2aNdBVXNtQDCUXL3TAZnrTmVg==
KmeXpGFH77J3wowoZ7g68MDJ6X5GnGocHBhGebYeo6aZUFz3CUK/itbuWPv/mdsYqhLeRASYSUA2qrDxglrH8kxKM8WUTkstGjp1N+flX+bjItaE8sAXTF2k/0Mq3bKqpGJ7XB694CEhiS4YRLZQGgloat7aE+P32ayKbCIM58wgZa2mEFlYCbHmohX7tofsEB6DUf7LBKnYGd/MXGRwxgYPqiR3r/V38aVK4cpMRoJPqxXWsq5i2ZvFkwWXduxNXmrXFwF/7hFxqlMOpLPADFikG9cox7FicLJ3FiGZNxOrdMO/xNyGE9V3PBBwStoLqTjIrvEDPij91cEEbNWh4w==
加密后:KmeXpGFH77J3wowoZ7g68MDJ6X5GnGocHBhGebYeo6aZUFz3CUK/itbuWPv/mdsYqhLeRASYSUA2qrDxglrH8kxKM8WUTkstGjp1N+flX+bjItaE8sAXTF2k/0Mq3bKqpGJ7XB694CEhiS4YRLZQGgloat7aE+P32ayKbCIM58wgZa2mEFlYCbHmohX7tofsEB6DUf7LBKnYGd/MXGRwxgYPqiR3r/V38aVK4cpMRoJPqxXWsq5i2ZvFkwWXduxNXmrXFwF/7hFxqlMOpLPADFikG9cox7FicLJ3FiGZNxOrdMO/xNyGE9V3PBBwStoLqTjIrvEDPij91cEEbNWh4w==
解密后:測試wtyy666
2、測試
(1)私鑰加密需要公鑰解密

① 先使用私鑰加密并且解密:

 //2、加密String s = encryptRSA(algorithm, getPrivateKey(priPath,algorithm), input);System.out.println("加密后:"+s);// 3、解密String s1 = decryptRSA(algorithm, getPrivateKey(priPath,algorithm), s);System.out.println("解密后:"+s1);

運行報錯 ,因為私鑰加密,只能公鑰解密。

② 改為公鑰解密則正常運行:

String s1 = decryptRSA(algorithm, getPublicKey(pubPath,algorithm), s);

(2)公鑰加密需要私鑰解密

?① 先使用公鑰加密并且解密

 //2、加密String s = encryptRSA(algorithm, getPublicKey(pubPath,algorithm), input);System.out.println("加密后:"+s);// 3、解密String s1 = decryptRSA(algorithm, getPublicKey(pubPath,algorithm), s);System.out.println("解密后:"+s1);

同樣運行報錯

② 改為私鑰解密則正常運行:

String s1 = decryptRSA(algorithm, getPrivateKey(priPath,algorithm), s);

?

三、ECC?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40933.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【分布式系統】ELK 企業級日志分析系統

目錄 一.ELK概述 1.簡介 1.1.可以添加的其他組件 1.2.filebeat 結合 logstash 帶來好處 2.為什么使用ELK 3.完整日志系統基本特征 4.工作原理 二.部署ELK日志分析系統 1.初始化環境 2.完成JAVA部署 三. ELK Elasticsearch 集群部署 1.安裝 2.修改配置文件 3.es 性…

latex英文轉中文word,及一些latex相關工具分享

前言:想要轉換latex生成的英文pdf文件為中文word文件 一、主要步驟 1、文字翻譯:直接使用谷歌翻譯等輔助將英文翻譯成中文即可; **2、圖片:**使用latex時一般保存的.png,.bmp格式圖片可以直接插入word, 但是.eps或者…

Vue3:全局播放背景音樂

說明&#xff1a;一個全局播放的背景音樂&#xff0c;首頁無音樂無音樂圖標&#xff0c;在首頁互動跳轉頁面并開始播放音樂&#xff0c;切換頁面不需暫停音樂也不會重置音樂&#xff0c;可以通過音樂圖標控制暫停或播放。 MusicPlay.vue&#xff08;音樂組件&#xff09; <…

實習手記(2):前端菜鳥的摸魚與成長

在不斷的學習&#xff08;摸魚&#xff09;和實踐中&#xff0c;第二周也快要結束了&#xff0c;這周總體來說還是蠻不錯的比上周好很多&#xff08;沒有那么拘謹&#xff1f;&#xff09;。前面兩天一直在學習和摸魚之后就修改了幾個需求。這里記錄一下學習到的新知識、小技巧…

Vue3.js“非原始值”響應式實現基本原理筆記(一)

如果您覺得這篇文章有幫助的話&#xff01;給個點贊和評論支持下吧&#xff0c;感謝~ 作者&#xff1a;前端小王hs 阿里云社區博客專家/清華大學出版社簽約作者/csdn百萬訪問前端博主/B站千粉前端up主 此篇文章是博主于2022年學習《Vue.js設計與實現》時的筆記整理而來 書籍&a…

Sentinel限流算法總結

文章目錄 一、線程隔離二、滑動窗口算法三、令牌桶算法四、漏桶算法 一、線程隔離 線程隔離有兩種方式實現&#xff1a; 線程池隔離&#xff1a;給每個服務調用業務分配一個線程池&#xff0c;利用線程池本身實現隔離效果信號量隔離&#xff1a;不創建線程池&#xff0c;而是…

Xilinx FPGA:vivado關于同步fifo的兩個小實驗

一、實驗一&#xff1a;在同步fifo里寫一個讀一個&#xff08;寫入是8個位寬&#xff0c;讀出是16個位寬&#xff09; 程序&#xff1a; timescale 1ns / 1ps //要求寫一個讀一個 //讀寫時鐘一致&#xff0c;寫是8個位寬&#xff0c;讀是16個位寬 module sync_fifo_test(inpu…

QQ音樂Android一面涼經

最近面試了不少公司, 近期告一段落, 整理一下各家的面試問題, 打算陸續發布出來, 供有緣人參考。今天給大家帶來的是QQ音樂Android一面涼經。 面試崗位: QQ音樂Android開發工程師面試時長: 50min(提問40min 反問10min)代碼考核: 無 面試問題(40min) 自我介紹 工作經歷, 重點…

銀行信用卡風險大數據分析與挖掘2024

銀行信用卡風險大數據分析與挖掘 使用excel數據挖掘功能完成 一、信用卡客戶信用等級影響因素分析與挖掘 基于客戶信用記錄表 1. 數據預處理 瀏覽數據 客戶等級占比&#xff0c;其中優質客戶占比較少&#xff0c;風險客戶很多&#xff0c;分析影響客戶信用等級的原因 年…

vue3+ts項目中.env配置環境變量與情景配置

一、環境變量配置 官網https://cn.vitejs.dev/guide/env-and-mode.html#intellisense 1. 新建.env開頭的文件在根目錄 為了防止意外地將一些環境變量泄漏到客戶端&#xff0c;只有以 VITE_ 為前綴的變量才會暴露給經過 vite 處理的代碼 .env 所有環境默認加載 .env.developm…

數字化精益生產系統--MRP 需求管理系統

MRP&#xff08;Material Requirements Planning&#xff0c;物料需求計劃&#xff09;需求管理系統是一種在制造業中廣泛應用的計劃工具&#xff0c;旨在通過分析和計劃企業生產和庫存需求&#xff0c;優化資源利用&#xff0c;提高生產效率。以下是對MRP需求管理系統的功能設…

Raylib 坐標系

draftx 符號調整為正數 發現采樣坐標系原點0&#xff0c;0 在左上角&#xff0c;正方向 右&#xff0c;下 繪制坐標系 原點0&#xff0c;0 在左下角&#xff0c;正方向 右&#xff0c;上 拖拽可得 #include <raylib.h> // 重整原因&#xff1a;解決新函數放大縮小之下…

當需要對多個表進行聯合更新操作時,怎樣確保數據的一致性?

文章目錄 一、問題分析二、解決方案三、示例代碼&#xff08;以 MySQL 為例&#xff09;四、加鎖機制示例五、測試和驗證六、總結 在數據庫管理中&#xff0c;經常會遇到需要對多個表進行聯合更新的情況。這種操作帶來了一定的復雜性&#xff0c;因為要確保在整個更新過程中數據…

為什么需要服務器?服務器可以做些什么

目錄 一、服務器和電腦的區別二、什么是SSH三、什么是免密碼登錄四、服務器如何實現SSH免密碼登錄 一、服務器和電腦的區別 服務器和電腦是兩種不同類型的計算機系統&#xff0c;它們在設計、功能和用途上存在明顯的區別。首先&#xff0c;從硬件配置上看&#xff0c;服務器通…

vb.netcad二開自學筆記3:啟動與銷毀

Imports Autodesk.AutoCAD.ApplicationServicesImports Autodesk.AutoCAD.EditorInputImports Autodesk.AutoCAD.RuntimePublic Class WellcomCADImplements IExtensionApplicationPublic Sub Initialize() Implements IExtensionApplication.InitializeMsgBox("net程序已…

JDK都出到20多了,你還不會使用JDK8的Stream流寫代碼嗎?

目錄 前言 Stream流 是什么&#xff1f; 為什么要用Steam流 常見stream流使用案例 映射 map() & 集合 collect() 單字段映射 多字段映射 映射為其他的對象 映射為 Map 去重 distinct() 過濾 filter() Stream流的其他方法 使用Stream流的弊端 前言 當你某天看…

基于深度學習LightWeight的人體姿態檢測跌倒系統源碼

一. LightWeight概述 light weight openpose是openpose的簡化版本&#xff0c;使用了openpose的大體流程。 Light weight openpose和openpose的區別是&#xff1a; a 前者使用的是Mobilenet V1&#xff08;到conv5_5&#xff09;&#xff0c;后者使用的是Vgg19&#xff08;前10…

公務員考試、事業編考試、教師資格證、面試、K12資料、電子書

點擊上方△騰陽 關注 作者 l 騰陽 轉載請聯系授權 你好&#xff0c;我是騰陽。 在這個自媒體的海洋里&#xff0c;我曾是一只迷失方向的小鳥&#xff0c;多次嘗試飛翔卻總是跌跌撞撞。 但每一次跌倒&#xff0c;都讓我更堅定地相信&#xff0c;只要不放棄&#xff0c;總…

【Unity2D 2022:Particle System】添加命中粒子特效

一、創建粒子特效游戲物體 二、修改粒子系統屬性 1. 基礎屬性 &#xff08;1&#xff09;修改發射粒子持續時間&#xff08;Duration&#xff09;為1s &#xff08;2&#xff09;取消勾選循環&#xff08;Looping&#xff09; &#xff08;2&#xff09;修改粒子存在時間&…

2024全網最全面及最新且最為詳細的網絡安全技巧五 之 SSRF 漏洞EXP技巧,典例分析以及 如何修復 (上冊)———— 作者:LJS

五——SSRF漏洞 EXP技巧&#xff0c;典例分析以及 如何修復 目錄 五——SSRF EXP技巧&#xff0c;典例分析以及 如何修復 5.1Apache mod_proxy SSRF&#xff08;CVE-2021-40438&#xff09;的一點分析和延伸 0x01 Apache Module綜述 0x02 漏洞原理分析 Apache在配置反代的后端…