javades,java的三種基本結構

本文目錄一覽:

java des 加密 解密 密鑰隨機取得方法

java DES 加密 解密 生成隨機密鑰

舉例說明:

//保存生成的key

public static void saveDesKey() {

try {

SecureRandom sr = new SecureRandom();

// 選擇的DES演算法生成一個KeyGenerator對象

KeyGenerator kg = KeyGenerator.getInstance(“DES”);

kg.init(sr);

// 相對路徑 需要新建 conf 文件夾

// String fileName = “conf/DesKey.xml”;

// 絕對路徑

String fileName = “d:/DesKey.xml”;

FileOutputStream fos = new FileOutputStream(fileName);

ObjectOutputStream oos = new ObjectOutputStream(fos);

// 生成密鑰

Key key = kg.generateKey();

oos.writeObject(key);

oos.close();

} catch (Exception e) {

e.printStackTrace();

}

}

//獲取生成的key

public static Key getKey() {

Key kp = null;

try {

// 相對路徑 需要新建 conf 文件夾

// String fileName = “conf/DesKey.xml”;

// InputStream is = Encrypt.class.getClassLoader().getResourceAsStream(fileName);

// 絕對路徑

String fileName = “d:/DesKey.xml”;

FileInputStream is = new FileInputStream(fileName);

ObjectInputStream oos = new ObjectInputStream(is);

kp = (Key) oos.readObject();

oos.close();

} catch (Exception e) {

e.printStackTrace();

}

return kp;

}

//加密開始

public static void encrypt(String file, String dest) throws Exception {

Cipher cipher = Cipher.getInstance(“DES”);

cipher.init(Cipher.ENCRYPT_MODE, getKey());

InputStream is = new FileInputStream(file);

OutputStream out = new FileOutputStream(dest);

CipherInputStream cis = new CipherInputStream(is, cipher);

byte[] buffer = new byte[1024];

int r;

while ((r = cis.read(buffer)) 0) {

out.write(buffer, 0, r);

}

cis.close();

is.close();

out.close();

}

//解密開始

public static void decrypt(String file, String dest) throws Exception {

Cipher cipher = Cipher.getInstance(“DES”);

cipher.init(Cipher.DECRYPT_MODE, getKey());

InputStream is = new FileInputStream(file);

OutputStream out = new FileOutputStream(dest);

CipherOutputStream cos = new CipherOutputStream(out, cipher);

byte[] buffer = new byte[1024];

int r;

while ((r = is.read(buffer)) = 0) {

cos.write(buffer, 0, r);

}

cos.close();

out.close();

is.close();

}

}

//des加密主方法

public class DES {

public static void main(String[] args) throws Exception {

Encrypt.saveDesKey();

System.out.println(“生成key”);

Encrypt.getKey();

System.out.println(“獲取key”);

Encrypt.encrypt(“d:\\hello.txt”, “d:\\encrypt.txt”);

System.out.println(“加密”);

Encrypt.decrypt(“d:\\encrypt.txt”, “d:\\decrypt.txt”);

System.out.println(“解密”);

}

以上方法親測可用。

java des加密,密鑰的長度是多少

3des演算法是指使用雙長度(16位元組)密鑰k=(kl||kr)將8位元組明文數據塊進行3次des加密/解密。如下所示:

y

=

des(kl)[des-1(kr)[des(kl[x])]]

解密方式為:

x

=

des-1

(kl)[des

(kr)[

des-1

(kl[y])]]

其中,des(kl[x])表示用密鑰k對數據x進行des加密,des-1

(kl[y])表示用密鑰k對數據y進行解密。

sessionkey的計算採用3des演算法,計算出單倍長度的密鑰。表示法為:sk

=

session(dk,data)

3des加密演算法為:

void

3des(byte

doublekeystr[16],

byte

data[8],

byte

out[8])

{

byte

buf1[8],

buf2[8];

des

(doublekeystr[0],

data,

buf1);

udes(doublekeystr[8],

buf1,

buf2);

des

(doublekeystr[0],

buf2,

out);

}

Java和.NET使用DES對稱加密的區別

沒有區別,DES只是加密的一種演算法,Java與.NET語言中只是對這種演算法的實現,所以兩者是沒有任何區別的。演算法與密鑰本來就是分開的,演算法本來就是公開的,語言只是對這種演算法的實現而已,在這種情況下DES與語言沒有任何相關性,只有自己的演算法標準。

但很多人反映的Java中的DES/TDES與.NET中的DES/TDES不通用,其實並不存在這樣的問題的。兩者是幾乎完全通用的。所以沒有存在不通用的情況的。

由於語言的實現基於自己的習慣與理解上的不同,不同的語言採用了不同的默認參數(默認值),當然,就算在同種語言下,這些參數不同的時加密與解密也會有所不同的(只會默認默認參數就認為不通用的那些人,真想不通這個問題怎麼提出來的)。

事實上DES除了一個key與iv(初始向量)必須保證相同外,還有對加密的不同解釋參數,如mode與paddingmode。DES加密是是塊加密的一種,在處理塊級與未尾塊級時,有不同的方式(mode)如電子密碼本(CBC)之類的,每個參數有不同的加密行為與意義,當然這只是DES加密標準的一部分,並不能獨立出去的。paddingMode則是則塊加密當最後一個塊不足時的填充方式。而在java與net實現加密或解密時都遵從標準,實現了不同的填充方式以供選擇。但由於每個語言的默認值不同,如net中cbc是默認值,而Java中則是另外一個,填充方式的默認值也不相同,所以會出現不設計這兩個參數時,在java與net通信時無法正確解密。所謂的不Java與net中DES不同,僅僅只是默認參數不同,如果你能正確設置這兩個參數,幾乎任何語言中DES加密與解密都是通用的(部分語言中並沒有全部實現DES中的標準,所以可能會出現特定語言的某種加密方式無法在另一種語言中解析)。

所以,DES本身沒有任何區別,他只是一個標準(你家交流電與他家交流電有什麼區別?),對於不同的實現必須依賴於此標準實現,所以DES標準本身而言是相同的。如果說DES在Java與NET中的類庫實現有什麼區別,那麼兩種語言類庫完全沒可比性(兩個人有什麼區別,一張嘴兩隻眼睛的標準外,怕是沒有相同之處了),而對於DES實現支持上,兩者也是幾乎相同,Java與net均實現了DES標準全部的規範。

最後想說的是,加密學中只介紹DES,並不說在不同語言中的實現,因為任何語言實現都依賴於相同的DES加解密演算法。我覺得這個問題應該問成「在DES在java中與NET中實現的類庫默認值有什麼不同」才對。

如何使用JAVA實現對字元串的DES加密和解密

java加密字元串可以使用des加密演算法,實例如下:

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

*/

public class CryptTest {

/**

* 進行MD5加密

*

* @param info

* 要加密的信息

* @return String 加密後的字元串

*/

public String encryptToMD5(String info) {

byte[] digesta = null;

try {

// 得到一個md5的消息摘要

MessageDigest alga = MessageDigest.getInstance(“MD5”);

// 添加要進行計算摘要的信息

alga.update(info.getBytes());

// 得到該摘要

digesta = alga.digest();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

// 將摘要轉為字元串

String rs = byte2hex(digesta);

return rs;

}

/**

* 進行SHA加密

*

* @param info

* 要加密的信息

* @return String 加密後的字元串

*/

public String encryptToSHA(String info) {

byte[] digesta = null;

try {

// 得到一個SHA-1的消息摘要

MessageDigest alga = MessageDigest.getInstance(“SHA-1”);

// 添加要進行計算摘要的信息

alga.update(info.getBytes());

// 得到該摘要

digesta = alga.digest();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

// 將摘要轉為字元串

String rs = byte2hex(digesta);

return rs;

}

// //////////////////////////////////////////////////////////////////////////

/**

* 創建密匙

*

* @param algorithm

* 加密演算法,可用 DES,DESede,Blowfish

* @return SecretKey 秘密(對稱)密鑰

*/

public SecretKey createSecretKey(String algorithm) {

// 聲明KeyGenerator對象

KeyGenerator keygen;

// 聲明 密鑰對象

SecretKey deskey = null;

try {

// 返回生成指定演算法的秘密密鑰的 KeyGenerator 對象

keygen = KeyGenerator.getInstance(algorithm);

// 生成一個密鑰

deskey = keygen.generateKey();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

// 返回密匙

return deskey;

}

/**

* 根據密匙進行DES加密

*

* @param key

* 密匙

* @param info

* 要加密的信息

* @return String 加密後的信息

*/

public String encryptToDES(SecretKey key, String info) {

// 定義 加密演算法,可用 DES,DESede,Blowfish

String Algorithm = “DES”;

// 加密隨機數生成器 (RNG),(可以不寫)

SecureRandom sr = new SecureRandom();

// 定義要生成的密文

byte[] cipherByte = null;

try {

// 得到加密/解密器

Cipher c1 = Cipher.getInstance(Algorithm);

// 用指定的密鑰和模式初始化Cipher對象

// 參數:(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)

c1.init(Cipher.ENCRYPT_MODE, key, sr);

// 對要加密的內容進行編碼處理,

cipherByte = c1.doFinal(info.getBytes());

} catch (Exception e) {

e.printStackTrace();

}

// 返回密文的十六進位形式

return byte2hex(cipherByte);

}

/**

* 根據密匙進行DES解密

*

* @param key

* 密匙

* @param sInfo

* 要解密的密文

* @return String 返回解密後信息

*/

public String decryptByDES(SecretKey key, String sInfo) {

// 定義 加密演算法,

String Algorithm = “DES”;

// 加密隨機數生成器 (RNG)

SecureRandom sr = new SecureRandom();

byte[] cipherByte = null;

try {

// 得到加密/解密器

Cipher c1 = Cipher.getInstance(Algorithm);

// 用指定的密鑰和模式初始化Cipher對象

c1.init(Cipher.DECRYPT_MODE, key, sr);

// 對要解密的內容進行編碼處理

cipherByte = c1.doFinal(hex2byte(sInfo));

} catch (Exception e) {

e.printStackTrace();

}

// return byte2hex(cipherByte);

return new String(cipherByte);

}

// /////////////////////////////////////////////////////////////////////////////

/**

* 創建密匙組,並將公匙,私匙放入到指定文件中

*

* 默認放入mykeys.bat文件中

*/

public void createPairKey() {

try {

// 根據特定的演算法一個密鑰對生成器

KeyPairGenerator keygen = KeyPairGenerator.getInstance(“DSA”);

// 加密隨機數生成器 (RNG)

SecureRandom random = new SecureRandom();

// 重新設置此隨機對象的種子

random.setSeed(1000);

// 使用給定的隨機源(和默認的參數集合)初始化確定密鑰大小的密鑰對生成器

keygen.initialize(512, random);// keygen.initialize(512);

// 生成密鑰組

KeyPair keys = keygen.generateKeyPair();

// 得到公匙

PublicKey pubkey = keys.getPublic();

// 得到私匙

PrivateKey prikey = keys.getPrivate();

// 將公匙私匙寫入到文件當中

doObjToFile(“mykeys.bat”, new Object[] { prikey, pubkey });

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

}

/**

* 利用私匙對信息進行簽名 把簽名後的信息放入到指定的文件中

*

* @param info

* 要簽名的信息

* @param signfile

* 存入的文件

*/

public void signToInfo(String info, String signfile) {

// 從文件當中讀取私匙

PrivateKey myprikey = (PrivateKey) getObjFromFile(“mykeys.bat”, 1);

// 從文件中讀取公匙

PublicKey mypubkey = (PublicKey) getObjFromFile(“mykeys.bat”, 2);

try {

// Signature 對象可用來生成和驗證數字簽名

Signature signet = Signature.getInstance(“DSA”);

// 初始化簽署簽名的私鑰

signet.initSign(myprikey);

// 更新要由位元組簽名或驗證的數據

signet.update(info.getBytes());

// 簽署或驗證所有更新位元組的簽名,返回簽名

byte[] signed = signet.sign();

// 將數字簽名,公匙,信息放入文件中

doObjToFile(signfile, new Object[] { signed, mypubkey, info });

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 讀取數字簽名文件 根據公匙,簽名,信息驗證信息的合法性

*

* @return true 驗證成功 false 驗證失敗

*/

public boolean validateSign(String signfile) {

// 讀取公匙

PublicKey mypubkey = (PublicKey) getObjFromFile(signfile, 2);

// 讀取簽名

byte[] signed = (byte[]) getObjFromFile(signfile, 1);

// 讀取信息

String info = (String) getObjFromFile(signfile, 3);

try {

// 初始一個Signature對象,並用公鑰和簽名進行驗證

Signature signetcheck = Signature.getInstance(“DSA”);

// 初始化驗證簽名的公鑰

signetcheck.initVerify(mypubkey);

// 使用指定的 byte 數組更新要簽名或驗證的數據

signetcheck.update(info.getBytes());

System.out.println(info);

// 驗證傳入的簽名

return signetcheck.verify(signed);

} catch (Exception e) {

e.printStackTrace();

return false;

}

}

/**

* 將二進位轉化為16進位字元串

*

* @param b

* 二進位位元組數組

* @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();

}

/**

* 十六進位字元串轉化為2進位

*

* @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;

}

/**

* 將兩個ASCII字元合成一個位元組; 如:”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;

}

/**

* 將指定的對象寫入指定的文件

*

* @param file

* 指定寫入的文件

* @param objs

* 要寫入的對象

*/

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();

}

}

}

/**

* 返回在文件中指定位置的對象

*

* @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;

}

/**

* 測試

*

* @param args

*/

public static void main(String[] args) {

CryptTest jiami = new CryptTest();

// 執行MD5加密”Hello world!”

System.out.println(“Hello經過MD5:” + jiami.encryptToMD5(“Hello”));

// 生成一個DES演算法的密匙

SecretKey key = jiami.createSecretKey(“DES”);

// 用密匙加密信息”Hello world!”

String str1 = jiami.encryptToDES(key, “Hello”);

System.out.println(“使用des加密信息Hello為:” + str1);

// 使用這個密匙解密

String str2 = jiami.decryptByDES(key, str1);

System.out.println(“解密後為:” + str2);

// 創建公匙和私匙

jiami.createPairKey();

// 對Hello world!使用私匙進行簽名

jiami.signToInfo(“Hello”, “mysign.bat”);

// 利用公匙對簽名進行驗證。

if (jiami.validateSign(“mysign.bat”)) {

System.out.println(“Success!”);

} else {

System.out.println(“Fail!”);

}

}

}

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/196403.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-03 09:56
下一篇 2024-12-03 09:56

相關推薦

  • Python基本索引用法介紹

    Python基本索引是指通過下標來獲取列表、元組、字元串等數據類型中的元素。下面將從多個方面對Python基本索引進行詳細的闡述。 一、列表(List)的基本索引 列表是Pytho…

    編程 2025-04-29
  • Python基本數字類型

    本文將介紹Python中基本數字類型,包括整型、布爾型、浮點型、複數型,並提供相應的代碼示例以便讀者更好的理解。 一、整型 整型即整數類型,Python中的整型沒有大小限制,所以可…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟體。在VB中,有許多不同的方法可以運行程序,包括編譯器、發布程序以及命令行。在本文中…

    編程 2025-04-29
  • Vue TS工程結構用法介紹

    在本篇文章中,我們將從多個方面對Vue TS工程結構進行詳細的闡述,涵蓋文件結構、路由配置、組件間通訊、狀態管理等內容,並給出對應的代碼示例。 一、文件結構 一個好的文件結構可以極…

    編程 2025-04-29
  • Python基本統計量計算

    本文將從多個方面詳細介紹Python中基本統計量計算的方法。 一、均值 均值是一組數據的平均值,也就是將所有數據相加後再除以數據個數。 在Python中,可以使用numpy庫中的m…

    編程 2025-04-29
  • Python程序的三種基本控制結構

    控制結構是編程語言中非常重要的一部分,它們指導著程序如何在不同的情況下執行相應的指令。Python作為一種高級編程語言,也擁有三種基本的控制結構:順序結構、選擇結構和循環結構。 一…

    編程 2025-04-29
  • Python三種基本輸入元素

    本文將從多個方面對於Python三種基本輸入元素進行詳細的闡述並給出代碼示例。 一、Python三種基本輸入元素解答 Python三種基本輸入元素包括命令行參數、標準輸入和文件輸入…

    編程 2025-04-28
  • Lidar避障與AI結構光避障哪個更好?

    簡單回答:Lidar避障適用於需要高精度避障的場景,而AI結構光避障更適用於需要快速響應的場景。 一、Lidar避障 Lidar,即激光雷達,通過激光束掃描環境獲取點雲數據,從而實…

    編程 2025-04-27
  • Python基本操作:從入門到精通

    Python是一個功能強大的編程語言,有著簡單易學的語法和廣泛的用途。本篇文章將以Python基本操作為主要內容,從多個方面介紹Python的常用操作和技巧,幫助你快速學會Pyth…

    編程 2025-04-27
  • Switch C:多選結構的利器

    在編寫程序時,我們經常需要根據某些條件執行不同的代碼,這時就需要使用選擇結構。在C語言中,有if語句、switch語句等多種選擇結構可供使用。其中,switch語句是一種非常強大的…

    編程 2025-04-25

發表回復

登錄後才能評論