1. 程式人生 > >碼路,心路,知行合一。

碼路,心路,知行合一。

Java加解密

實現方式:JDK實現,CCBC

JDK提供比較基礎的底層的實現;CC提供一些簡化的操作;BC提供補充

一、Base64加密

非常簡單,加密解密就一個函式。

程式碼如下:

public static void jdkBase64() {

	try {

		//加密:

		BASE64Encoder encoder = new BASE64Encoder();

		String encode = encoder.encode(src.getBytes());

		System.out.println("encode : " + encode);

		

		//解密

		BASE64Decoder decoder = new BASE64Decoder();

		String decode = new String(decoder.decodeBuffer(encode));

		System.out.println("decode : " + decode);

	} catch (IOException e) {

		e.printStackTrace();

	}

}



public static void commonsCodesBase64(){

	//加密

	byte[] encodeBytes = Base64.encodeBase64(src.getBytes());

	System.out.println("encode : " + new String(encodeBytes));

	//解密

	byte[] decodeBytes = Base64.decodeBase64(encodeBytes);

	System.err.println("decode : " + new String(decodeBytes));

}


二、訊息摘要演算法加密————主要用於驗證資料完整性。

MD(訊息摘要):

public static void jdkMD5(){

	try {

		MessageDigest md = MessageDigest.getInstance("MD5");

		byte[] md5Bytes = md.digest(src.getBytes());

		//把byte陣列轉換為字串

		System.out.println("jdkmd5 : " + Hex.encodeHexString(md5Bytes));//CC實現轉換

			} catch (NoSuchAlgorithmException e) {

		e.printStackTrace();

	}

}

SHA(安全雜湊)

JDK實現和MD一樣。

BC實現如下:(Digest類)

public static void bcSHA1() {

	Digest digest = new SHA1Digest();

	digest.update(src.getBytes(), 0, src.getBytes().length);

	byte[] sha1Bytes = new byte[digest.getDigestSize()];

	digest.doFinal(sha1Bytes, 0);

	System.out.println("bc sha-1 : " + org.bouncycastle.util.encoders.Hex.toHexString(sha1Bytes));

}

CC實現最簡單(就是一個DigestUtils靜態方法):

public static void ccSHA1() {

	System.out.println("cc sha1 - 1 :" + DigestUtils.sha1Hex(src.getBytes()));

	System.out.println("cc sha1 - 2 :" + DigestUtils.sha1Hex(src));

}

MAC(訊息認證碼)——含有金鑰的雜湊函式演算法

相容MDSHA的特性,但加入了金鑰。

主要JDKBouncy Castle實現。

JDK實現:獲取或定義金鑰(byte[]陣列),Mac類 例項化、初始化、執行。

BC實現:Hmac類 例項化、初始化、執行。

三、對稱加解密

對稱加密指加密和解密使用相同金鑰的加密演算法。這裡將介紹DES3DESAESPBE幾種常見的對稱加密演算法在Java中的實現。

DES3DESAES(金鑰)、PBE(口令和鹽)

DES

JDK實現:生成並轉換KeyCipher類的例項化(getInstance)、初始化(init選擇模式與Key);執行(doFinal)加解密。

推薦BC實現方式:Security.addProvider(newBouncyCastleProvider());

然後剩下的程式碼就可以和JDK實現程式碼基本一樣了。

3DESAES實現基本一樣,所以就不一一介紹。。。

PBE(基於口令的加密)

特點:通過 salt + 口令

實現:初始化鹽;生成口令;Cipher類加解密。

四、非對稱加解密

非對稱加密演算法是一種基於金鑰的保密方法,需要公開金鑰和私有金鑰,在檔案加密、尤其是網銀中應用廣泛。這裡主要介紹非對稱加密演算法的實現過程,DHRSAELGamal等幾種常見的非對稱加密演算法的在Java中的應用。

概念:公鑰、私鑰;

DH(金鑰交換演算法)

程式碼實現有些麻煩

——初始化傳送方金鑰

-KeyPairGenerator :能產生KeyPair

-KeyPair :常用的金鑰載體,稱為金鑰對,分為公鑰PublicKey與私鑰PrivateKey

-PublicKey

——初始化接收方金鑰

-KeyFactory :金鑰工廠,生成金鑰,通過某種金鑰的規範來還原金鑰

-X509EncodedKeySpec :根據ASN.1進行金鑰編碼

-DHPublicKey

-DHParameterSpec :遵從DH演算法發引數的集合

-KeyPairGenerator

-PrivateKey

——雙髮根據公佈的對方的PublicKey構建本地金鑰,

——構建出來的本地金鑰是一致的

-KeyAgreement :用來提供金鑰一致性協議

-SecretKey :祕密金鑰,對稱

-KeyFactory

-X509EncodedKeySpec

-PublicKey

——加密、解密(利用本地金鑰)

-Cipher :為加密和解密提供密碼功能的類

 

解釋:

首先,傳送方產生金鑰對,並公開 公鑰;接收方根據這個公鑰產生金鑰對,然後也公開自己的 公鑰。

然後,傳送方根據接收方的 公鑰 產生自己本地的金鑰(本地金鑰一般是採用對稱金鑰),接收方也根據傳送方的 公鑰 產生自己本地的金鑰。其實,這樣雙方產生的本地金鑰是相同的。

最後,雙方就可以利用本地金鑰進行加解密了。

RSA(基於因子分解):程式碼實現較為簡單

初始化金鑰(包含公鑰、金鑰)。

可以利用公鑰加密,私鑰解密;也可以私鑰加密,公鑰解密

使用過程:雙方分別掌握公鑰與私鑰中的一種,然後就可以加密並傳輸資料了。

public static void jdkRSA() {

	try {

		//1.初始化金鑰

		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

		keyPairGenerator.initialize(512);

		KeyPair keyPair = keyPairGenerator.generateKeyPair();

		RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();

		RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();

		System.out.println("Public Key : " + Base64.encodeBase64String(rsaPublicKey.getEncoded())); 

		System.out.println("Private Key : " + Base64.encodeBase64String(rsaPrivateKey.getEncoded())); 

		

		//2.私鑰加密、公鑰解密——加密

		PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());

		KeyFactory keyFactory = KeyFactory.getInstance("RSA");

		PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

		Cipher cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.ENCRYPT_MODE, privateKey);

		byte[] result = cipher.doFinal(src.getBytes());

		System.out.println("私鑰加密、公鑰解密——加密 : " + Base64.encodeBase64String(result));

		

		//3.私鑰加密、公鑰解密——解密

		X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());

		keyFactory = KeyFactory.getInstance("RSA");

		PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);

		cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.DECRYPT_MODE, publicKey);

		result = cipher.doFinal(result);

		System.out.println("私鑰加密、公鑰解密——解密:" + new String(result));

		

		//4.公鑰加密、私鑰解密——加密

		x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());

		keyFactory = KeyFactory.getInstance("RSA");

		publicKey = keyFactory.generatePublic(x509EncodedKeySpec);

		cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.ENCRYPT_MODE, publicKey);

		result = cipher.doFinal(src.getBytes());

		System.out.println("公鑰加密、私鑰解密——加密 : " + Base64.encodeBase64String(result));

		

		//5.公鑰加密、私鑰解密——解密

		pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());

		keyFactory = KeyFactory.getInstance("RSA");

		privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

		cipher = Cipher.getInstance("RSA");

		cipher.init(Cipher.DECRYPT_MODE, privateKey);

		result = cipher.doFinal(result);

		System.out.println("公鑰加密、私鑰解密——解密:" + new String(result));

	} catch (Exception e) {

		e.printStackTrace();

	}

}

EIGamal(基於離散因數)

JDK沒有實現,只能利用BC實現。

首先,Security.addProvider(newBouncyCastleProvider());

之後實現類似於RSA

 

五.Java實現數字簽名

數字簽名用於鑑別數字資訊,公鑰和私鑰,私鑰對資料簽名,公鑰用於檢驗。

過程為:首先初始化一個金鑰對,在金鑰對的基礎上進行簽名與驗證。

1、RSA:既可以加解密,也可以數字簽名。

初始化金鑰對:KeyPairGeneratorKeyPairRSAPublicPSAPrivate

執行簽名;Signature

驗證簽名;Signature

2、DSA(數字簽名演算法)

初始化金鑰對,公鑰、私鑰;

執行簽名,用私鑰簽名;

驗證簽名,用公鑰驗證;

3、ECDSA

微軟序列號便是採用的ECDSA演算法進行的簽名。速度快,強度高,簽名短。

初始化金鑰對;

執行簽名;

驗證簽名

相關推薦

心路合一

Java加解密 實現方式:JDK實現,CC,BC JDK提供比較基礎的底層的實現;CC提供一些簡化的操作;BC提供補充 一、Base64加密 非常簡單,加密解密就一個函式。 程式碼如下: public static void jdkBase64() { try {

從“讀萬卷書”到“萬里如何做到合一

生活不是抽象任性的美好暢想,是具體而細微的實際行動。讓自己慢下來,從容做事,優雅生活,這才是生活的最終目的。 ——吳軍 一、我們為什麼要閱讀 現在是一個電子媒體高度發達的時代,尤其內容展示的方式上是非常豐富的。在這種情況下,人真正用來讀文字的時間相對是減少的。 如今,很多人慢慢都

GAMELOFT9----讀萬卷書萬里合一

Deferred物件是由$.Deferred構造的,$.Deferred被實現為簡單工廠模式。 它用來解決JS中的非同步程式設計,它遵循 Common Promise/A 規範。實現此規範的還有 when.js 和 dojo。 $.Deferred作為

近期辦事犯錯總結-合一在行前-解決問題前首先要搞清楚問題

審核 blog 部門 pos body 區別 居住 老婆 流程 事件一:辦卡出錯 幫老婆去辦卡。老婆給了辦卡流程,然後按照流程去辦理。 中間跳過很多環節; 在直接辦卡環節,告訴工作人員我要辦卡,工作人員確認“你要辦卡嗎?”,我說是; 結果悲劇出現了,辦卡人員錄入身份證號後告

合一】厚積薄發格物致簡單點做事的動機簡單點

關於博主 目前主要學習機器人導航與定位演算法: 基本掌握filter-slam,graph-slam框架,熟悉單目tracking部分的direct method 和 feature method. 熟悉單目mapping部分的深度估計,正在努力學習semi-dense

合一

tar 運用 target 客體 王陽明 現實 便是 命題 並行 http://www.baike.com/wiki/知行合一 知行合一,是指客體順應主體,知是指科學知識,行是指人的實踐,知與行的合一,既不是以知來吞並行,認為知便是行,也不是以行來吞並知,認為行便是知。是明

讀書筆記 - 《王陽明大傳:合一的心學智慧》

掌握 能夠 價值 介紹 詳細 開始 記得 不知道 信念 已經不記得是什麽時候開始讀這套書,直到今天才終於初步完成,這真是一段艱苦的心靈旅程。 作為陽明學和王陽明研究的大師,作者在書中巨細靡遺的介紹了王陽明有記載的所有活動和事件,摻雜大量原古文和詩文,對於詳細的時間和事件的細

上海世基——合一培訓

就是 上海 人做 其實在 python 學習 多人 其他 方法 傑鍋說,90%的人做股票虧錢的原因是沒有知行合一,許許多多的人都是各自有自己的方法選股賣股,但是還是虧錢的,原因就是沒有真正的執行力。 很多人都有使用黃藍帶,但是藍賣並沒有嚴格執行,導致在市場虧錢。虧錢了舍不得

合一 王陽明》讀後感悟

        該書作者為度陰山,主要講述了我國明朝時期心學家王陽明(王守仁)的人生歷程和陽明心學的來源及“修煉”法門。通讀全書,給我留下印象最深的幾個詞語是“知行合一”、“致良知”、“心即理”及王陽明晚年對自己心學的歸納“四句教”。陽明心學,用現代的話總結就是用良知的心作為

江南孤鶩——“合一”的Software Developer

解決方案 首先,用絕對定位以及z-index將div至於最底部: position: absolute; z-index:-999; 然後,讓絕對定位的div水平居中。使用負外

漫談 · 比合一更重要的是意合一

本文來源於本人微信公眾號:https://mp.weixin.qq.com/s/g8Tdi20gPhyAPq-W_-k6gw   人生修行在於不斷的提升自己的認知,並達到認知和行為的一致性。這就是所謂的知行合一。   知行合一,本就是非常困難的。在於認知的提升

忠信篤敬 合一 自強不息 和而不同

lucene學習 Lucene 簡介 Lucene 是一個基於 Java 的全文資訊檢索工具包,它不是一個完整的搜尋應用程式,而是為你的應用程式提供索引和搜尋功能。Lucene 目前是 Apache Jakarta 家族中的一個開源專案。也是目前最為

更上一層樓!(海納百川、自強不息、厚德篤學、合一 -- 大連理工大學)

Lucene&Compass搜尋框架 Lucene是一款Apache頂級專案,在全文搜尋方面做得很好。而Compass是基於Lucene的一款二次封裝的更加易用的搜尋框架。我們可以基於這兩個框架做出適合我們自己專案的站內搜

因為專註 所以專業 合一

工具 理解 感謝 power 還得 秘書 自己 pow cmd 因為專註 所以專業 知行合一 還有很多WINDOWS 功能 和工具 不知道, 能把系統平臺 學好 已經非常不錯了。 美國的DON JONES 大半輩子 把 CMD 和POWERSHELL 搞清楚 非

洗禮靈魂修煉python(3)--從一個簡單的print代揭露編碼問題原理和語法習慣

比較 編譯 windows 機器 函數 容易 打印字符 出現 無法 前期工作已經準備好後,可以打開IDE編輯器了,你可以選擇python自帶的IDLE,也可以選擇第三方的,這裏我使用pycharm——一個專門為python而生的編譯器 第一個python代碼當然是所有開發語

大神手把手教你寫一個頁面模板引擎只需20Javascript代

[1] 表達 最終 strong ice ali 開頭 syntax years 只用20行Javascript代碼就寫出一個頁面模板引擎的大神是AbsurdJS的作者,下面是他分享的全文,轉需。 不知道你有木有聽說過一個基於Javascript的Web頁面預處理器,叫做A

吳恩達實驗(神經網絡和深度學習)第一課第三周和數據集親測可運

HR tps size nac www cond -c 自己 c-c 代碼和數據集已上傳到文件中 應該可以直接下載吧(第一次上傳文件,感覺是),解壓後把文件夾拷貝到jupyter工作空間即可 註:我對下載的代碼的格式稍作了修改,原來定義函數與調用函數在兩個單元格裏,我直

給大家分享一個在Android中獲取驗證的倒數計時器已經封裝好了直接引用就

獲取簡訊驗證碼後,倒數一分鐘,重新獲取 package com.example.tsx.mytest; import android.annotation.SuppressLint; import android.app.Activity; import andro

linux系統中部署項目驗證不能正常顯示而windows下面的tomcat下運驗證能正常顯示之解決辦法

windows 解決辦法 ali -a 修改 不能 項目 clas bsp linux下驗證碼功能不能正常顯示 步驟方法:1、修改${TOMCAT_HOME}/bin/catalina.sh (windows修改catalina.bat)。2、查找到-Djava.io.tm

【 58沈劍 架構師之】InnoDB5項最佳實踐其所以然

快取講了一個月《快取架構,一篇足夠》。今天,開始寫資料庫。   第一篇,說說MySQL兩個最常用的儲存引擎,MyISAM和InnoDB。照自己的理解,把一些知識點總結出來,不只說知識點,多講“為什麼”。 一、關於count(*) 知識點:MyISAM會直接儲存總行數,InnoDB則不會,需要按