日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java 加密解密简单实现

發(fā)布時(shí)間:2024/4/14 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 加密解密简单实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自:http://www.iteye.com/topic/572581

?

加密算法有很多種:這里只大約列舉幾例:

1:消息摘要:(數(shù)字指紋):既對(duì)一個(gè)任意長(zhǎng)度的一個(gè)數(shù)據(jù)塊進(jìn)行計(jì)算,產(chǎn)生一個(gè)唯一指紋。MD5/SHA1
發(fā)送給其他人你的信息和摘要,其他人用相同的加密方法得到摘要,最后進(jìn)行比較摘要是否相同。

2:單匙密碼體制:DES:比較簡(jiǎn)便高效,密鑰簡(jiǎn)短,加解密速度快,破譯極其困難,但其安全性依賴于密匙的安全性。
DES(Data Encryption Standard)是發(fā)明最早的最廣泛使用的分組對(duì)稱加密算法。DES算法的入口參數(shù)有三個(gè):Key、Data、Mode。其中Key為8個(gè)字節(jié)共64位,是DES算法的工作密鑰;Data也為8個(gè)字節(jié)64位,是要被加密或被解密的數(shù)據(jù);Mode為DES的工作方式,有兩種:加密或解密

3:數(shù)字簽名:就是信息發(fā)送者用其私鑰對(duì)從所傳報(bào)文中提取出的特征數(shù)據(jù)(或稱數(shù)字指紋)進(jìn)行RSA算法操作,以保證發(fā)信人無(wú)法抵賴曾發(fā)過該信息(即不可抵賴性),同時(shí)也確保信息報(bào)文在經(jīng)簽名后末被篡改(即完整性)。當(dāng)信息接收者收到報(bào)文后,就可以用發(fā)送者的公鑰對(duì)數(shù)字簽名進(jìn)行驗(yàn)證。
代表:DSA

4:非對(duì)稱密匙密碼體制(公匙體系):加密密匙不同于解密密匙,加密密匙公之于眾,誰(shuí)都可以使用,解密密匙只有解密人自己知道。代表:RSA

下面是對(duì)上面幾個(gè)例子進(jìn)行的簡(jiǎn)單實(shí)現(xiàn):

?

package test; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.*; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; /*** 加密解密* * @author shy.qiu* @since http://blog.csdn.net/qiushyfm*/ public class CryptTest {/*** 進(jìn)行MD5加密* * @param info* 要加密的信息* @return String 加密后的字符串*/public String encryptToMD5(String info) {byte[] digesta = null;try {// 得到一個(gè)md5的消息摘要MessageDigest alga = MessageDigest.getInstance("MD5");// 添加要進(jìn)行計(jì)算摘要的信息alga.update(info.getBytes());// 得到該摘要digesta = alga.digest();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 將摘要轉(zhuǎn)為字符串String rs = byte2hex(digesta);return rs;}/*** 進(jìn)行SHA加密* * @param info* 要加密的信息* @return String 加密后的字符串*/public String encryptToSHA(String info) {byte[] digesta = null;try {// 得到一個(gè)SHA-1的消息摘要MessageDigest alga = MessageDigest.getInstance("SHA-1");// 添加要進(jìn)行計(jì)算摘要的信息alga.update(info.getBytes());// 得到該摘要digesta = alga.digest();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 將摘要轉(zhuǎn)為字符串String rs = byte2hex(digesta);return rs;}// ///*** 創(chuàng)建密匙* * @param algorithm* 加密算法,可用 DES,DESede,Blowfish* @return SecretKey 秘密(對(duì)稱)密鑰*/public SecretKey createSecretKey(String algorithm) {// 聲明KeyGenerator對(duì)象KeyGenerator keygen;// 聲明 密鑰對(duì)象SecretKey deskey = null;try {// 返回生成指定算法的秘密密鑰的 KeyGenerator 對(duì)象keygen = KeyGenerator.getInstance(algorithm);// 生成一個(gè)密鑰deskey = keygen.generateKey();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}// 返回密匙return deskey;}/*** 根據(jù)密匙進(jìn)行DES加密* * @param key* 密匙* @param info* 要加密的信息* @return String 加密后的信息*/public String encryptToDES(SecretKey key, String info) {// 定義 加密算法,可用 DES,DESede,BlowfishString Algorithm = "DES";// 加密隨機(jī)數(shù)生成器 (RNG),(可以不寫)SecureRandom sr = new SecureRandom();// 定義要生成的密文byte[] cipherByte = null;try {// 得到加密/解密器Cipher c1 = Cipher.getInstance(Algorithm);// 用指定的密鑰和模式初始化Cipher對(duì)象// 參數(shù):(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)c1.init(Cipher.ENCRYPT_MODE, key, sr);// 對(duì)要加密的內(nèi)容進(jìn)行編碼處理,cipherByte = c1.doFinal(info.getBytes());} catch (Exception e) {e.printStackTrace();}// 返回密文的十六進(jìn)制形式return byte2hex(cipherByte);}/*** 根據(jù)密匙進(jìn)行DES解密* * @param key* 密匙* @param sInfo* 要解密的密文* @return String 返回解密后信息*/public String decryptByDES(SecretKey key, String sInfo) {// 定義 加密算法,String Algorithm = "DES";// 加密隨機(jī)數(shù)生成器 (RNG)SecureRandom sr = new SecureRandom();byte[] cipherByte = null;try {// 得到加密/解密器Cipher c1 = Cipher.getInstance(Algorithm);// 用指定的密鑰和模式初始化Cipher對(duì)象c1.init(Cipher.DECRYPT_MODE, key, sr);// 對(duì)要解密的內(nèi)容進(jìn)行編碼處理cipherByte = c1.doFinal(hex2byte(sInfo));} catch (Exception e) {e.printStackTrace();}// return byte2hex(cipherByte);return new String(cipherByte);}// //*** 創(chuàng)建密匙組,并將公匙,私匙放入到指定文件中* * 默認(rèn)放入mykeys.bat文件中*/public void createPairKey() {try {// 根據(jù)特定的算法一個(gè)密鑰對(duì)生成器KeyPairGenerator keygen = KeyPairGenerator.getInstance("DSA");// 加密隨機(jī)數(shù)生成器 (RNG)SecureRandom random = new SecureRandom();// 重新設(shè)置此隨機(jī)對(duì)象的種子random.setSeed(1000);// 使用給定的隨機(jī)源(和默認(rèn)的參數(shù)集合)初始化確定密鑰大小的密鑰對(duì)生成器keygen.initialize(512, random);// keygen.initialize(512);// 生成密鑰組KeyPair keys = keygen.generateKeyPair();// 得到公匙PublicKey pubkey = keys.getPublic();// 得到私匙PrivateKey prikey = keys.getPrivate();// 將公匙私匙寫入到文件當(dāng)中doObjToFile("mykeys.bat", new Object[] { prikey, pubkey });} catch (NoSuchAlgorithmException e) {e.printStackTrace();}}/*** 利用私匙對(duì)信息進(jìn)行簽名 把簽名后的信息放入到指定的文件中* * @param info* 要簽名的信息* @param signfile* 存入的文件*/public void signToInfo(String info, String signfile) {// 從文件當(dāng)中讀取私匙PrivateKey myprikey = (PrivateKey) getObjFromFile("mykeys.bat", 1);// 從文件中讀取公匙PublicKey mypubkey = (PublicKey) getObjFromFile("mykeys.bat", 2);try {// Signature 對(duì)象可用來生成和驗(yàn)證數(shù)字簽名Signature signet = Signature.getInstance("DSA");// 初始化簽署簽名的私鑰signet.initSign(myprikey);// 更新要由字節(jié)簽名或驗(yàn)證的數(shù)據(jù)signet.update(info.getBytes());// 簽署或驗(yàn)證所有更新字節(jié)的簽名,返回簽名byte[] signed = signet.sign();// 將數(shù)字簽名,公匙,信息放入文件中doObjToFile(signfile, new Object[] { signed, mypubkey, info });} catch (Exception e) {e.printStackTrace();}}/*** 讀取數(shù)字簽名文件 根據(jù)公匙,簽名,信息驗(yàn)證信息的合法性* * @return true 驗(yàn)證成功 false 驗(yàn)證失敗*/public boolean validateSign(String signfile) {// 讀取公匙PublicKey mypubkey = (PublicKey) getObjFromFile(signfile, 2);// 讀取簽名byte[] signed = (byte[]) getObjFromFile(signfile, 1);// 讀取信息String info = (String) getObjFromFile(signfile, 3);try {// 初始一個(gè)Signature對(duì)象,并用公鑰和簽名進(jìn)行驗(yàn)證Signature signetcheck = Signature.getInstance("DSA");// 初始化驗(yàn)證簽名的公鑰signetcheck.initVerify(mypubkey);// 使用指定的 byte 數(shù)組更新要簽名或驗(yàn)證的數(shù)據(jù)signetcheck.update(info.getBytes());System.out.println(info);// 驗(yàn)證傳入的簽名return signetcheck.verify(signed);} catch (Exception e) {e.printStackTrace();return false;}}/*** 將二進(jìn)制轉(zhuǎn)化為16進(jìn)制字符串* * @param b* 二進(jìn)制字節(jié)數(shù)組* @return String*/public String byte2hex(byte[] b) {String hs = "";String stmp = "";for (int n = 0; n < b.length; n++) {stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));if (stmp.length() == 1) {hs = hs + "0" + stmp;} else {hs = hs + stmp;}}return hs.toUpperCase();}/*** 十六進(jìn)制字符串轉(zhuǎn)化為2進(jìn)制* * @param hex* @return*/public byte[] hex2byte(String hex) {byte[] ret = new byte[8];byte[] tmp = hex.getBytes();for (int i = 0; i < 8; i++) {ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);}return ret;}/*** 將兩個(gè)ASCII字符合成一個(gè)字節(jié); 如:"EF"--> 0xEF* * @param src0* byte* @param src1* byte* @return byte*/public static byte uniteBytes(byte src0, byte src1) {byte _b0 = Byte.decode("0x" + new String(new byte[] { src0 })).byteValue();_b0 = (byte) (_b0 << 4);byte _b1 = Byte.decode("0x" + new String(new byte[] { src1 })).byteValue();byte ret = (byte) (_b0 ^ _b1);return ret;}/*** 將指定的對(duì)象寫入指定的文件* * @param file* 指定寫入的文件* @param objs* 要寫入的對(duì)象*/public void doObjToFile(String file, Object[] objs) {ObjectOutputStream oos = null;try {FileOutputStream fos = new FileOutputStream(file);oos = new ObjectOutputStream(fos);for (int i = 0; i < objs.length; i++) {oos.writeObject(objs[i]);}} catch (Exception e) {e.printStackTrace();} finally {try {oos.close();} catch (IOException e) {e.printStackTrace();}}}/*** 返回在文件中指定位置的對(duì)象* * @param file* 指定的文件* @param i* 從1開始* @return*/public Object getObjFromFile(String file, int i) {ObjectInputStream ois = null;Object obj = null;try {FileInputStream fis = new FileInputStream(file);ois = new ObjectInputStream(fis);for (int j = 0; j < i; j++) {obj = ois.readObject();}} catch (Exception e) {e.printStackTrace();} finally {try {ois.close();} catch (IOException e) {e.printStackTrace();}}return obj;}/*** 測(cè)試* * @param args*/public static void main(String[] args) {CryptTest jiami = new CryptTest();// 執(zhí)行MD5加密"Hello world!"System.out.println("Hello經(jīng)過MD5:" + jiami.encryptToMD5("Hello"));// 生成一個(gè)DES算法的密匙SecretKey key = jiami.createSecretKey("DES");// 用密匙加密信息"Hello world!"String str1 = jiami.encryptToDES(key, "Hello");System.out.println("使用des加密信息Hello為:" + str1);// 使用這個(gè)密匙解密String str2 = jiami.decryptByDES(key, str1);System.out.println("解密后為:" + str2);// 創(chuàng)建公匙和私匙jiami.createPairKey();// 對(duì)Hello world!使用私匙進(jìn)行簽名jiami.signToInfo("Hello", "mysign.bat");// 利用公匙對(duì)簽名進(jìn)行驗(yàn)證。if (jiami.validateSign("mysign.bat")) {System.out.println("Success!");} else {System.out.println("Fail!");}} }

?

用到的重要的類
javax.crypto.KeyGenerator
public final SecretKey generateKey()生成一個(gè)密鑰
public static final KeyGenerator getInstance(String algorithm) 返回生成指定算法的秘密密鑰的KeyGenerator對(duì)象。
javax.crypto 接口 SecretKey
javax.crypto.Cipher 此類為加密和解密提供密碼功能。它構(gòu)成了 Java Cryptographic Extension (JCE) 框架的核心
public final void init(int opmode,Key key)
public final byte[] doFinal(byte[] input) 按單部分操作加密或解密數(shù)據(jù),或者結(jié)束一個(gè)多部分操作
java.security.KeyPairGenerator
static KeyPairGenerator getInstance(String algorithm)
回生成指定算法的 public/private 密鑰對(duì)的 KeyPairGenerator 對(duì)象。
java.security.Signature
使用 Signature 對(duì)象簽名數(shù)據(jù)或驗(yàn)證簽名包括以下三個(gè)階段:
1:初始化,使用
初始化驗(yàn)證簽名的公鑰(請(qǐng)參見 initVerify),或使用
初始化簽署簽名的私鑰(也可以選擇“安全隨機(jī)數(shù)生成器”)initSign(PrivateKey)和initSign(PrivateKey, SecureRandom))。
2:更新
根據(jù)初始化類型,這可更新要簽名或驗(yàn)證的字節(jié)。請(qǐng)參見 update 方法。
3:簽署或驗(yàn)證所有更新字節(jié)的簽名。請(qǐng)參見 sign 方法和 verify 方法。 超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的java 加密解密简单实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。