私鑰加密解密
⑴ 數字錢包 私鑰
數字錢包相當於銀行賬戶,用戶可以通過分散的方式存儲、接收和向他人發送數字化資產。任何擁有互聯網連接的人都可以創建自己獨特的錢包,該錢包在與此類資產的加密網路交互時注冊自己的私鑰和公鑰。私鑰是所有者獲得訪問此類錢包的唯一身份或密碼。公鑰是所有者用來發送或接收數字資產的地址。由於每筆交易都記錄在具有加密安全性的分布式賬本中,因此網路中的任何人都可以在保留發送方的匿名組件的同時對其進行審計。這增強了為用戶提供更透明、更可跟蹤和更安全的網路體驗,從而使他們能夠在銀行中尋找更分散的選項。
創建一個數字錢包非常容易。這就是為什麼人們相信區塊鏈應用程序可以解決銀行無存款的問題,因為世界上有更多的人可以使用互聯網,而不是銀行賬戶。區塊鏈提供的新會計系統簡化了價值轉移的過程,而不需要中介機構。
私鑰加密演算法使用單個私鑰來加密和解密數據。
由於具有密鑰的任意一方都可以使用該密鑰解密數據,因此必須保護密鑰不被未經授權的代理得到。
私鑰加密又稱為對稱加密,因為同一密鑰既用於加密又用於解密。
私鑰加密演算法非常快(與公鑰演算法相比),特別適用於對較大的數據流執行加密轉換。
通常,私鑰演算法(稱為塊密碼)用於一次加密一個數據塊。
塊密碼(如 RC2、DES、TripleDES 和 Rijndael)通過加密將 n 位元組的輸 入塊轉換為加密位元組的輸出塊。
如果要加密或解密位元組序列,必須逐塊進行。
由於 n 很小(對於 RC2、DES 和 TripleDES,n = 8 字 節;n = 16 [默認值];n = 24;對於 Rijndael,n = 32),因此必須對大於 n 的數據值一次加密一個塊。
⑵ RSA的公鑰、私鑰
RSA的公鑰、私鑰
採用單鑰 密碼系統 的加密方法,同一個 密鑰 可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單 密鑰加密 。
與對稱加密 演算法 不同, 非對稱加密演算法 需要兩個 密鑰 : 公開密鑰 (publickey)和私有密鑰(privatekey)。 公開密鑰 與私有密鑰是一對,如果用公開密鑰對數據進行加密,只有用對應的私有密鑰才能解密;如果用私有密鑰對數據進行加密,那麼只有用對應的公開密鑰才能解密。因為加密和解密使用的是兩個不同的 密鑰 ,所以這種演算法叫作 非對稱加密演算法 。
一、舉個例子
1、發消息
用對方的公鑰給對方發消息
2、發公告
發公告的時候,用自己的私鑰形成簽名!
二、加密和簽名
RSA的公鑰、私鑰是互相對應的,RSA會生成兩個密鑰,你可以把任何一個用於公鑰,然後另一個就是你必須保護好的私鑰了。
RSA的公鑰、私鑰都可以加密,也都可以解密。
其中:
用公鑰加密需要私鑰解密,稱為「加密」。由於私鑰是不公開的,確保了內容的保密,沒有私鑰無法獲得內容;
用私鑰加密需要公鑰解密,稱為「簽名」。由於公鑰是公開的,任何人都可以解密內容,但只能用發布者的公鑰解密,驗證了內容是該發布者發出的。
所以:
如果用於加密解密,那就是用公鑰加密私鑰解密(僅你可讀但別人不可讀,任何人都可寫)
如果用於證書驗證,那就是用私鑰加密公鑰解密(僅你可寫但別人不可寫,任何人都可讀)
三、認證過程
標簽: HTTP
⑶ java rsa私鑰加密
java rsa私鑰加密是什麼?讓我們一起來了解一下吧!
java rsa私鑰加密是一種加密演算法。私鑰加密演算法是用私鑰來進行加密與解密信息。私鑰加密也被稱作對稱加密,原因是加密與解密使用的秘鑰是同一個。
RSA加密需要注意的事項如下:
1. 首先產生公鑰與私鑰
2. 設計加密與解密的演算法
3. 私鑰加密的數據信息只能由公鑰可以解密
4. 公鑰加密的數據信息只能由私鑰可以解密
實戰演練,具體步驟如下: public class RsaCryptTools { private static final String CHARSET = "utf-8"; private static final Base64.Decoder decoder64 = Base64.getDecoder(); private static final Base64.Encoder encoder64 = Base64.getEncoder(); /** * 生成公私鑰 * @param keySize * @return * @throws NoSuchAlgorithmException */ public static SecretKey generateSecretKey(int keySize) throws NoSuchAlgorithmException { //生成密鑰對 KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); keyGen.initialize(keySize, new SecureRandom()); KeyPair pair = keyGen.generateKeyPair(); PrivateKey privateKey = pair.getPrivate(); PublicKey publicKey = pair.getPublic(); //這里可以將密鑰對保存到本地 return new SecretKey(encoder64.encodeToString(publicKey.getEncoded()), encoder64.encodeToString(privateKey.getEncoded())); } /** * 私鑰加密 * @param data * @param privateInfoStr * @return * @throws IOException * @throws InvalidCipherTextException */ public static String encryptData(String data, String privateInfoStr) throws IOException, InvalidKeySpecException, NoSuchAlgorithmException, InvalidKeyException, NoSuchPaddingException, BadPaddingException, IllegalBlockSizeException { Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, getPrivateKey(privateInfoStr)); return encoder64.encodeToString(cipher.doFinal(data.getBytes(CHARSET))); } /** * 公鑰解密 * @param data * @param publicInfoStr * @return */ public static String decryptData(String data, String publicInfoStr) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException { byte[] encryptDataBytes=decoder64.decode(data.getBytes(CHARSET)); //解密 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.DECRYPT_MODE, getPublicKey(publicInfoStr)); return new String(cipher.doFinal(encryptDataBytes), CHARSET); } private static PublicKey getPublicKey(String base64PublicKey) throws NoSuchAlgorithmException, InvalidKeySpecException { X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(base64PublicKey.getBytes())); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); return keyFactory.generatePublic(keySpec); } private static PrivateKey getPrivateKey(String base64PrivateKey) throws NoSuchAlgorithmException, InvalidKeySpecException { PrivateKey privateKey = null; PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(base64PrivateKey.getBytes())); KeyFactory keyFactory = null; keyFactory = KeyFactory.getInstance("RSA"); privateKey = keyFactory.generatePrivate(keySpec); return privateKey; } /** * 密鑰實體 * @author hank * @since 2020/2/28 0028 下午 16:27 */ public static class SecretKey { /** * 公鑰 */ private String publicKey; /** * 私鑰 */ private String privateKey; public SecretKey(String publicKey, String privateKey) { this.publicKey = publicKey; this.privateKey = privateKey; } public String getPublicKey() { return publicKey; } public void setPublicKey(String publicKey) { this.publicKey = publicKey; } public String getPrivateKey() { return privateKey; } public void setPrivateKey(String privateKey) { this.privateKey = privateKey; } @Override public String toString() { return "SecretKey{" + "publicKey='" + publicKey + '\'' + ", privateKey='" + privateKey + '\'' + '}'; } } private static void writeToFile(String path, byte[] key) throws IOException { File f = new File(path); f.getParentFile().mkdirs(); try(FileOutputStream fos = new FileOutputStream(f)) { fos.write(key); fos.flush(); } } public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, IOException, BadPaddingException, IllegalBlockSizeException, InvalidKeyException, InvalidKeySpecException { SecretKey secretKey = generateSecretKey(2048); System.out.println(secretKey); String enStr = encryptData("你好測試測試", secretKey.getPrivateKey()); System.out.println(enStr); String deStr = decryptData(enStr, secretKey.getPublicKey()); System.out.println(deStr); enStr = encryptData("你好測試測試hello", secretKey.getPrivateKey()); System.out.println(enStr); deStr = decryptData(enStr, secretKey.getPublicKey()); System.out.println(deStr); } }
⑷ 什麼是公鑰加密和私鑰解密
如果只是單方面採用非對稱性加密演算法,其實有兩種方式,用於不同用處.
第一種是簽名,使用私鑰加密,公鑰解密,用於讓所有公鑰所有者驗證私鑰所有者的身份並且用來防止私鑰所有者發布的內容被篡改.但是不用來保證內容不被他人獲得.
第二種是加密,用公鑰加密,私鑰解密,用於向公鑰所有者發布信息,這個信息可能被他人篡改,但是無法被他人獲得.
如果甲想給乙發一個安全的保密的數據,那麼應該甲乙各自有一個私鑰,甲先用乙的公鑰加密這段數據,再用自己的私鑰加密這段加密後的數據.最後再發給乙,這樣確保了內容即不會被讀取,也不會被篡改.
⑸ 數據加密主要涉及三要素
數據加密主要涉及三要素:明文、密鑰、密文。
非對稱加密:
在加解密的時候,使用的是不同的密鑰:一個是公鑰,一個是私鑰
密鑰的使用:
公鑰加密,私鑰解密
私鑰解密,公鑰加密
密鑰的特點:
公鑰:公共的密鑰,可以發給任何人
私鑰:只有生成密鑰的一端可以持有,其他人不能知曉,所以需要保管好私鑰
加密速度慢,加密效率低(相對於對稱加密)
適合加密少量的數據
加密等級較高(相對於對稱加密)
非對稱加密的密鑰分發指的是公鑰的分發,私鑰需要保存好