中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

阿里巴巴網(wǎng)站建設(shè)方案書商品促銷活動策劃方案

阿里巴巴網(wǎng)站建設(shè)方案書,商品促銷活動策劃方案,專業(yè)定制網(wǎng)紅變色杯,網(wǎng)站免費空間申請現(xiàn)代密碼學(xué) 散列函數(shù) 散列函數(shù),也見雜湊函數(shù)、摘要函數(shù)或哈希函數(shù),可將任意長度的消息經(jīng)過運算,變成固定長度數(shù)值,常見的有MD5、SHA-1、SHA256,多應(yīng)用在文件校驗,數(shù)字簽名中。 MD5 可以將任意長度的原文生…

現(xiàn)代密碼學(xué)

  • 散列函數(shù)
    散列函數(shù),也見雜湊函數(shù)、摘要函數(shù)或哈希函數(shù),可將任意長度的消息經(jīng)過運算,變成固定長度數(shù)值,常見的有MD5、SHA-1、SHA256,多應(yīng)用在文件校驗,數(shù)字簽名中。
    MD5 可以將任意長度的原文生成一個128位(16字節(jié))的哈希值
    SHA-1可以將任意長度的原文生成一個160位(20字節(jié))的哈希值
  1. 對稱密碼
    對稱密碼應(yīng)用了相同的加密密鑰和解密密鑰。對稱密碼分為:序列密碼(流密碼),分組密碼(塊密碼)兩種。流密碼是對信息流中的每一個元素(一個字母或一個比特)作為基本的處理單元進(jìn)行加密,塊密碼是先對信息流分塊,再對每一塊分別加密。
    例如原文為1234567890,流加密即先對1進(jìn)行加密,再對2進(jìn)行加密,再對3進(jìn)行加密……最后拼接成密文;塊加密先分成不同的塊,如1234成塊,5678成塊,90XX(XX為補(bǔ)位數(shù)字)成塊,再分別對不同塊進(jìn)行加密,最后拼接成密文。

  2. 非對稱密碼
    對稱密碼的密鑰安全極其重要,加密者和解密者需要提前協(xié)商密鑰,并各自確保密鑰的安全性,一但密鑰泄露,即使算法是安全的也無法保障原文信息的私密性。
    在實際的使用中,遠(yuǎn)程的提前協(xié)商密鑰不容易實現(xiàn),即使協(xié)商好,在遠(yuǎn)程傳輸過程中也容易被他人獲取,因此非對稱密鑰此時就凸顯出了優(yōu)勢。
    非對稱密碼有兩支密鑰,公鑰(publickey)和私鑰(privatekey),加密和解密運算使用的密鑰不同。用公鑰對原文進(jìn)行加密后,需要由私鑰進(jìn)行解密;用私鑰對原文進(jìn)行加密后(此時一般稱為簽名),需要由公鑰進(jìn)行解密(此時一般稱為驗簽)。公鑰可以公開的,大家使用公鑰對信息進(jìn)行加密,再發(fā)送給私鑰的持有者,私鑰持有者使用私鑰對信息進(jìn)行解密,獲得信息原文。因為私鑰只有單一人持有,因此不用擔(dān)心被他人解密獲取信息原文。

如何設(shè)置密碼才安全

  • 密碼不要太常見,不要使用類似于12345678這樣的常用密碼
  • 各應(yīng)用軟件密碼建議不要一樣,容易被攻擊者撞庫破解
  • 可在設(shè)置密碼時增加注冊時間、注冊地點等方法

ASCII編碼

ASCII(American Standard Code for Information Interchange,美國信息交換標(biāo)準(zhǔn)代碼)是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語和其他西歐語言。它是現(xiàn)今最通用的單字節(jié)編碼系統(tǒng),并等同于國際標(biāo)準(zhǔn)ISO/IEC 646。
在這里插入圖片描述

Byte和Bit

  • Byte : 字節(jié). 數(shù)據(jù)存儲的基本單位,比如移動硬盤1T , 單位是byte
  • bit : 比特, 又叫位. 一個位要么是0要么是1. 數(shù)據(jù)傳輸?shù)膯挝?, 比如家里的寬帶100MB,下載速度并沒有達(dá)到100MB,一般都是12-13MB,那么是因為需要使用 100 / 8
  • 關(guān)系: 1Byte = 8bit

案例如下:

package com.example.test.security;import java.io.UnsupportedEncodingException;public class test {public static void main(String[] args) throws UnsupportedEncodingException {String a = "ab";byte[] bytes = a.getBytes();//byte實際上就是ascii碼,一個英文占用一個字節(jié)for (byte b : bytes) {int c = b;System.out.println(c);//獲取byte對應(yīng)的bitString s = Integer.toBinaryString(c);System.out.println(s);}System.out.println("========================");a = "中國";bytes = a.getBytes("gbk");//byte實際上就是ascii碼.中文的編碼格式默認(rèn)是utf-8,一個中文占用3個字節(jié),gbk格式,一個中文占用2個字節(jié)for (byte b : bytes) {int c = b;System.out.println(c);//獲取byte對應(yīng)的bitString s = Integer.toBinaryString(c);System.out.println(s);}}
}

運行截圖:
在這里插入圖片描述

常見的加密方式

在這里插入圖片描述

對稱加密

  • 采用單鑰密碼系統(tǒng)的加密方法,同一個密鑰可以同時用作信息的加密和解密,這種加密方法稱為對稱加密,也稱為單密鑰加密。
  • 示例
    • 我們現(xiàn)在有一個原文3要發(fā)送給B
    • 設(shè)置密鑰為108, 3 * 108 = 324, 將324作為密文發(fā)送給B
    • B拿到密文324后, 使用324/108 = 3 得到原文
  • 常見加密算法
    • DES : Data Encryption Standard,即數(shù)據(jù)加密標(biāo)準(zhǔn),是一種使用密鑰加密的塊算法,1977年被美國聯(lián)邦政府的國家標(biāo)準(zhǔn)局確定為聯(lián)邦資料處理標(biāo)準(zhǔn)(FIPS),并授權(quán)在非密級政府通信中使用,隨后該算法在國際上廣泛流傳開來。
    • AES : Advanced Encryption Standard, 高級加密標(biāo)準(zhǔn) .在密碼學(xué)中又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所用。
  • 特點
    • 加密速度快, 可以加密大文件
    • 密文可逆, 一旦密鑰文件泄漏, 就會導(dǎo)致數(shù)據(jù)暴露
    • 加密后編碼表找不到對應(yīng)字符, 出現(xiàn)亂碼
    • 一般結(jié)合Base64使用

DES加解密案例如下

package com.example.test.security;import com.sun.org.apache.xml.internal.security.utils.Base64;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
public class test {// DES加密算法,key的大小必須是8個字節(jié)public static void main(String[] args) throws Exception {String input ="中國";// DES加密算法,key的大小必須是8個字節(jié)String key = "12dfdade";String transformation = "DES"; // 9PQXVUIhaaQ=// 指定獲取密鑰的算法String algorithm = "DES";String encryptDES = encryptDES(input, key, transformation, algorithm);System.out.println("加密:" + encryptDES);String s = decryptDES(encryptDES, key, transformation, algorithm);System.out.println("解密:" + s);}/*** 使用DES加密數(shù)據(jù)** @param input          : 原文* @param key            : 密鑰(DES,密鑰的長度必須是8個字節(jié))* @param transformation : 獲取Cipher對象的算法* @param algorithm      : 獲取密鑰的算法* @return : 密文* @throws Exception*/private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception {// 獲取加密對象Cipher cipher = Cipher.getInstance(transformation);// 創(chuàng)建加密規(guī)則// 第一個參數(shù)key的字節(jié)// 第二個參數(shù)表示加密算法SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);// ENCRYPT_MODE:加密模式// DECRYPT_MODE: 解密模式// 初始化加密模式和算法cipher.init(Cipher.ENCRYPT_MODE,sks);// 加密byte[] bytes = cipher.doFinal(input.getBytes());// 輸出加密后的數(shù)據(jù)String encode = Base64.encode(bytes);//如果不使用base64,直接使用new String(bytes)那么輸出的結(jié)果有可能是亂碼,因為對應(yīng)的字節(jié)可能出現(xiàn)負(fù)數(shù),沒有出現(xiàn)在ascii碼中return encode;}/*** 使用DES解密** @param input          : 密文* @param key            : 密鑰* @param transformation : 獲取Cipher對象的算法* @param algorithm      : 獲取密鑰的算法* @throws Exception* @return: 原文*/private static String decryptDES(String input, String key, String transformation, String algorithm) throws Exception {// 1,獲取Cipher對象Cipher cipher = Cipher.getInstance(transformation);// 指定密鑰規(guī)則SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);cipher.init(Cipher.DECRYPT_MODE, sks);// 3. 解密,上面使用的base64編碼,下面直接用密文byte[] bytes = cipher.doFinal(Base64.decode(input));//  因為是明文,所以直接返回return new String(bytes);}
}

AES加解密案例如下

package com.example.test.security;import com.sun.org.apache.xml.internal.security.utils.Base64;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
public class test {// DES加密算法,key的大小必須是8個字節(jié)public static void main(String[] args) throws Exception {String input ="中國";// AES加密算法,key的大小必須是16個字節(jié)String key = "1234567812345678";String transformation = "AES";// 指定獲取密鑰的算法String algorithm = "AES";String encryptDES = encryptAES(input, key, transformation, algorithm);System.out.println("加密:" + encryptDES);String s = decryptAES(encryptDES, key, transformation, algorithm);System.out.println("解密:" + s);}/*** 使用DES加密數(shù)據(jù)** @param input          : 原文* @param key            : 密鑰(DES,密鑰的長度必須是8個字節(jié))* @param transformation : 獲取Cipher對象的算法* @param algorithm      : 獲取密鑰的算法* @return : 密文* @throws Exception*/private static String encryptAES(String input, String key, String transformation, String algorithm) throws Exception {// 獲取加密對象Cipher cipher = Cipher.getInstance(transformation);// 創(chuàng)建加密規(guī)則// 第一個參數(shù)key的字節(jié)// 第二個參數(shù)表示加密算法SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);// ENCRYPT_MODE:加密模式// DECRYPT_MODE: 解密模式// 初始化加密模式和算法cipher.init(Cipher.ENCRYPT_MODE,sks);// 加密byte[] bytes = cipher.doFinal(input.getBytes());// 輸出加密后的數(shù)據(jù)String encode = Base64.encode(bytes);return encode;}/*** 使用DES解密** @param input          : 密文* @param key            : 密鑰* @param transformation : 獲取Cipher對象的算法* @param algorithm      : 獲取密鑰的算法* @throws Exception* @return: 原文*/private static String decryptAES(String input, String key, String transformation, String algorithm) throws Exception {// 1,獲取Cipher對象Cipher cipher = Cipher.getInstance(transformation);// 指定密鑰規(guī)則SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);cipher.init(Cipher.DECRYPT_MODE, sks);// 3. 解密,上面使用的base64編碼,下面直接用密文byte[] bytes = cipher.doFinal(Base64.decode(input));//  因為是明文,所以直接返回return new String(bytes);}
}
  • Base64算法簡介
    Base64是網(wǎng)絡(luò)上最常見的用于傳輸8Bit字節(jié)碼的可讀性編碼算法之一,可讀性編碼算法不是為了保護(hù)數(shù)據(jù)的安全性,而是為了可讀性;可讀性編碼不改變信息內(nèi)容,只改變信息內(nèi)容的表現(xiàn)形式
    所謂Base64,即是說在編碼過程中使用了64種字符:大寫A到Z、小寫a到z、數(shù)字0到9、“+”和“/”
    Base58是Bitcoin(比特幣)中使用的一種編碼方式,主要用于產(chǎn)生Bitcoin的錢包地址。相比Base64,Base58不使用數(shù)字"0",字母大寫"O",字母大寫"I",和字母小寫"i",以及"+“和”/"符號。

  • Base64算法原理
    base64 是 3個字節(jié)為一組,一個字節(jié) 8位,一共 就是24位 ,然后,把3個字節(jié)轉(zhuǎn)成4組,每組6位,3 * 8 = 4 * 6 = 24 ,每組6位,缺少的2位,會在高位進(jìn)行補(bǔ)0 ,這樣做的好處在于 ,base取的是后面6位,去掉高2位 ,那么base64的取值就可以控制在0-63位了,所以就叫base64,111 111 = 32 + 16 + 8 + 4 + 2 + 1 。

  • Base64構(gòu)成原則

    • 小寫 a-z=26個字母
    • 大寫A-Z=26個字母
    • 數(shù)字0-9=10個數(shù)字
    • +/=2個符號,大家可能發(fā)現(xiàn)一個問題,base64有個 = 號,但是在映射表里面沒有發(fā)現(xiàn) = 號,這個地方需要注意,等號非常特殊,因為base64是三個字節(jié)一組 ,如果當(dāng)我們的位數(shù)不夠的時候,會使用等號來補(bǔ)齊。
      在這里插入圖片描述
  • base64補(bǔ)等號測試

public class TestBase64 {public static void main(String[] args) {//  1:MQ== 表示一個字節(jié),不夠三個字節(jié),所以需要后面通過 == 號補(bǔ)齊System.out.println(Base64.encode("1".getBytes()));//后面補(bǔ)2個等號==
//        System.out.println(Base64.encode("12".getBytes()));//補(bǔ)1個等號=
//        System.out.println(Base64.encode("123".getBytes()));//不用補(bǔ)等號
//        // 中國:中文占6個字節(jié),6 * 8 = 48 ,剛剛好被整除,所以沒有等號
//        System.out.println(Base64.encode("中國".getBytes()));}
}

加密模式

在這里插入圖片描述

填充模式

在這里插入圖片描述

加密模式和填充模式案例

package com.example.test.security;import com.sun.org.apache.xml.internal.security.utils.Base64;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;public class test {// DES加密算法,key的大小必須是8個字節(jié)public static void main(String[] args) throws Exception {String input = "硅谷12";// DES加密算法,key的大小必須是8個字節(jié)String key = "12345678";// 指定獲取Cipher的算法,如果沒有指定加密模式和填充模式,ECB/PKCS5Padding就是默認(rèn)值//     String transformation = "DES"; // 9PQXVUIhaaQ=//String transformation = "DES/ECB/PKCS5Padding"; // 9PQXVUIhaaQ=// CBC模式,必須指定初始向量,初始向量中密鑰的長度必須是8個字節(jié)//String transformation = "DES/CBC/PKCS5Padding"; // 9PQXVUIhaaQ=// NoPadding模式,原文的長度必須是8個字節(jié)的整倍數(shù) ,所以必須把 硅谷改成硅谷12,PKCS5Padding則不需要,會自動填充String transformation = "DES/CBC/NoPadding";// 指定獲取密鑰的算法String algorithm = "DES";String encryptDES = encryptDES(input, key, transformation, algorithm);System.out.println("加密:" + encryptDES);String s = dncryptDES(encryptDES, key, transformation, algorithm);System.out.println("解密:" + s);}/*** 使用DES加密數(shù)據(jù)** @param input          : 原文* @param key            : 密鑰(DES,密鑰的長度必須是8個字節(jié))* @param transformation : 獲取Cipher對象的算法* @param algorithm      : 獲取密鑰的算法* @return : 密文* @throws Exception*/private static String encryptDES(String input, String key, String transformation, String algorithm) throws Exception {// 獲取加密對象Cipher cipher = Cipher.getInstance(transformation);// 創(chuàng)建加密規(guī)則// 第一個參數(shù)key的字節(jié)// 第二個參數(shù)表示加密算法SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);// ENCRYPT_MODE:加密模式// DECRYPT_MODE: 解密模式// 初始向量,參數(shù)表示跟誰進(jìn)行異或,初始向量的長度必須是8位IvParameterSpec iv = new IvParameterSpec(key.getBytes());// 初始化加密模式和算法cipher.init(Cipher.ENCRYPT_MODE, sks, iv);// 加密byte[] bytes = cipher.doFinal(input.getBytes());// 輸出加密后的數(shù)據(jù)String encode = Base64.encode(bytes);return encode;}/*** 使用DES解密** @param input          : 密文* @param key            : 密鑰* @param transformation : 獲取Cipher對象的算法* @param algorithm      : 獲取密鑰的算法* @throws Exception* @return: 原文*/private static String dncryptDES(String input, String key, String transformation, String algorithm) throws Exception {// 1,獲取Cipher對象Cipher cipher = Cipher.getInstance(transformation);// 指定密鑰規(guī)則SecretKeySpec sks = new SecretKeySpec(key.getBytes(), algorithm);IvParameterSpec iv = new IvParameterSpec(key.getBytes());cipher.init(Cipher.DECRYPT_MODE, sks, iv);// 3. 解密byte[] bytes = cipher.doFinal(Base64.decode(input));return new String(bytes);}}

在測試 AES 的時候需要注意,key需要16個字節(jié),加密向量也需要16個字節(jié) ,其他方式跟 DES 一樣

消息摘要

  • 消息摘要(Message Digest)又稱為數(shù)字摘要(Digital Digest)

  • 它是一個唯一對應(yīng)一個消息或文本的固定長度的值,它由一個單向Hash加密函數(shù)對消息進(jìn)行作用而產(chǎn)生

  • 使用數(shù)字摘要生成的值是不可以篡改的,為了保證文件或者值的安全

  • 特點:無論輸入的消息有多長,計算出來的消息摘要的長度總是固定的。例如應(yīng)用MD5算法摘要的消息有128個比特位,用SHA-1算法摘要的消息最終有160比特位的輸出,只要輸入的消息不同,對其進(jìn)行摘要以后產(chǎn)生的摘要消息也必不相同;但相同的輸入必會產(chǎn)生相同的輸出。消息摘要是單向、不可逆的。

獲取字符串消息摘要

package com.example.test.security;import com.sun.org.apache.xml.internal.security.utils.Base64;import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;public class test {// DES加密算法,key的大小必須是8個字節(jié)public static void main(String[] args) throws Exception{// 4124bc0a9335c27f086f24ba207a4912     md5 在線校驗// QSS8CpM1wn8IbyS6IHpJEg==             消息摘要使用的是16進(jìn)制// 原文String input = "aa";// 算法String algorithm = "MD5";// 獲取數(shù)字摘要對象MessageDigest messageDigest = MessageDigest.getInstance(algorithm);// 消息數(shù)字摘要byte[] digest = messageDigest.digest(input.getBytes());
//        System.out.println(new String(digest));//會有亂碼出現(xiàn)// base64編碼
//        System.out.println(Base64.encode(digest));//base64編碼的形式// 創(chuàng)建對象用來拼接StringBuilder sb = new StringBuilder();for (byte b : digest) {// 轉(zhuǎn)成 16進(jìn)制String s = Integer.toHexString(b & 0xff);//System.out.println(s);if (s.length() == 1){// 如果生成的字符只有一個,前面補(bǔ)0s = "0"+s;}sb.append(s);}System.out.println(sb.toString());}
}

其他數(shù)字摘要算法

public class test {public static void main(String[] args) throws Exception{// 4124bc0a9335c27f086f24ba207a4912     md5 在線校驗// QSS8CpM1wn8IbyS6IHpJEg==             消息摘要使用的是16進(jìn)制// 原文String input = "aa";// 算法String algorithm = "MD5";// 獲取數(shù)字摘要對象String md5 = getDigest(input, "MD5");System.out.println(md5);String sha1 = getDigest(input, "SHA-1");System.out.println(sha1);String sha256 = getDigest(input, "SHA-256");System.out.println(sha256);String sha512 = getDigest(input, "SHA-512");System.out.println(sha512);}private static String toHex(byte[] digest) throws Exception {//        System.out.println(new String(digest));// base64編碼
//        System.out.println(Base64.encode(digest));// 創(chuàng)建對象用來拼接StringBuilder sb = new StringBuilder();for (byte b : digest) {// 轉(zhuǎn)成 16進(jìn)制String s = Integer.toHexString(b & 0xff);if (s.length() == 1){// 如果生成的字符只有一個,前面補(bǔ)0s = "0"+s;}sb.append(s);}System.out.println("16進(jìn)制數(shù)據(jù)的長度:" + sb.toString().getBytes().length);return sb.toString();}private static String getDigest(String input, String algorithm) throws Exception {MessageDigest messageDigest = MessageDigest.getInstance(algorithm);// 消息數(shù)字摘要byte[] digest = messageDigest.digest(input.getBytes());System.out.println("密文的字節(jié)長度:" + digest.length);return toHex(digest);}}

獲取文件消息摘要

public class DigestDemo {public static void main(String[] args) throws Exception{String algorithm = "MD5";String sha1 = getDigestFile("apache-tomcat-9.0.10-windows-x64.zip", "SHA-1");System.out.println(sha1);String sha512 = getDigestFile("apache-tomcat-9.0.10-windows-x64.zip", "SHA-512");System.out.println(sha512);}private static String getDigestFile(String filePath, String algorithm) throws Exception{FileInputStream fis = new FileInputStream(filePath);int len;byte[] buffer = new byte[1024];ByteArrayOutputStream baos = new ByteArrayOutputStream();while ( (len =  fis.read(buffer))!=-1){baos.write(buffer,0,len);}// 獲取消息摘要對象MessageDigest messageDigest = MessageDigest.getInstance(algorithm);// 獲取消息摘要byte[] digest = messageDigest.digest(baos.toByteArray());System.out.println("密文的字節(jié)長度:"+digest.length);return toHex(digest);}private static String toHex(byte[] digest) {//        System.out.println(new String(digest));// 消息摘要進(jìn)行表示的時候,是用16進(jìn)制進(jìn)行表示StringBuilder sb = new StringBuilder();for (byte b : digest) {// 轉(zhuǎn)成16進(jìn)制String s = Integer.toHexString(b & 0xff);// 保持?jǐn)?shù)據(jù)的完整性,前面不夠的用0補(bǔ)齊if (s.length()==1){s="0"+s;}sb.append(s);}System.out.println("16進(jìn)制數(shù)據(jù)的長度:"+ sb.toString().getBytes().length);return sb.toString();}
}

總結(jié)

  • MD5算法 : 摘要結(jié)果16個字節(jié), 轉(zhuǎn)16進(jìn)制后32個字節(jié)
  • SHA1算法 : 摘要結(jié)果20個字節(jié), 轉(zhuǎn)16進(jìn)制后40個字節(jié)
  • SHA256算法 : 摘要結(jié)果32個字節(jié), 轉(zhuǎn)16進(jìn)制后64個字節(jié)
  • SHA512算法 : 摘要結(jié)果64個字節(jié), 轉(zhuǎn)16進(jìn)制后128個字節(jié)

非對稱加密

  1. 非對稱加密算法又稱現(xiàn)代加密算法。
  2. 非對稱加密是計算機(jī)通信安全的基石,保證了加密數(shù)據(jù)不會被破解。
  3. 與對稱加密算法不同,非對稱加密算法需要兩個密鑰:公開密鑰(publickey) 和私有密(privatekey)
  4. 公開密鑰和私有密鑰是一對
  5. 如果用公開密鑰對數(shù)據(jù)進(jìn)行加密,只有用對應(yīng)的私有密鑰才能解密。
  6. 如果用私有密鑰對數(shù)據(jù)進(jìn)行加密,只有用對應(yīng)的公開密鑰才能解密。
  7. 因為加密和解密使用的是兩個不同的密鑰,所以這種算法叫作非對稱加密算法。
  • 示例
    • 首先生成密鑰對, 公鑰為(5,14), 私鑰為(11,14)
    • 現(xiàn)在A希望將原文2發(fā)送給B
    • A使用公鑰加密數(shù)據(jù). 2的5次方mod 14 = 4 , 將密文4發(fā)送給B
    • B使用私鑰解密數(shù)據(jù). 4的11次方mod14 = 2, 得到原文2
  • 特點
    • 加密和解密使用不同的密鑰
    • 如果使用私鑰加密, 只能使用公鑰解密
    • 如果使用公鑰加密, 只能使用私鑰解密
    • 處理數(shù)據(jù)的速度較慢, 因為安全級別高
  • 常見算法
    • RSA
    • ECC

生成公鑰和私鑰

package com.example.test.security;import com.sun.org.apache.xml.internal.security.utils.Base64;import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;public class test {public static void main(String[] args) throws Exception {// 加密算法String algorithm = "RSA";//  創(chuàng)建密鑰對生成器對象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 生成密鑰對KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成私鑰PrivateKey privateKey = keyPair.getPrivate();// 生成公鑰PublicKey publicKey = keyPair.getPublic();// 獲取私鑰字節(jié)數(shù)組byte[] privateKeyEncoded = privateKey.getEncoded();// 獲取公鑰字節(jié)數(shù)組byte[] publicKeyEncoded = publicKey.getEncoded();// 對公私鑰進(jìn)行base64編碼String privateKeyString = Base64.encode(privateKeyEncoded);String publicKeyString = Base64.encode(publicKeyEncoded);// 打印私鑰System.out.println(privateKeyString);// 打印公鑰System.out.println(publicKeyString);}
}

利用公鑰和私鑰進(jìn)行加解密

package com.example.test.security;import com.sun.org.apache.xml.internal.security.utils.Base64;import javax.crypto.Cipher;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;public class test {public static void main(String[] args) throws Exception {// 加密算法String algorithm = "RSA";//  創(chuàng)建密鑰對生成器對象KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);// 生成密鑰對KeyPair keyPair = keyPairGenerator.generateKeyPair();// 生成私鑰PrivateKey privateKey = keyPair.getPrivate();// 生成公鑰PublicKey publicKey = keyPair.getPublic();// 獲取私鑰字節(jié)數(shù)組byte[] privateKeyEncoded = privateKey.getEncoded();// 獲取公鑰字節(jié)數(shù)組byte[] publicKeyEncoded = publicKey.getEncoded();// 對公私鑰進(jìn)行base64編碼String privateKeyString = Base64.encode(privateKeyEncoded);String publicKeyString = Base64.encode(publicKeyEncoded);// 打印私鑰
//        System.out.println(privateKeyString);// 打印公鑰
//        System.out.println(publicKeyString);//創(chuàng)建加密對象//參數(shù)表示加密算法Cipher cipher = Cipher.getInstance(algorithm);//私鑰加密cipher.init(Cipher.ENCRYPT_MODE, privateKey);byte[] bytes = cipher.doFinal("中國".getBytes());System.out.println(Base64.encode(bytes));//公鑰解密cipher.init(Cipher.DECRYPT_MODE, publicKey);byte[] bytes1 = cipher.doFinal(bytes);System.out.println(new String(bytes1));//公鑰加密cipher.init(Cipher.ENCRYPT_MODE, publicKey);bytes = cipher.doFinal("中國".getBytes());System.out.println(Base64.encode(bytes));//私鑰解密cipher.init(Cipher.DECRYPT_MODE, privateKey);bytes1 = cipher.doFinal(bytes);System.out.println(new String(bytes1));}}

數(shù)字簽名

數(shù)字簽名(又稱公鑰數(shù)字簽名)是只有信息的發(fā)送者才能產(chǎn)生的別人無法偽造的一段數(shù)字串,這段數(shù)字串同時也是對信息的發(fā)送者發(fā)送信息真實性的一個有效證明。它是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領(lǐng)域的技術(shù)來實現(xiàn)的,用于鑒別數(shù)字信息的方法。一套數(shù)字簽名通常定義兩種互補(bǔ)的運算,一個用于簽名,另一個用于驗證。數(shù)字簽名是非對稱密鑰加密技術(shù)與數(shù)字摘要技術(shù)的應(yīng)用。

數(shù)字簽名的含義是:在網(wǎng)絡(luò)中傳輸數(shù)據(jù)時候,給數(shù)據(jù)添加一個數(shù)字簽名,表示是誰發(fā)的數(shù)據(jù),而且還能證明數(shù)據(jù)沒有被篡改。
OK,數(shù)字簽名的主要作用就是保證了數(shù)據(jù)的有效性(驗證是誰發(fā)的)和完整性(證明信息沒有被篡改)。下面我們就來好好地看一下他的底層實現(xiàn)原理是什么樣子的。

  • 基本原理
    為了理解得清楚,我們通過案例一步一步來講解。話說張三有倆好哥們A、B。由于工作原因,張三和AB寫郵件的時候為了安全都需要加密。于是張三想到了數(shù)字簽名:

    整個思路是這個樣子的:

    第一步:加密采用非對稱加密,張三有三把鑰匙,兩把公鑰,送給朋友。一把私鑰留給自己。

    第二步:A或者B寫郵件給張三:A先用公鑰對郵件加密,然后張三收到郵件之后使用私鑰解密。

    第三步:張三寫郵件給A或者B:

    (1)張三寫完郵件,先用hash函數(shù)生成郵件的摘要,附著在文章上面,這就完成了數(shù)字簽名,然后張三再使用私鑰對摘要加密。就可以把郵件發(fā)出去了。

    (2)A或者是B收到郵件之后,先把數(shù)字簽名取下來,然后使用自己的公鑰解密即可。這時候取下來的數(shù)字簽名中的摘要若和張三的一致,那就認(rèn)為是張三發(fā)來的,再對信件本身使用Hash函數(shù),將得到的結(jié)果,與上一步得到的摘要進(jìn)行對比。如果兩者一致,就證明這封信未被修改過。

  • 數(shù)字證書
    上面提到我們對簽名進(jìn)行驗證時,需要用到公鑰。如果公鑰是偽造的,那我們無法驗證數(shù)字簽名了,也就根本不可能從數(shù)字簽名確定對方的合法性了。這時候證書就閃亮登場了。那么這個證書是如何生成的呢?
    在這里插入圖片描述

關(guān)于證書這塊,我們通一個實例:“https協(xié)議”來講解。
在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

  • 代碼實現(xiàn)
import java.security.*;
import com.sun.org.apache.xml.internal.security.utils.Base64;
public class SignatureDemo {public static void main(String[] args) throws Exception {String a = "123";//將前面獲取公私鑰的代碼抽出一個工具類來實現(xiàn)PublicKey publicKey = RsaDemo.loadPublicKeyFromFile("RSA", "a.pub");PrivateKey privateKey = RsaDemo.loadPrivateKeyFromFile("RSA", "a.pri");String signaturedData = getSignature(a, "sha256withrsa", privateKey);boolean b = verifySignature(a, "sha256withrsa", publicKey, signaturedData);}/*** 生成簽名** @param input      : 原文* @param algorithm  : 算法* @param privateKey : 私鑰* @return : 簽名* @throws Exception*/private static String getSignature(String input, String algorithm, PrivateKey privateKey) throws Exception {// 獲取簽名對象Signature signature = Signature.getInstance(algorithm);// 初始化簽名signature.initSign(privateKey);// 傳入原文signature.update(input.getBytes());// 開始簽名byte[] sign = signature.sign();// 對簽名數(shù)據(jù)進(jìn)行Base64編碼return Base64.encode(sign);}/*** 校驗簽名** @param input          : 原文* @param algorithm      : 算法* @param publicKey      : 公鑰* @param signaturedData : 簽名* @return : 數(shù)據(jù)是否被篡改* @throws Exception*/private static boolean verifySignature(String input, String algorithm, PublicKey publicKey, String signaturedData) throws Exception {// 獲取簽名對象Signature signature = Signature.getInstance(algorithm);// 初始化簽名signature.initVerify(publicKey);// 傳入原文signature.update(input.getBytes());// 校驗數(shù)據(jù)return signature.verify(Base64.decode(signaturedData));}}

keytool工具使用

  • 常用命令:
    生成keypair
    keytool -genkeypair keystore xxx.jks
    keytool -genkeypair -alias lisi keystore xxx.jks(后面部分是為證書指定別名,否則采用默認(rèn)的名稱為mykey)

  • 看看keystore中有哪些項目:
    keytool -list xxx.jks 或keytool -list -v xxx.jks
    keytool -exportcert -alias lisi -file lisi.cer

  • 生成可打印的證書:
    keytool -exportcert -alias lisi -file lisi.cer –rfc

  • 顯示數(shù)字證書文件中的證書信息:
    keytool -printcert -file lisi.cer
    直接雙擊lisi.cer,用window系統(tǒng)的內(nèi)置程序打開lisi.cer

  • 導(dǎo)出公鑰
    openssl是一個加解密工具包,這里使用openssl來導(dǎo)出公鑰信息。
    安裝 openssl:http://slproweb.com/products/Win32OpenSSL.html
    配置完環(huán)境變量之后,便可以使用openssl導(dǎo)出密鑰的公鑰了

    keytool -list -rfc --keystore xxx.jks | openssl x509 -inform pem -pubkey

http://www.risenshineclean.com/news/54625.html

相關(guān)文章:

  • dedecms 遷移 wordpressseo優(yōu)化工作內(nèi)容做什么
  • 成都房產(chǎn)網(wǎng)房天下seo研究中心官網(wǎng)
  • 中華智能自建代理網(wǎng)站搜索引擎優(yōu)化推廣
  • 怎么申請公司網(wǎng)站互動營銷的案例及分析
  • 網(wǎng)站建設(shè) 入門知識鄭州外貿(mào)網(wǎng)站推廣
  • 溫州的網(wǎng)站設(shè)計58同城關(guān)鍵詞怎么優(yōu)化
  • 網(wǎng)站診斷表正能量網(wǎng)站地址鏈接免費
  • html5 開發(fā)網(wǎng)站網(wǎng)站排名提升軟件
  • 南充房產(chǎn)網(wǎng)簽備案查詢seo排名點擊器
  • 安徽先鋒網(wǎng)站兩學(xué)一做如何優(yōu)化網(wǎng)絡(luò)連接
  • 怎樣做音視頻宣傳網(wǎng)站互聯(lián)網(wǎng)營銷軟件
  • 建設(shè)個公司網(wǎng)站需要多少費用個人在百度上發(fā)廣告怎么發(fā)
  • 有域名怎樣建設(shè)網(wǎng)站網(wǎng)站標(biāo)題seo外包優(yōu)化
  • 國外開源建站系統(tǒng)參考消息今天新聞
  • 青島網(wǎng)站建設(shè)銘盛信息品牌策略的7種類型
  • 創(chuàng)建網(wǎng)頁費用獨立站seo實操
  • 寵物網(wǎng)站模板長春做網(wǎng)站公司長春seo公司
  • 工商經(jīng)營性網(wǎng)站備案制作網(wǎng)頁的軟件有哪些
  • 移動web開發(fā)技術(shù)是什么成都網(wǎng)站seo費用
  • 網(wǎng)站開發(fā)制作計算器外鏈的作用
  • 國際機(jī)票網(wǎng)站建設(shè)seo是什么意思呢
  • 沈陽高鐵站搜索引擎優(yōu)化原理
  • 圖書館網(wǎng)站建設(shè)工作總結(jié)電腦優(yōu)化設(shè)置
  • 建設(shè)網(wǎng)站以什么為導(dǎo)向濟(jì)南全網(wǎng)推廣
  • 網(wǎng)站建設(shè)默認(rèn)字體seo是做什么的
  • 網(wǎng)站建設(shè)意向表360競價推廣怎么做
  • 嘉興企業(yè)網(wǎng)站建設(shè)推廣礦壇器材友情交換
  • 千鋒教育招聘北京中文seo
  • 免費網(wǎng)站代碼如何提升網(wǎng)站seo排名
  • 電子商務(wù)靜態(tài)網(wǎng)站建設(shè)心得上海網(wǎng)絡(luò)營銷公司